grpc入门(二)

一. 目标

  本博文要介绍的是编写 grpc入门(一)中所提到的四种rpc的方式,然后通过命令行和eclipse两种方式生成对应的java代码,关于grpc是什么东西本文不再赘述。

二. proto文件的编写

  声明:如下所编写的proto文件没有实际的业务价值,只是为了技术而谈技术,望大神勿键下留情,如有错误之处,欢迎留言指正。

  protocol buffers的官网为:https://developers.google.com/protocol-buffers/, 以下的proto文件的版本为proto3,文件名为 rpc_demo.proto。

syntax = "proto3";  //指定该proto文件所采用的语法

package com.test.netty.proto;  //定义proto文件的包,可以不用指定

//指定proto文件生成的java类的包,可以不用指定,如果没有指定,将采用package的值
option java_package = "com.test.netty.proto"; /**
* 指定生产的java类的名字,如果没有指定,将使用proto文件的文件名作为类名.
* 如果文件名为 contact_address.proto, 生成的类名为ContactAddress.java
*/
option java_outer_classname = "MyDemo"; /**
* 当为true的时候,表示将所有的message各自生成在一个java文件中;
* 当为false的时候,将所有的内容生成在同一个文件中
*/
option java_multiple_files = true; /**
* 指定服务,客户端和服务端的stub, 服务端需要实现接口,客户端直接调用该接口。
*/
service Demo {
/**
* 指定方法,必须以rpc开头,方法名(GetUserById)按照官网所给出的示例代码,均是大写,所以我们也按照这种方式定义。
* MyRequest为方法的参数,必须指定,并且必须为message类型。
* MyResponse为方法的返回类型,必须制定,并且必须为message类型。
*/
rpc GetUserById(MyRequest) returns (MyResponse); rpc GetInfos(InfoRequest) returns (InfoResponse); //请求的参数为流
rpc Greeting(stream GreetRequest) returns (GreetResponse); //返回的数据为流
rpc GetPeoplesByName(PeopleRequest) returns (stream PeopleList); //请求参数和返回参数都为流
rpc GetStudents(stream StudentRequest) returns (stream StudentList);
} /**
* 定义message
*/
message MyResponse {
string realname = ;
} message MyRequest {
int32 id = ;
} message InfoRequest {
string msg = ;
} //该message没有任何实用意义,只是为了演示数据类型
message Info {
int32 age = ;
string name = ;
bool flag = ;
map<int64, string> others = ;
} message InfoResponse {
repeated Info infos = ;
} message GreetRequest {
string name = ;
} message GreetResponse {
string msg = ;
string date = ;
} message PeopleRequest {
string name = ;
} message People {
int32 age = ;
string name = ;
float height = ;
double money = ;
bool isMarried = ;
} message PeopleList {
repeated People peoples = ;
} message StudentRequest {
map<string, string> infos = ;
} message Student {
string name = ;
int32 score = ;
} message StudentList {
repeated Student students = ;
}

三. 生成代码

3.1 通过命令行的方式

  下载protoc的工具,下载地址为: https://github.com/google/protobuf/releases,根据对应的PC平台选择3.0以上的版本下载,本博文下载的版本为3.5.1,然后配置环境变量。

  下载生成Java代码的插件,地址为: http://maven.aliyun.com/nexus/content/groups/public/io/grpc/protoc-gen-grpc-java/1.8.0/,笔者将下载的protoc-gen-grpc-java-1.8.0-windows-x86_64.exe 文件放在D盘的src目录下,将rpc_demo也放在该D盘的rpc目录下,如下图所示:

  打开dos命令行,进入到D:/src目录下,先执行命令:protoc  --java_out=d:/src rpc_demo.proto,生产对应的序列化文件;

  然后再执行命令:protoc --plugin=protoc-gen-grpc-java=d:/src/protoc-gen-grpc-java-1.8.0-windows-x86_64.exe --grpc-java_out=d:/src/ rpc_demo.proto, 如下图所示:

  然后就回看到在D盘的src目录下生成一个com的文件夹,表示我们已经成功的生成了对应的java文件。注:笔者之前用protoc3.4.1,插件版本为gen-java的版本为1.7.0的时候,只用执行最后一条命令。

3.1 使用maven的方式

  新建一个maven工程,目录结构如下图所示:

  pom.xml文件的配置参考地址:https://github.com/grpc/grpc-java,例如笔者的配置如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.test</groupId>
