zoukankan      html  css  js  c++  java
  • grpc入门(二)

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

      

  • 相关阅读:
    linux 查看僵尸进程
    apache 修改最大连接数
    ng压缩后,形参被简化问题解决:
    $rootScope 与 $scope 区别:$rootScope对象是“单例的”——一个模块中只有一个$rootScope;
    vue+webpack在“双十一”导购产品的技术实践
    过滤指令:number currency lowercase(转为小写)/uppercase(转为大写)
    ng-show ng-disabled ng-show ng-hide 值的布尔值改变时,状态发生变化
    二,数据双向绑定
    一、angular:module-Controller-Model-View (模块-控制器-模型-视图);异步请求$http
    5、面向对象
  • 原文地址:https://www.cnblogs.com/miller-zou/p/8245201.html
Copyright © 2011-2022 走看看