【gRPC实现java端调用go的服务】

实现一个客户端调用go服务端的简单服务

1.项目结构如下

在这里插入图片描述
在lib下面的存在一个simple.proto文件,我们使用插件protobuf-maven-plugin对其进行编译。配置如下:

 <properties><os-maven-plugin.version>1.5.0.Final</os-maven-plugin.version><protobuf-maven-plugin.version>0.5.1</protobuf-maven-plugin.version><protoc.version>3.5.1-1</protoc.version><protobuf.version>3.6.0</protobuf.version><grpc.version>1.13.1</grpc.version></properties><dependencies><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>${protobuf.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-netty</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-protobuf</artifactId><version>${grpc.version}</version></dependency><dependency><groupId>io.grpc</groupId><artifactId>grpc-stub</artifactId><version>${grpc.version}</version></dependency></dependencies><build><extensions><extension><groupId>kr.motd.maven</groupId><artifactId>os-maven-plugin</artifactId><version>${os-maven-plugin.version}</version></extension></extensions><plugins><plugin><groupId>org.xolstice.maven.plugins</groupId><artifactId>protobuf-maven-plugin</artifactId><version>${protobuf-maven-plugin.version}</version><configuration><protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact><pluginId>grpc-java</pluginId><pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact></configuration><executions><execution><goals><goal>compile</goal><goal>compile-custom</goal></goals></execution></executions></plugin></plugins></build>

利用插件进行编译

后可以获得对应的文件。
在这里插入图片描述

2. Client

在client下创建一个grpc的包,并将以上两个文件放入。最后创建一个SimpleClient。

package com.iq50.client.grpc;import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.concurrent.TimeUnit;/*** gRPC客户端示例*/
public class SimpleClient {// gRPC通信通道private final ManagedChannel channel;// 自动生成的存根private final SimpleGrpc.SimpleBlockingStub blockingStub;/*** 构造函数,创建SimpleClient实例* @param host 服务器主机名* @param port 服务器端口*/public SimpleClient(String host, int port){this(ManagedChannelBuilder.forAddress(host, port).usePlaintext());}/*** 私有构造函数,接受ManagedChannelBuilder参数* @param channelBuilder 通道构建器*/private SimpleClient(ManagedChannelBuilder<?> channelBuilder) {// 构建通信通道channel = channelBuilder.build();// 根据通道返回的信息创建存根blockingStub = SimpleGrpc.newBlockingStub(channel);}/*** 关闭通信通道* @throws InterruptedException 线程中断异常*/public void shutdown() throws InterruptedException {// 关闭通道并等待最多5秒钟确保关闭完成channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);}/*** 向gRPC服务发送问候消息* @param name 问候消息的名称* @return 服务响应的消息*/public String sayHello(String name) {// 创建HelloRequest对象SimpleOuterClass.HelloRequest req = SimpleOuterClass.HelloRequest.newBuilder().setName(name).build();// 调用服务方法获取响应SimpleOuterClass.HelloReplay replay = blockingStub.sayHello(req);// 返回服务响应的消息return replay.getMessage();}
}

最后在Application中调用即可

package com.iq50.client;import com.iq50.client.grpc.SimpleClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ClientApplication {public static void main(String[] args) {SpringApplication.run(ClientApplication.class, args);SimpleClient client = new SimpleClient("127.0.0.1",50051);String replay = client.sayHello("Jack");try {client.shutdown();} catch (InterruptedException e) {System.out.println("channel关闭异常:"+ e.getMessage());}System.out.println("回应是"+replay);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/267605.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生产上线需要注意的安全漏洞

一、关闭swagger 1、关闭swagger v3 # 需同时设置auto-startupfalse&#xff0c;否则/v3/api-docs等接口仍能继续访问 springfox:documentation:enabled: falseauto-startup: falseswagger-ui:enabled: false 2、关闭swagger v2 # 只要不是true就不启用 swagger:enable: fa…

mysql:查看一个表的索引信息

可以使用命令SHOW INDEX FROM table_name;查看一个表的索引信息&#xff0c;例如&#xff1a;

Python并发:多线程与多进程的详解

文章目录 本篇概要关于并发线程与多线程线程的类型什么是多线程让我们看看线程的一些优点&#xff1a;线程还有一些缺点&#xff1a;进程与多进程进程的特性进程有以下优点&#xff1a;同时&#xff0c;还有以下缺点&#xff1a;多进程Python的局限性并发文件下载先看看一个普通…

TestCase与TransactionTestCase的区别

目录 一、概述 二、区别 1、事务管理方式 2、性能影响 3、适用场景 三、示例代码 TestCase示例代码 TransactionTestCase示例代码 四、总结 TestCase与TransactionTestCase是Django框架中两个重要的测试类&#xff0c;用于对数据库操作进行测试。在编写测试用例时&…

Mybatis-Plus源码解析之MybatisPlusAutoConfiguration(二)

group : com.baomidou version:3.5.2.2-SNAPSHOT SpringBoot是自动装配。Spring则可以在配置类上Import(MybatisPlusAutoConfiguration.class) org.springframework.boot.autoconfigure.EnableAutoConfiguration\com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageD…

图像叠加中文字体

目录 1) 前言2) freetype下载3) Demo3.1) 下载3.2) 编译3.3) 运行3.4) 结果3.5) 更详细的使用见目录中说明 4) 积少成多 1) 前言 最近在做图片、视频叠加文字&#xff0c;要求支持中文&#xff0c;基本原理是将图片或视频解码后叠加文字&#xff0c;之后做图片或视频编码即可。…

