grpc入門(二)java
一. 目標git
本博文要介紹的是編寫 grpc入門(一)中所提到的四種rpc的方式,而後經過命令行和eclipse兩種方式生成對應的java代碼,關於grpc是什麼東西本文再也不贅述。github
二. proto文件的編寫apache
聲明:以下所編寫的proto文件沒有實際的業務價值,只是爲了技術而談技術,望大神勿鍵下留情,若有錯誤之處,歡迎留言指正。windows
protocol buffers的官網爲:https://developers.google.com/protocol-buffers/, 如下的proto文件的版本爲proto3,文件名爲 rpc_demo.proto。eclipse
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; }
三. 生成代碼maven
3.1 經過命令行的方式工具
下載protoc的工具,下載地址爲: https://github.com/google/protobuf/releases,根據對應的PC平臺選擇3.0以上的版本下載,本博文下載的版本爲3.5.1,而後配置環境變量。ui
下載生成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目錄下,以下圖所示:google
打開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代碼。