Java-grpc demo
使用maven创建一个Java grpc Demo
环境:win10 1903 + idea2019.1 + jdk1.8
综述:
- 使用maven创建grpc demo
- protobuf 和 json 互转
- json中bytes数据的使用
在pom文件中添加依赖
在idea中新建一个空的maven项目,然后在pom文件中添加grpc相关依赖项,然后idea会弹窗提示依赖包导入方式,选自动导入
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 添加grpc相关依赖包 -->
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.2.0</version>
</dependency>
</dependencies>
<!-- proto自动生成java文件所需的编译插件 -->
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.4.1.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.2.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
编写proto文件
这个demo使用两个proto文件:service_api.proto和service.proto,service_api.proto里定义两个message,rpc服务定义在service.proto中,两个文件的内容分别如下:
service_api.proto
//指定proto3格式
syntax = "proto3";
//一些生成代码的设置
option java_multiple_files = false;//以非外部类模式生成
option java_package = "com.service.test";//所在包名
//option java_outer_classname = "Grpc";//最外层类名称
package com.service.test;
message UnaryRequest{
string serviceName = 1;
string methodName = 2;
bytes data = 3;
string request_id = 4;//参数默认都为可选,如果没有赋值,那么接口中不会出现该参数,不会默认为null之类的
}
message UnaryResponse{
string serviceName = 1;
string methodName = 2;
bytes data = 3;
string request_id = 4;
}
service.proto
//指定proto3格式
syntax = "proto3";
//一些生成代码的设置
option java_multiple_files = false;//以非外部类模式生成
option java_package = "com.service.test";//所在包名
//option java_outer_classname = "Gr