如何用CHAT了解历史?

问CHAT&#xff1a;古代有什么常见的简单机械&#xff1f; CHAT回复&#xff1a; 1. 滑轮&#xff1a;滑轮是一种简单的机械&#xff0c;主要提供力量放大、改变力的方向等功能。在古代&#xff0c;人们使用滑轮来托起重物&#xff0c;如水井的提水装置&#xff0c;建造大型建…

Android获取Wifi网关

公司有这样一个应用场景&#xff1a;有一台球机设备&#xff0c;是Android系统的&#xff0c;它不像手机&#xff0c;它没有触摸屏幕&#xff0c;所以我们对球机的操作很不方便&#xff0c;于是我们搞这样一个设置&#xff1a;点击球机电源键5次分享出一个热点&#xff0c;然后…

flex布局一行n个

上图 缩小后 主要用了 flex-basis flex-grow flex-shrink flex的三个属性 有兴趣的可以看看 深入理解CSS之flex精要之 flex-basis flex-grow flex-shrink 实战讲解 .bg{background-color: aquamarine;width: 100%;height: 100%;display: flex;flex-wrap: wrap;}.box1{backgr…

亚马逊鲲鹏系统全自动模拟真人下单更真实

在亚马逊鲲鹏系统下&#xff0c;我们可以通过模拟真人购物习惯来进行自动下单流程&#xff0c;通过设置关键词、多个ASIN进行货比三家&#xff0c;然后执行一系列点击、浏览、滑动滚动条、查看详情、下单购买等操作&#xff0c;以完成整个下单过程。以下介绍这一自动化下单流程…

贪心算法:理论基础 分发饼干 摆动序列 最大子序和

理论基础 什么是贪心算法&#xff1f; 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。什么时候用贪心算法&#xff1f; 贪心算法并没有固定的套路。唯一的难点就是如何通过局部最优&#xff0c;推出整体最优。如何验证可不可以用贪心算法&#xff1f; 最…

EasyV易知微数字孪生助力解决实际行业问题与痛点

数字孪生技术在当前多个领域得到了广泛的应用&#xff0c;特别是在航空航天、工业、城市和医学等领域&#xff0c;它被视为许多科技企业所关注的焦点。这种技术已经成为实现智能化的重要手段&#xff0c;它可以应用于项目设计、建造和运营等各个阶段&#xff0c;能够解决实际问…