<artifactId>grpc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>grpc</name>
<url>http://maven.apache.org</url> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> <dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies> <build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.5.0.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<!-- 指定proto文件的位置 -->
<protoSourceRoot>src/main/protos</protoSourceRoot>
<!-- 生成java文件的位置 -->
<outputDirectory>src/main/java</outputDirectory>
<!-- 生成java文件的时候,是否清除掉整个目录下所有的内容,切记,这个地方一定要配置成false,
曾经在这里将之前的代码全部清除掉了。
-->
<clearOutputDirectory>false</clearOutputDirectory>
<protocArtifact>com.google.protobuf:protoc:3.5.1-1:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.8.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

  运行maven的test命令或者其他的命令,就回生成对应的Java代码。

  

grpc的更多相关文章

  1. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  2. gRPC源码分析2-Server的建立

    gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...

  3. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  4. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  5. gRPC .NET Core跨平台学习

    前些天发布gRPC C# 学习,在.NET Framework 中使用gRPC ,今天来学习 .NET Core gRPC. gRPC 的.NET Core 包在NuGet 上发布了,结合.NET C ...

  6. gRPC C#学习

    前些天gRPC 发布1.0 版本,代表着gRPC 已经正式进入稳定阶段. 今天我们就来学习gRPC C# .而且目前也已经支持.NET Core 可以实现完美跨平台. 传统的.NET 可以通过Mono ...

  7. .net core 用grpc实现微服务

    GRPC 是Google发布的一个开源.高性能.通用RPC(Remote Procedure Call)框架.提供跨语言.跨平台支持.以下以.NET Core 使用控制台.docker中演示如何使用G ...

  8. rpc框架之gRPC 学习 - hello world

    grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...

  9. Android开发笔记之《远程控制(MQTT|mosquitto) && (ProtocalBuffer | GRPC)》

    Android推送方案分析(MQTT/XMPP/GCM): http://www.open-open.com/lib/view/open1410848945601.htmlMQTT官网: http:/ ...

  10. gRPC+etcd的优势分析

    相比webService等可跨平台,跨语言的服务相比,gRPC更增加了以下优势 1.可以采用二进制传输,速度更快 (使用TCP传输层,而不是Http2应用层) 2.集群服务,统一注册,可靠性高( 好的 ...

随机推荐

  1. 小白的Python之路 day1 变量

    Python之路,Day1 - Python基础1 变量 变量用于存储在计算机程序中引用和操作的信息.它们还提供了一种用描述性名称标记数据的方法,这样我们的程序就能更清晰地被读者和我们自己理解.将变量 ...

  2. HTMLCSS实现左侧固定宽度右侧内容可滚动

    在做移动端页面的时候,经常会碰到一个div中分左右两个div,左侧div固定宽度或百分比,右侧div中内容左右溢出,需要左右滑动才可以浏览到全部内容,为此写了一个demo. 处理这个问题的核心关键点是 ...

  3. Backtrack无线攻防(很任性的一篇)

    首先你得有一个backtrack操作系统 然后还得花钱买一个无线网卡,最好是Intel的,还有要是USB接口的,可能是因为其他接口我不会接.

  4. Android 四大组件学习之ContentProvider四

    上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. wa ...

  5. HDOJ 4251 The Famous ICPC Team Again

    划分树水题..... The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 3276 ...

  6. HTTP响应状态码含义参考

    1xx:信息 100 Continue服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求.101 Switching Protocols服务器转换协议:服务器将遵从客 ...

  7. JavaScript导航树

    JS导航树 整理之前的小代码片段,放到博客,便于以后完善查看: 该JS导航树实际效果,[GSP+社区网站专题课程页面导航树]地址:http://gsp.inspur.com/knowledge/zhu ...

  8. 自学Zabbix3.10.1.2-事件通知Notifications upon events-媒介类型SMS

    自学Zabbix3.10.1.2-事件通知Notifications upon events-媒介类型SMS 服务器安装串口GSM短信猫之后,zabbix可以使用它来发送短信通知给管理员,如下注意事项 ...

  9. Unable to resolve persistence unit root URL

    异常信息 时间:2017-03-07 11:46:05,516 - 级别:[ WARN] - 消息: [other] The web application [ROOT] appears to hav ...

  10. Python 项目实践二(生成数据)第一篇

    上面那个小游戏教程写不下去了,以后再写吧,今天学点新东西,了解的越多,发现python越强大啊! 数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是使用代码来探索数据集的 ...