Springboot集成GRPC
- 一、springboot版本
- 二、GRPC的pom依赖
-
- [2.1 服务端](#2.1 服务端)
- [2.2 客户端](#2.2 客户端)
- 3.构建依赖
- 三、配置文件
- [四、 demo](#四、 demo)
-
- [4.1 编写proto文件](#4.1 编写proto文件)
- [4.2 生成文件](#4.2 生成文件)
- [4.3 服务端重写方法](#4.3 服务端重写方法)
- [4.4 客户端调用该方法](#4.4 客户端调用该方法)
- 五、测试
一、springboot版本
java
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
二、GRPC的pom依赖
2.1 服务端
xml
<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 客户端
xml
<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.构建依赖
xml
<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配置:
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:
xml
// 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 服务端重写方法
java
@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 客户端调用该方法
java
@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。
验证成功!!!!