1. gRPC SpringBoot选型
gRPC官方并未提供gRPC Spring Boot的相关代码库,
(资料图片仅供参考)
在github中搜索grpc spring boot,最受欢迎的代码库如下图:
选择第一个开源仓库https://github.com/yidongnan/grpc-spring-boot-starter,
该代码库由国人大神创建,并附有中文文档。
接下来介如何集成该grpc-spring-boot-starter,
本文讲解的示例源码可参见:https://gitee.com/luoex/grpc-demo - grpc-spring-boot模块
2. 基础依赖
本示例依赖之前文章《gRPC Java入门示例》中的proto定义及基础代码,即源码中的grpc-base模块。
3. maven依赖
<!-- gRPC springboot依赖(包含grpc-server-spring-boot-starter、grpc-client-spring-boot-starter)--><dependency> <groupId>net.devh</groupId> <artifactId>grpc-spring-boot-starter</artifactId> <version>2.13.1.RELEASE</version></dependency>
4. gRPC Server端编码
服务端配置application.yaml:
spring: application: name: grpc-sb-servergrpc: # grpc server相关配置 server: # 启动端口 port: 9898
服务端服务自动注册:
实现对应的gRPC服务后通过@GrpcService注解进行注册即可。
注:@GrpcService组合@Service注解
启动springboot应用后即可自动暴露gRPC端口及服务。
5. gRPC Client端编码
客户端配置application.yaml:
server: port: 8080spring: application: name: grpc-sb-client# grpc配置grpc: # grpc clienT相关配置 client: # 服务名(不同服务名可对应不同配置) grpc-sb-server: # 服务端地址 address: "static://127.0.0.1:9898" # 是否开启保持连接(长连接) 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
客户端stub自动注入:
通过@GrpcClient即可自动注入对应的Stub,
@GrpcClient.value即对应配置文件中的Channel名称{name},
即对应application.yaml中的grpc.client.grpc-sb-server下的配置。
启动springboot应用后即可自动创建gRPC服务的stub客户端。
6. grpc-spring-boot-starter源码分析
结合开源仓库https://github.com/yidongnan/grpc-spring-boot-starter源码,
看看gRPC Server端和Client端是如何在springboot中集成启动的。
6.1 grpc-server-spring-boot-starter启动过程
查看maven依赖可以发现grpc-spring-boot-starter依次引入:
-> grpc-server-spring-boot-starter -> grpc-server-spring-boot-autoconfigure
查看grpc-server-spring-boot-autoconfigure的spring.factories文件内容如下:
如上图中的
即为gRPC Server端的服务注册及启动的主要配置类,
gRPC Server端配置属性类参见:GrpcServerProperties
首先扫描所有@GrpcService注解修饰的服务实现类定义,生成GrpcServiceDiscoverer。
然后生成ShadedNettyGrpcServerFactory,factory包含所有@GrpcService服务定义及配置属性
最后注册GrpcServerLifecycle,即通过spring lifecycle自动启动gRPC Server端。
6.2 grpc-client-spring-boot-starter启动过程
查看maven依赖可以发现grpc-spring-boot-starter依次引入:
-> grpc-client-spring-boot-starter -> grpc-client-spring-boot-autoconfigure
查看grpc-client-spring-boot-autoconfigure的spring.factories文件内容如下:
如上图中的
即为gRPC Client端启动的主要配置类,
gRPC Client端配置属性类参见:GrpcChannelsProperties
首先扫描所有@GrpcClient修饰的field和set方法,生成对应的gRPC Stub注入。
通过反射获取@GrpcClient修饰的field,然后:
根据@GrpcClient.value对应的grpc.client.{name}对应服务端配置创建channel根据field类型生成对应的gRPC stub对象创建GrpcChannelFactory。
参考:
https://github.com/yidongnan/grpc-spring-boot-starter
点击关注,带你了解更多