Springboot集成GRPC
- 一、springboot版本
- 二、GRPC的pom依赖
- 2.1 服务端
- 2.2 客户端
- 3.构建依赖
- 三、配置文件
- 服务端
- 客户端
- 四、 demo
- 4.1 编写proto文件
- 4.2 生成文件
- 4.3 服务端重写方法
- 4.4 客户端调用该方法
- 五、测试
一、springboot版本
<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version>
二、GRPC的pom依赖
2.1 服务端
<grpc.version>1.51.0</grpc.version><dependencies><!-- gRPC 依赖 --><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-core</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-api</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>net.devh</groupId><artifactId>grpc-server-spring-boot-starter</artifactId><version>2.14.0.RELEASE</version></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-bom</artifactId><version>3.21.9</version><type>pom</type></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.21.9</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protoc --><dependency><groupId>com.google.protobuf</groupId><artifactId>protoc</artifactId><version>3.21.9</version><type>pom</type></dependency></dependencies>
2.2 客户端
<grpc.version>1.51.0</grpc.version><dependencies><!-- gRPC 依赖 --><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty-shaded</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-core</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-api</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency><!-- grpc 客户端 --><dependency><groupId>net.devh</groupId><artifactId>grpc-client-spring-boot-starter</artifactId><version>2.14.0.RELEASE</version></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-bom</artifactId><version>3.21.9</version><type>pom</type></dependency><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.21.9</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protoc --><dependency><groupId>com.google.protobuf</groupId><artifactId>protoc</artifactId><version>3.21.9</version><type>pom</type></dependency></dependencies>
3.构建依赖
<build><!--grpc proto文件编译插件--><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>1.6.2</version></extension></extensions><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!--grpc proto文件编译插件--><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>0.6.1</version><configuration><!-- 设置 protoc 的版本 --><protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact><!-- 设置插件的版本 --><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:1.34.1:exe:${os.detected.classifier}</pluginArtifact><!-- 设置输出目录 --><outputDirectory>${project.basedir}/src/main/java</outputDirectory><!-- 设置proto文件所在目录 --><protoSourceRoot>${project.basedir}/src/main/resources</protoSourceRoot><!-- 是否清除输出目录 --><clearOutputDirectory>false</clearOutputDirectory></configuration><executions><execution><goals><!-- 执行 protobuf 编译和 gRPC 插件 --><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins></build>
三、配置文件
服务端
- 配置grpc的端口号即可,不配默认端口号是9090.
客户端
yaml配置:
# grpc配置
grpc:# grpc clienT相关配置client:# 服务名(不同服务名可对应不同配置)# ms-zeu是服务端配置的名字,GrpcClient注解会用到ms-zeus:# gRPC服务端地址# address: 'dns://127.0.0.1:19898'address: 'static://127.0.0.1:19090'# 是否开启保持连接(长连接)enableKeepAlive: true# 保持连接时长(默认20s)keepAliveTimeout: 20s# 没有RPC调用时是否保持连接(默认false,可禁用避免额外消耗CPU)keepAliveWithoutCalls: false# 客户端负载均衡策略(round_robin(默认), pick_first)defaultLoadBalancingPolicy: round_robin# 通信类型# plaintext | plaintext_upgrade | tls# 明文通信且http/2 | 明文通信且升级http/1.1为http/2 | 使用TLS(ALPN/NPN)通信negotiationType: plaintext
如下图所示:
四、 demo
4.1 编写proto文件
eg:
// proto 文件放在 src/main/proto 目录下
// 指定使用 proto3 语法
syntax = "proto3";option java_generic_services = true;
// 生成的 Java 代码将被拆分为多个文件
option java_multiple_files = true;
// 指定生成的 Java 代码所在的包
option java_package = "cn.zqm.api";// 定义接口
service Greeter {// 定义方法rpc SayHello (HelloRequest) returns (HelloReply) {}
}// 定义入参格式
message HelloRequest {string name = 1;
}// 定义出参格式
message HelloReply {string data;string message = 1;int32 code;
}
proto3语法详情见:
4.2 生成文件
点击api中的compile,自动生成右侧的jar包。
客户端和服务端同时生成。
4.3 服务端重写方法
@Service
public class HelloService {//和本项目中配置文件名一致即可@GrpcClient("ms-zeus")private GreeterGrpc.GreeterBlockingStub simpleStub;public void testHello(){HelloRequest helloRequest = HelloRequest.newBuilder().setName("1").build();HelloReply helloReply = simpleStub.sayHello(helloRequest);System.out.println();}
}
4.4 客户端调用该方法
@Service
public class HelloService {//和本项目中配置文件名一致即可@GrpcClient("ms-zeus")private GreeterGrpc.GreeterBlockingStub simpleStub;public void testHello(){HelloRequest helloRequest = HelloRequest.newBuilder().setName("1").build();HelloReply helloReply = simpleStub.sayHello(helloRequest);System.out.println();}
}
五、测试
编写http接口进行测试:
结果应该是我们自定义生成的hello。
验证成功!!!!