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



点击关注,带你了解更多

推荐内容