使用 @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 依赖项:
- <dependency>
- <groupId>net.devh</groupId>
- <artifactId>grpc-client-spring-boot-starter</artifactId>
- <version>2.12.0.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>io.grpc</groupId>
- <artifactId>grpc-netty-shaded</artifactId>
- <version>1.37.0</version>
- </dependency>
- <dependency>
- <groupId>io.grpc</groupId>
- <artifactId>grpc-protobuf</artifactId>
- <version>1.37.0</version>
- </dependency>
- <dependency>
- <groupId>io.grpc</groupId>
- <artifactId>grpc-stub</artifactId>
- <version>1.37.0</version>
- </dependency>
并添加一下插件:
- <build>
- <plugins>
- <plugin>
- <groupId>org.xolstice.maven.plugins</groupId>
- <artifactId>protobuf-maven-plugin</artifactId>
- <version>0.6.1</version>
- <executions>
- <execution>
- <goals>
- <goal>compile</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <protocArtifact>com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}</protocArtifact>
- <pluginId>grpc-java</pluginId>
- <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.30.2:exe:${os.detected.classifier}</pluginArtifact>
- <outputDirectory>${project.build.directory}/generated-sources/protobuf/java</outputDirectory>
- <clearOutputDirectory>false</clearOutputDirectory>
- <includeCompileClasspath>true</includeCompileClasspath>
- </configuration>
- </plugin>
- </plugins>
- </build>
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.java
和UserResponse.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服务,处理响应结果并返回给前端。
使用 @GrpcClient 实现客户端的更多相关文章
- gRPC-微服务间通信实践
微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) 场景:A服务主动发起 ...
- .net core集成使用consul
快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...
- grpc(三)之grpc客户端使用连接池
本文使用commons-pool2来实现连接池应用 1.定义一个产生连接池的工厂,需要继承BasePooledObjectFactory,其用处是生产和销毁连接池中保存的对象.根据需求,现在池子里保存 ...
- gprc-java与golang分别实现服务端,客户端,跨语言通信(一.java实现)
1.在pom中引入 <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty< ...
- gRPC负载均衡(客户端负载均衡)
前言 上篇介绍了如何使用etcd实现服务发现,本篇将基于etcd的服务发现前提下,介绍如何实现gRPC客户端负载均衡. gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Bal ...
- GRpc添加客户端的四种方式
随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的四种方式 前提:需要安装4个Nug ...
- java版gRPC实战之四:客户端流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 使用Golang搭建gRPC服务提供给.NetCore客户端调用
目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编译器 ...
- 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付
前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...
随机推荐
- pat乙级自我回顾:一般错误出现原因
在obsidian里面写的有些引用没用,需要的可以评论区或者私信我呦~ 对于错误,末尾的换行不影响格式, 段错误: 一般是设置的数组小于题目给定的要求,循环条件i--写成i++,数组下标写错,也有可能 ...
- 脏牛-Linux内核提权
漏洞范围 下载地址:https://github.com/FireFart/dirtycow 有一点可以在意,dirty.c内置在了kali中,使用命令searchsploit dirty可以搜索 也 ...
- 思必驰周强:AI 和传统信号技术在实时音频通话中的应用
如何用 AI 解决声音传输&处理中的三大问题?三大问题又是哪三大问题? 在「RTE2022 实时互联网大会」中,思必驰研发总监 @周强以<AI 和传统信号技术在实时音频通话中的应用> ...
- IDEA-日志管理神器
Grep Console-插件的好处就在于能使控制台输出日志时,可以直接修改插件中定义好的规则,也可以根据自己定义的规则,输出不同的颜色.这样就可以将错误信息标记成显眼的颜色,方便查看,提高bug寻找 ...
- Gin中间件middleware
类型 全局中间件 单个路由中间件 群组中间件 Reference
- EasyRelation发布,简单强大的数据关联框架
当开发人员需要进行关联查询时,往往需要编写大量的冗余代码来处理数据之间的关系.这不仅浪费时间和精力,还会影响项目的可维护性和可扩展性. EasyRelation 是一个简单.高效的自动关联数据框架,可 ...
- Linux线程同步必知,常用方法揭秘!
一.为什么要线程同步 在Linux 多线程编程中,线程同步是一个非常重要的问题.如果线程之间没有正确地同步,就会导致程序出现一些意外的问题,例如: 竞态条件(Race Condition):多个线程同 ...
- selenium验证码处理之机器学习(光学识别ocr技术获取验证码的数据)
ocr识别库地址: https://github.com/UB-Mannheim/tesseract/wiki 遇到的问题:百度的解释------------------- 遇到的问题2:
- Ubuntu 通过 Netplan 配置网络教程
Ubuntu 通过 Netplan 配置网络教程 Ubuntu through Netplan configuration network tutorial 一.Netplan 配置流程 1. Net ...
- python之zipfile应用
zipfile Python 中 zipfile 模块提供了对 zip 压缩文件的一系列操作. 1 f=zipfile.ZipFile("test.zip",mode=" ...