首页 > 其他分享 >使用 @GrpcClient 实现客户端

使用 @GrpcClient 实现客户端

时间:2023-05-21 23:01:05浏览次数:24  
标签:java UserRequest 实现 GrpcClient gRPC 客户端 grpc

转载请注明出处:

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

 

标签:java,UserRequest,实现,GrpcClient,gRPC,客户端,grpc
From: https://www.cnblogs.com/zjdxr-up/p/17419408.html

相关文章

  • 03、Etcd 客户端常用命令
    上一讲我们安装etcd服务端,这一讲我们来一起学学如何使用etcd客户端常见的命令。文章内容来源于参考资料,如若侵权,请联系删除,谢谢。etcd可通过客户端命令行工具etcdctl对etcd进行请求操作#帮助命令,会列出所有的命令和选项,在记不太清命令的时候,可以使用etcdctl‐h#......
  • 加餐-基于Transformer实现中译英(tf2.x)
    1.项目概述本实例使用Transformer这个强大的特征提取工具,把英文翻译成中文。具体步骤先构建Transorformer架构,然后训练模型、评估模型,最后使用几个英文语句测试模型效果。为便于训练,这里训练数据仅使用使用TensorFlow2上的wmt19_translate/zh-en数据集中新闻评论部分(newscommen......
  • HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
     最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用实现代码如下: publicstaticStringgetResponseText(StringqueryUrl,Stringhost,Stringip){//queryUrl,完整的u......
  • PaddleOCR+OpenCV实现文字识别步骤
    本期将介绍并演示PaddleOCR+Python+OpenCV实现车牌识别、身份证信息识别和车票信息识别的步骤与效果。介绍百度深度学习框架PaddlePaddle开源的OCR项目PaddleOCR近期霸榜github。使用测试后发现识别效果很好,对于简单的应用(车票车牌身份证等),直接用项目提供的模型即可使用。特殊应......
  • HTML5 + WebGL 实现的垃圾分类系统
    前言垃圾分类,一般是指按一定规定或标准将垃圾分类储存、分类投放和分类搬运,从而转变成公共资源的一系列活动的总称。分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用。垃圾在分类储存阶段属于公众的私有品,垃圾经公众分类投放后成为公众所在小区或社区的区域性准公共资源,垃圾......
  • 基于 HTML5 + WebGL 实现的垃圾分类系统
    前言垃圾分类,一般是指按一定规定或标准将垃圾分类储存、分类投放和分类搬运,从而转变成公共资源的一系列活动的总称。分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用。垃圾在分类储存阶段属于公众的私有品,垃圾经公众分类投放后成为公众所在小区或社区的区域性准公共资源,垃圾......
  • 基于pytorch实现模型剪枝
    所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差(weigths/bias)的模型压缩技术。本文深入描述了pytorch框架的几种剪枝API,包括函数功能和参数定义,并给出示例代码。一,剪枝分类1.1,非结构化剪枝1.2,结构化剪枝1.3,本地与全局修剪二,PyTorch的剪枝2.1,pytorch......
  • chatGpt的基本实现
       首先,对于我要求的工作,gpt完美胜任,那么问题来了,怎么调用chatgpt,是可以免费调用的,但需要keyword,也就得进入chatgpt官网,就得用外网,但是要它的api应用到android上,外网手段就不可取了,于是,准备冲别人搭建的平台上调用,很幸运的是,在B站上还真的找到资源,up主也很好,教我一步一实现......
  • 2023/5/21每日随笔 调用chatgpt接口实现项目的基本需要
    首先,对于我要求的工作,gpt完美胜任,那么问题来了,怎么调用chatgpt,是可以免费调用的,但需要keyword,也就得进入chatgpt官网,就得用外网,但是要它的api应用到android上,外网手段就不可取了,于是,准备冲别人搭建的平台上调用,很幸运的是,在B站上还真的找到资源,up主也很好,教我一步一实现,搭建了以......
  • 网络编辑的使用和知识点,进程线程之间实现交互
    软件开放的框架c/s架构c就是Client客户端就是要去请求数据的s就是Server服务端就是给客服端根据客户的要求提供数据的服务端的必备条件时刻提供服务等待客服端的访问有一个固定的地址能够接受多个服务端的请求(高并发)B/s架构B就是Browser就是一个浏览器充当所有服务端......