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. 数据库文件*.sdf文件定时备份,但是大小的增量在不断增长的问题排查

    在某项目上,使用SQL Server数据库,现场反馈每天定时备份数据库文件,每天的数据量是400多个申请单的量.之前每天增长量是50M,但是后来两天增长量是80M,每天的数据量差不多. 到底从什么地方 ...

  2. ssh服务、密钥登陆配置

    环境内核信息: [root@zabbix-01 ~]# uname -a Linux lodboyedu-01 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:2 ...

  3. Qt音乐播放器制作(二)Easy Player

    两天没有公布新的动态.主要原因还是个人的生活和工作时间限制,如今赶晚贴出第二版. 先放个图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFuNV9y ...

  4. 什么是PMI

    项目管理协会 PMI PMI是世界领先的非盈利会员协会的项目管理专业机构 ,在全球185个国家有70多万会员和证书持有人.此外,PMI还是多个英文短语的缩写,较为著名的是采购经理指数PMI. 项目管理 ...

  5. 五.RabbitMQ之路由(Routing)和主题(topics)

    翻译官网的文章已经翻译了几天了,这份官方文档写的总体算是很简洁易懂.它让我们很快的入门并了解了RabbitMQ的运作原理和使用方式.本篇最后介绍一下Exchange的另外两种类别,即direct和to ...

  6. SSM学习(三)--集成spring mvc

    spirng mvc是一个mvc框架,与struts2类似,都是基于Servlet封装而成的框架,所以要了解spring mvc或者struts2比需先了解Servlet,本篇我们先把spring m ...

  7. 【转载】Android Studio 导入External Libraries

    转载: 世军  Android Studio 导入External Libraries http://www.cnblogs.com/shijunzhang/p/5625432.html 导入本地Li ...

  8. 第一安装oracle数据库后,需要创建一个用户,给用户解锁并赋予权限

    1.第一次安装oracle数据库应该做的事情. 注: 1.安装oracle后需要创建用户,连接数据库,(注意数据库名,还有好像后面的 ":"也有影响) 2.解锁用户, 3.授予新登 ...

  9. 微信小程序——轮播图实现

    小程序的轮播图,也就是他其中的一个控件可以算是直接上代码: 这是WXML 页面 代码: <view class='carousel_div'> <swiper class=" ...

  10. 《奇思妙想:15位计算机天才及其重大发现》【PDF】下载

    <奇思妙想:15位计算机天才及其重大发现>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196328 内容简介 本书介绍了15位当代 ...