目录
一、gRPC 整合 SpringBoot
1.1、创建项目
1.2、前置配置
1.3、api 开发
1.4、server 开发
1.5、client 开发
1.6、演示效果

a)protoc 版本如下:(上章节讲过如何配置)

Ps:此处的版本一定要和后面的依赖、构建插件一一对应起来,否则生成的 Java 的文件有问题.
b)api 中的 proto 文件夹(名字必须是 proto,目录位置不能变!)

a)
依赖如下:
io.grpc grpc-netty-shaded1.51.0 runtime io.grpc grpc-protobuf1.51.0 io.grpc grpc-stub1.51.0 org.apache.tomcat annotations-api6.0.53 provided
构建脚本如下(这里一定要和 protoc 版本对应起来,否则生成的 Java 文件有问题):
kr.motd.maven os-maven-plugin1.7.1 org.xolstice.maven.plugins protobuf-maven-plugin0.6.1 com.google.protobuf:protoc:3.21.7:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:1.52.0:exe:${os.detected.classifier} ${basedir}/src/main/java false compile compile-custom org.apache.maven.plugins maven-compiler-plugin17 17
b)proto 文件如下
syntax = "proto3";
option java_multiple_files = false;
option java_package = "com.cyk";
option java_outer_classname = "HelloProto";
service HelloService {
rpc hello(HelloRequest) returns(HelloResponse) {};
}
message HelloRequest {
string msg = 1;
}
message HelloResponse {
string result = 1;
}
a)pom.xml 文件如下:
com.cyk api1.0-SNAPSHOT net.devh grpc-server-spring-boot-starter2.14.0.RELEASE
b )配置文件如下:
spring:
application:
name: boot_server
# 不启动 Tomcat 容器: server 这边只需要提供gRPC远程调用服务即可
# ,Tomcat 这种 Web 服务用不上启动反而浪费额外资源和端口
main:
web-application-type: none
# gRPC 启动端口
grpc:
server:
port: 9000
c)创建一个类,添加 @GrpcService 注解(注入容器中,表示它是一个 proto 文件中描述的 service 的实现类),让他继承对应的 Base 接口,重写 proto 文件中提供 service 下的方法即可.
@GrpcService
public class HelloService extends HelloServiceGrpc.HelloServiceImplBase {
@Override
public void hello(HelloProto.HelloRequest request, StreamObserver responseObserver) {
String msg = request.getMsg();
System.out.println("收到客户端请求: " + msg);
HelloProto.HelloResponse response = HelloProto.HelloResponse
.newBuilder()
.setResult("ok!")
.build();
responseObserver.onNext(response);
responseObserver.onCompleted();
}
}
a)pom.xml 文件如下:
org.springframework.boot spring-boot-starter-webcom.cyk api1.0-SNAPSHOT net.devh grpc-client-spring-boot-starter2.14.0.RELEASE
b)配置文件如下:
spring:
application:
name: boot-client
grpc:
client:
grpc-server: # 自定义服务名
address: 'static://127.0.0.1:9000' # 调用 gRPC 的地址
negotiation-type: plaintext # 明文传输
c)通过 @GrpcClient 注解注入我们所需的代理对象(下面以阻塞式为例)
@RestController
public class HelloController {
@GrpcClient("grpc-server")
private HelloServiceGrpc.HelloServiceBlockingStub stub;
@RequestMapping("/hello")
public String hello(String msg) {
HelloProto.HelloRequest request = HelloProto.HelloRequest
.newBuilder()
.setMsg(msg)
.build();
HelloProto.HelloResponse response = stub.hello(request);
return response.getResult();
}
}


