grpc入門(二)

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代碼。

相關文章
相關標籤/搜索