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. loadrunner录制脚本(一) ----录制脚本打不开浏览器

    loadrunner安装参考百度上的,或者有已经准备好的安装文档. 安装好了之后,用 HP Virtual Generator 录制脚本. 在上述操作中,需要选择火狐浏览器的exe文件驱动.也可以选择 ...

  2. webStorm和Sublime使用列编辑命令

    webStorm可以像Sublime一样使用列编辑,只是区别在于webStorm只可以编辑连续列表. 按住alt键鼠标选择一列,然后输入文字就会编辑多行,这个功能很赞,比较实用(按住ALT键选中之后, ...

  3. 我的Android进阶之旅------&gt;Android知识图谱

    Android知识图谱.快来看看哪方面有漏洞? 该图转自:http://blog.csdn.net/xyz_lmn/article/details/41411355

  4. 【swift-总结】函数

    swift的函数在swift2中的使用改变了不少 /** *param: personName 參数 *returns: String为返回值 */ func sayHello(personName: ...

  5. ArtDialog V6的简单使用

    artDialog v6 -- 经典的网页对话框组件,内外皆用心雕琢. 兼容性 測试通过:IE6~IE11.Chrome.Firefox.Safari.Opera 授权协议 免费,且开源.基于LGPL ...

  6. JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...

  7. linux应用态下的时间

    1.时间值 1.1 日历时间(UTC) 该值是自1 9 7 0年1月1日0 0 : 0 0 : 0 0以来国际标准时间( U T C)所经过的秒数累计值(早期的手册称 U T C为格林尼治标准时间) ...

  8. 机器学习 - pycharm, tensorflow集成篇

    继续上篇的pyspark集成后,我们再来看看当今热的不得了的tensorflow是如何继承进pycharm环境的 参考: http://blog.csdn.net/include1224/articl ...

  9. Natas Wargame Level27 Writeup(SQL表的注入/溢出与截取)

    前端: <html> <head> <!-- This stuff in the header has nothing to do with the level --&g ...

  10. 《计算机程序的构造和解释(第2版)》【PDF】下载

    <计算机程序的构造和解释(第2版)>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230382255 内容简介 <计算机程序的构造 ...