经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
使用 @GrpcClient 实现客户端
来源:cnblogs  作者:香吧香  时间:2023/5/22 8:48:19  对本文有异议

转载请注明出处:

  @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 服务之间发生冲突。例如:

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

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

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

1.配置maven相关依赖

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

  1. <dependency>
  2. <groupId>net.devh</groupId>
  3. <artifactId>grpc-client-spring-boot-starter</artifactId>
  4. <version>2.12.0.RELEASE</version>
  5. </dependency>
  6. <dependency>
  7.   <groupId>io.grpc</groupId>
  8.   <artifactId>grpc-netty-shaded</artifactId>
  9.   <version>1.37.0</version>
  10. </dependency>
  11. <dependency>
  12.   <groupId>io.grpc</groupId>
  13.   <artifactId>grpc-protobuf</artifactId>
  14.   <version>1.37.0</version>
  15. </dependency>
  16. <dependency>
  17.   <groupId>io.grpc</groupId>
  18.   <artifactId>grpc-stub</artifactId>
  19.   <version>1.37.0</version>
  20. </dependency>

  并添加一下插件:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.xolstice.maven.plugins</groupId>
  5. <artifactId>protobuf-maven-plugin</artifactId>
  6. <version>0.6.1</version>
  7. <executions>
  8. <execution>
  9. <goals>
  10. <goal>compile</goal>
  11. </goals>
  12. </execution>
  13. </executions>
  14. <configuration>
  15. <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>
  16. <pluginId>grpc-java</pluginId>
  17. <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.30.2:exe:${os.detected.classifier}</pluginArtifact>
  18. <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
  19. <clearOutputDirectory>false</clearOutputDirectory>
  20. <includeCompileClasspath>true</includeCompileClasspath>
  21. </configuration>
  22. </plugin>
  23. </plugins>
  24. </build>

 

2.添加proto文件:

  1. syntax = "proto3";
  2. package com.example.grpcdemo.service;
  3. option java_multiple_files = true;
  4. option java_package = "com.example.grpcdemo.service";
  5. option java_outer_classname = "UserServiceProto";
  6. message UserRequest {
  7. string name = 1;
  8. int32 age = 2;
  9. }
  10. message UserResponse {
  11. string message = 1;
  12. }
  13. service UserService {
  14. rpc addUser (UserRequest) returns (UserResponse);
  15. rpc deleteUser (UserRequest) returns (UserResponse);
  16. rpc updateUser (UserRequest) returns (UserResponse);
  17. rpc getUser (UserRequest) returns (UserResponse);
  18. }

  执行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实现服务端  

  示例代码如下:

  1. @Component
  2. public class UserGrpcClient {
  3. @GrpcClient("user-service-provider") // 指定gRPC服务在配置中的服务名
  4. private UserServiceGrpc.UserServiceBlockingStub userService;
  5. public void addUser(UserRequest request) {
  6. UserResponse response = userService.addUser(request);
  7. // 处理响应结果
  8. }
  9. }

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

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

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

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

5.客户端调用

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

  1. import com.example.grpcdemo.service.UserRequest;
  2. import com.example.grpcdemo.service.UserResponse;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class UserController {
  8. @Autowired
  9. private UserGrpcClient userGrpcClient;
  10. @RequestMapping("/addUser")
  11. public String addUser(UserRequest request) {
  12. UserResponse response = userGrpcClient.addUser(request);
  13. return response.getMessage();
  14. }
  15. }

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

 

原文链接:https://www.cnblogs.com/zjdxr-up/p/17419408.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号