正井猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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

  

posted on 2018-01-09 00:21  正井猫  阅读(4071)  评论(0编辑  收藏  举报