目录
一、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
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, StreamObserverresponseObserver) { 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(); } }