gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!)
作者:mmseoamin日期:2024-04-27

目录

一、gRPC 整合 SpringBoot

1.1、创建项目

1.2、前置配置

1.3、api 开发

1.4、server 开发

1.5、client 开发

1.6、演示效果


一、gRPC 整合 SpringBoot


1.1、创建项目

gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!),第1张

  • api:编写 proto 文件(message 和 service),生成 Java 代码.
  • client:引入 api 模块,客户端,通过 stub 代理对 server 进行远程调用.
  • server:引入 api 模块,服务端,实现 proto 文件中描述 service,为 client 提供服务.

    1.2、前置配置

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

    gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!),第2张

    Ps:此处的版本一定要和后面的依赖、构建插件一一对应起来,否则生成的 Java 的文件有问题.

    b)api 中的 proto 文件夹(名字必须是 proto,目录位置不能变!)

    gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!),第3张

    1.3、api 开发

    a)

    依赖如下:

        
            
                io.grpc
                grpc-netty-shaded
                1.51.0
                runtime
            
            
                io.grpc
                grpc-protobuf
                1.51.0
            
            
                io.grpc
                grpc-stub
                1.51.0
            
             
                org.apache.tomcat
                annotations-api
                6.0.53
                provided
            
        
       

    构建脚本如下(这里一定要和 protoc 版本对应起来,否则生成的 Java 文件有问题):

     
            
                
                    kr.motd.maven
                    os-maven-plugin
                    1.7.1
                
            
            
                
                    org.xolstice.maven.plugins
                    protobuf-maven-plugin
                    0.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-plugin
                    
                        17
                        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;
    }
    

    1.4、server 开发

    a)pom.xml 文件如下:

        
            
                com.cyk
                api
                1.0-SNAPSHOT
            
            
                net.devh
                grpc-server-spring-boot-starter
                2.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();
        }
    }
    

    1.5、client 开发

    a)pom.xml 文件如下:

        
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                com.cyk
                api
                1.0-SNAPSHOT
            
            
                net.devh
                grpc-client-spring-boot-starter
                2.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();
        }
    }
    

    1.6、演示效果

    gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!),第4张

    gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!),第5张

    gRPC - gRPC 整合 SpringBoot(全代码 + 避坑!),第6张