maoyunfei / grpc-java-demo

demo project for grpc-java

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

grpc-java-demo

本项目是一个使用gRPC的Java实例项目。

下面将一步步介绍本项目的构建过程,以详解对gRPC的使用方法。

第一步:定义服务

新建模块grpc-java-proto用于服务定义。

在模块的pom.xml中添加需要的依赖。

<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-netty</artifactId>
  <version>1.11.0</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-protobuf</artifactId>
  <version>1.11.0</version>
</dependency>
<dependency>
  <groupId>io.grpc</groupId>
  <artifactId>grpc-stub</artifactId>
  <version>1.11.0</version>
</dependency>

添加插件protobuf-maven-plugin用于代码生成。

<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.1</version>
      <configuration>
        <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.11.0:exe:${os.detected.classifier}</pluginArtifact>
      </configuration>
      <executions>
        <execution>
          <goals>
            <goal>compile</goal>
            <goal>compile-custom</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

gRPC协议使用的数据传输格式是protocol buffers

src/main下面建立proto目录,protobuf-maven-plugin默认会扫描该目录以生成java文件。

新建helloworld.protoproto3的具体用法请查看链接文档。

关于proto语法的一些说明:

  • 可选的package说明符:避免多个消息类型的名称冲突,在指定了package之后,引用时需要带上package

     package foo.bar;
     message Open { ... }
    
     message Foo {
       ...
       foo.bar.Open open = 1;
       ...
     }
    

在Java中,除非在.proto文件中明确提供了optional java_package,否则该package将用作Java包。

一些常用的option

  • java_package:要用于生成的Java类的包。如果在.proto文件不指定java_package,默认使用.proto文件中的package

     option java_package = "com.example.foo";
    
  • java_multiple_files:导致在包级别定义顶级消息,枚举和服务,而不是以.proto文件命名的类中。

     option java_multiple_files = true;
    
  • java_outer_classname:要生成的最外层Java类的类名。如果在.proto文件不指定java_outer_classname,类名将通过将.proto文件名转换为驼峰风格来构造(foo_bar.proto对应于 FooBar.java)。

     option java_outer_classname = "Ponycopter";
    
  • optimize_for:可以设置为SPEED,CODE_SIZELITE_RUNTIME,它影响代码生成的方式,默认是SPEED

     option optimize_for = SPEED;
    
  • deprecated :如果设置为true,则表示该字段已弃用且不应被新代码使用,在Java中会变成@Deprecated注解。

     int32 old_field = 6 [deprecated=true];
    

第二步、写服务器

新建grpc-java-server模块,并提供实现类GretterImpl实现GreeterGrpc.Greeter接口。另外提供一个gRPC服务器,监听来自客户端的请求并返回服务的响应。

第二步、写客户端

新建grpc-java-client模块,提供gRPC客户端来调用服务。

About

demo project for grpc-java


Languages

Language:Shell 41.2%Language:Batchfile 31.8%Language:Java 27.0%