转载请注明出处:

  @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.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服务,处理响应结果并返回给前端。

使用 @GrpcClient 实现客户端的更多相关文章

  1. gRPC-微服务间通信实践

    微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) 场景:A服务主动发起 ...

  2. .net core集成使用consul

    快速启动一个consul集群可以参考:使用docker快速部署一个consul集群 .net core集成使用consul是通过consul提供出来api接口来实现的,可以分成两个部分来说明:配置集成 ...

  3. grpc(三)之grpc客户端使用连接池

    本文使用commons-pool2来实现连接池应用 1.定义一个产生连接池的工厂,需要继承BasePooledObjectFactory,其用处是生产和销毁连接池中保存的对象.根据需求,现在池子里保存 ...

  4. gprc-java与golang分别实现服务端,客户端,跨语言通信(一.java实现)

    1.在pom中引入 <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty< ...

  5. gRPC负载均衡(客户端负载均衡)

    前言 上篇介绍了如何使用etcd实现服务发现,本篇将基于etcd的服务发现前提下,介绍如何实现gRPC客户端负载均衡. gRPC负载均衡 gRPC官方文档提供了关于gRPC负载均衡方案Load Bal ...

  6. GRpc添加客户端的四种方式

    随着微服务的发展,相信越来越多的.net人员也开始接触GRpc这门技术,大家生成GRpc客户端的方式也各不相同,今天给大家介绍一下依据Proto文件生成Rpc客户端的四种方式 前提:需要安装4个Nug ...

  7. java版gRPC实战之四:客户端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. java版gRPC实战之六:客户端动态获取服务端地址

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. 使用Golang搭建gRPC服务提供给.NetCore客户端调用

    目录 gRPC概述 RPC gRPC又是什么呢 安装 Golang IDE(Goland) Protocol Buffer 下载Protocal Buffer 配置Protocal Buffer编译器 ...

  10. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

随机推荐

  1. AIR32F103(十) 在无系统环境和FreeRTOS环境集成LVGL

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

  2. subline Text 设置中文

    subline Text是一个轻量级的文本编辑器,类似于记事本,不过它拥有代码高亮,简约好看的主题. 下载地址:https://download.sublimetext.com/sublime_tex ...

  3. Android笔记--基础的连接数据库的操作

    start.java package com.example.myapplication; import androidx.activity.result.ActivityResult; import ...

  4. Linux0.11源码学习(四)

    Linux0.11源码学习(四) linux0.11源码学习笔记 参考资料: https://github.com/sunym1993/flash-linux0.11-talk https://git ...

  5. 声网AI降噪测评系统初探

    作者:孟赛斯 前言 音频质量的优化是一个复杂的系统工程,而降噪是这个系统工程中的一个重要环节,传统的降噪技术经过几十年的发展已经陷入了瓶颈期,尤其是对非平稳噪声的抑制越来越不能满足新场景的需求.而近几 ...

  6. Mybatis模糊查询的两种方式

    第一种 使用 || 字符: ** ** 第二种 使用 CONCAT 函数: ** ** 温馨提醒: 当然你也可以使用 $符 ,但是这种方式会导致不安全,让非法分子有机可寻,轻则数据库瘫痪,重则数据泄露 ...

  7. 音质效果不错的Pcie声卡之CM8828听歌声卡

    CM8828芯片是cmedia骅讯公司生产的,采用这个芯片的声卡价格不一,便宜的100多,贵一点的500多.价位在100多买到这款声卡还是比较实惠的,再高一点的声卡都是堆料的.CM8828声卡是原生的 ...

  8. 单元测试Mockito框架

    单元测试Mockito框架 Mock 测试就是在测试过程中,对于某些 不容易构造(如 HttpServletRequest 必须在 Servlet 容器中才能构造出来)或者不容易获取 比较复杂 的对象 ...

  9. AllenBradley罗克韦尔CIP通信协议介绍 C# AllenBradley(CIP)读写操作PLC数据 C#罗克韦尔(CIP)PLC通信 全开源下载

    罗克韦尔CIP通信协议(Control and Information Protocol)是一种面向对象的通信协议,它是用于工业自动化领域的数据通信协议.CIP协议可以在不同厂商.不同类型的自动化设备 ...

  10. python之中文符号转英文符号

    maketrans内置方法, 可以将中文符号转换为英文符号.以下代码中,事先定义(中文符号)和其对应的(英文符号),也就是定义中文符号, 也要有对应的英文符号,否则会报错.这个功能其实和替换功能差不多 ...