• 使用 @GrpcClient 实现客户端


    转载请注明出处:

      @GrpcClient 注解的作用是将 gRPC 客户端注入到 Spring 容器中,方便在应用程序中使用 gRPC 客户端调用 gRPC 服务提供的函数。使用 @GrpcClient 注解,我们可以像使用其他 Spring Bean 一样来使用 gRPC 客户端,无需手动创建连接通道和 stub 类对象,Spring Boot 会自动为我们进行管理和维护。

      使用 @GrpcClient 注解的场景通常是在 Spring Boot 中使用 gRPC 客户端时,因为 Spring Boot 已经为我们提供了自动配置功能,可以简化 gRPC 客户端的配置和使用。在这种场景下,我们只需要在应用程序中添加 @GrpcClient 注解,然后在配置文件中添加 gRPC 客户端的配置信息,就可以方便地使用 gRPC 客户端了。

      另外,@GrpcClient 注解还可以指定 gRPC 服务的名称,以区分不同的 gRPC 服务。这对于在同一个应用程序中使用多个 gRPC 服务时非常有用,可以避免不同的 gRPC 服务之间发生冲突。例如:

    @GrpcClient("greeter")
    private GreeterGrpc.GreeterBlockingStub greeterStub;
    @GrpcClient("calculator")
    private CalculatorGrpc.CalculatorBlockingStub calculatorStub;

      在上述示例中,我们分别为 greeter 和 calculator 两个 gRPC 服务创建了不同的 stub 类对象,并使用了不同的 @GrpcClient 注解来区分它们。

    以下是一个完整的使用@GrpcClient注解的使用代码:

    1.配置maven相关依赖

      gRPC客户端使用一下命令添加 Maven 依赖项:

    复制代码
    
        net.devh
        grpc-client-spring-boot-starter
        2.12.0.RELEASE
    
    
      io.grpc
      grpc-netty-shaded
      1.37.0
    
    
      io.grpc
      grpc-protobuf
      1.37.0
    
    
      io.grpc
      grpc-stub
      1.37.0
    
    复制代码

      并添加一下插件:

    复制代码
    
        
            
                org.xolstice.maven.plugins
                protobuf-maven-plugin
                0.6.1
                
                    
                        
                            compile
                        
                    
                
                
                    com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}
                    grpc-java
                    io.grpc:protoc-gen-grpc-java:1.30.2:exe:${os.detected.classifier}
                    ${project.build.directory}/generated-sources/protobuf/java
                    false
                    true
                
            
        
    
    复制代码

     

    2.添加proto文件:

    复制代码
    syntax = "proto3";
    package com.example.grpcdemo.service;
    option java_multiple_files = true;
    option java_package = "com.example.grpcdemo.service";
    option java_outer_classname = "UserServiceProto";
    message UserRequest {
        string name = 1;
        int32 age = 2;
    }
    message UserResponse {
        string message = 1;
    }
    service UserService {
        rpc addUser (UserRequest) returns (UserResponse);
        rpc deleteUser (UserRequest) returns (UserResponse);
        rpc updateUser (UserRequest) returns (UserResponse);
        rpc getUser (UserRequest) returns (UserResponse);
    }
    复制代码

      执行mvn clean install命令即可将proto文件编译成Java类并生成到target/generated-sources/protobuf/java目录下。 编译后的Java类包括服务类、消息类和客户端类。以本例中的proto文件为例,编译后的Java类如下:

    • 服务类:UserServiceGrpc.java
    • 消息类:UserRequest.javaUserResponse.java
    • 客户端类:UserServiceGrpc.UserServiceBlockingStub.java 接下来,我们可以使用@GrpcClient注解将UserServiceGrpc.UserServiceBlockingStub类型的gRPC客户端注入到Spring Bean中。

    3.使用@GrpcClient实现服务端  

      示例代码如下:

    复制代码
    @Component
    public class UserGrpcClient {
        @GrpcClient("user-service-provider") // 指定gRPC服务在配置中的服务名
        private UserServiceGrpc.UserServiceBlockingStub userService;
        public void addUser(UserRequest request) {
            UserResponse response = userService.addUser(request);
            // 处理响应结果
        }
    }
    复制代码

      在这个例子中,我们使用@GrpcClient注解将UserServiceGrpc.UserServiceBlockingStub类型的gRPC客户端注入到了Spring Bean中,并在addUser()方法中使用该gRPC客户端访问远程gRPC服务。需要注意的是,在使用@GrpcClient注解时,需要指定gRPC服务的服务名。

    4.配置文件中配置grpc的配置信息

      配置文件中配置 grpcClient 相关的配置

    复制代码
    grpc:
      client:
        user-service-provider:
          address: localhost            # gRPC服务地址
          port: 6565
          plaintext: true                # 指定是否使用明文连接;
          enableKeepAlive: true            # 是否启用KeepAlive机制
          keepAliveTime: 30s            # KeepAlive时间
          keepAliveTimeout: 5s              # 是否在没有gRPC调用时保持KeepAlive的连接
    复制代码

    5.客户端调用

      在应用程序中,使用UserGrpcClient类访问gRPC服务,示例代码如下:

    复制代码
    import com.example.grpcdemo.service.UserRequest;
    import com.example.grpcdemo.service.UserResponse;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    public class UserController {
        @Autowired
        private UserGrpcClient userGrpcClient;
        
        @RequestMapping("/addUser")
        public String addUser(UserRequest request) {
            UserResponse response = userGrpcClient.addUser(request);
            return response.getMessage();
        }
    }
    复制代码

      在这个例子中,我们在UserController中注入了UserGrpcClient,并在addUser()方法中使用该客户端访问远程gRPC服务,处理响应结果并返回给前端。

     

  • 相关阅读:
    系统架构师--面向对象选择题
    Lepton 无损压缩原理及性能分析
    HTML快速入门
    IO流-数据流
    VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)
    正则表达式:掌握文本处理的秘密武器
    基于单片机智能防触电装置的研究与设计
    c++多线程
    Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取
    java数据结构与算法刷题-----LeetCode108:将有序数组转换为二叉搜索树
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/17419408.html