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 = 1; } message MyRequest { int32 id = 1; } message InfoRequest { string msg = 1; } //该message没有任何实用意义,只是为了演示数据类型 message Info { int32 age = 1; string name = 2; bool flag = 3; map<int64, string> others = 4; } message InfoResponse { repeated Info infos = 1; } message GreetRequest { string name = 1; } message GreetResponse { string msg = 1; string date = 2; } message PeopleRequest { string name = 1; } message People { int32 age = 1; string name = 2; float height = 3; double money = 4; bool isMarried = 5; } message PeopleList { repeated People peoples = 1; } message StudentRequest { map<string, string> infos = 1; } message Student { string name = 1; int32 score = 2; } message StudentList { repeated Student students = 1; }
三. 生成代码
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代码。