rpc跨平台通信的简单案例,java和go
当我们使用Go和Java进行RPC(Remote Procedure Call,远程过程调用)跨平台通信时,你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架,它支持多种编程语言,包括Go和Java。下面我将为你提供一个简单的案例来说明如何使用Go和Java进行RPC跨平台通信。
Go作为服务器端,Java作为客户端。
首先,你需要定义一个包含所需方法的.proto文件(Protocol Buffers文件),这个文件将用于生成Go和Java的RPC代码。假设你的.proto文件名为example.proto,内容如下:
syntax = "proto3";package example;service MyService {rpc SayHello (HelloRequest) returns (HelloResponse) {}
}message HelloRequest {string name = 1;
}message HelloResponse {string message = 1;
}
接下来,你需要使用该.proto文件生成Go和Java的RPC代码。使用以下命令生成Go代码:
protoc --go_out=. example.proto
这将生成一个名为example.pb.go的Go文件。
然后,使用以下命令生成Java代码:
protoc --java_out=. example.proto
这将生成一个名为Example.java的Java文件。
现在我们来编写服务器端的Go代码(假设文件名为server.go):
package mainimport ("context""log""net""google.golang.org/grpc"pb "path/to/generated/go/package" // 替换为实际的Go生成代码包路径
)type server struct{}func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {name := req.GetName()message := "Hello, " + namereturn &pb.HelloResponse{Message: message}, nil
}func main() {lis, err := net.Listen("tcp", ":50051")if err != nil {log.Fatalf("failed to listen: %v", err)}s := grpc.NewServer()pb.RegisterMyServiceServer(s, &server{})log.Println("Server started on port 50051")if err := s.Serve(lis); err != nil {log.Fatalf("failed to serve: %v", err)}
}
确保将path/to/generated/go/package替换为实际的Go生成代码包的路径。
现在我们来编写客户端的Java代码:
import example.Example.MyService;
import example.Example.HelloRequest;
import example.Example.HelloResponse;import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;public class Client {public static void main(String[] args) {ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051).usePlaintext().build();MyService blockingStub = MyService.newBlockingStub(channel);HelloRequest request = HelloRequest.newBuilder().setName("John").build();HelloResponse response = blockingStub.sayHello(request);System.out.println("Response: " + response.getMessage());channel.shutdown();}
}
确保将example.Example替换为实际的Java生成代码的包名。
现在,你可以在终端中分别运行服务器端的Go代码和客户端的Java代码。服务器将在本地的50051端口上监听,并等待客户端的请求。客户端将连接到服务器,并向服务器发送一个带有名字的请求。服务器将返回一个包含问候消息的响应,并在客户端上打印该消息。
这就是使用Go和Java进行RPC跨平台通信的简单示例。你可以根据自己的需求扩展和修改代码。记得在实际使用时,替换相应的包路径和端口号来适应你的环境。
go做客户端,java做服务端的案例
使用Java作为服务端,Go作为客户端进行RPC跨平台通信
Java服务端代码
首先,我们从Java服务端开始。在这个案例中,我们将使用Java和gRPC构建一个简单的服务端,它提供一个名为GreetingService的RPC服务,客户端可以调用该服务来获取问候消息。
- 创建一个名为
GreetingService.proto的Protocol Buffers文件,定义了服务和消息的结构。
syntax = "proto3";package example;service GreetingService {rpc SayHello (HelloRequest) returns (HelloResponse) {}
}message HelloRequest {string name = 1;
}message HelloResponse {string message = 1;
}
- 使用gRPC的插件生成Java代码。
protoc --java_out=. GreetingService.proto
- 创建一个名为
GreetingServiceImpl.java的Java类,实现GreetingService接口。
package example;import io.grpc.stub.StreamObserver;public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {@Overridepublic void sayHello(HelloRequest request, StreamObserver<HelloResponse> responseObserver) {String name = request.getName();String message = "Hello, " + name;HelloResponse response = HelloResponse.newBuilder().setMessage(message).build();responseObserver.onNext(response);responseObserver.onCompleted();}
}
- 创建一个名为
Server.java的Java类,启动gRPC服务端。
package example;import io.grpc.Server;
import io.grpc.ServerBuilder;
import java.io.IOException;public class Server {private final int port;private final Server server;public Server(int port) throws IOException {this.port = port;this.server = ServerBuilder.forPort(port).addService(new GreetingServiceImpl()).build();}public void start() throws IOException {server.start();System.out.println("Server started on port " + port);Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("Shutting down gRPC server");Server.this.stop();System.out.println("Server shut down");}));}public void stop() {if (server != null) {server.shutdown();}}public void blockUntilShutdown() throws InterruptedException {if (server != null) {server.awaitTermination();}}public static void main(String[] args) throws IOException, InterruptedException {Server server = new Server(50051);server.start();server.blockUntilShutdown();}
}
Go客户端代码
接下来,我们编写Go客户端代码,通过gRPC调用Java服务端提供的RPC方法。
- 创建一个名为
main.go的Go文件,导入gRPC和自动生成的Go代码。
package mainimport ("context""log""google.golang.org/grpc"pb "path/to/generated/go/package" // 替换为实际的Go生成代码包路径
)func main() {conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())if err != nil {log.Fatalf("failed to connect: %v", err)}defer conn.Close()client := pb.NewGreetingServiceClient(conn)request := &pb.HelloRequest{Name: "John",}response, err := client.SayHello(context.Background(), request)if err != nil {log.Fatalf("failed to call SayHello: %v", err)}log.Printf("Response: %s", response.Message)
}
确保将path/to/generated/go/package替换为实际的Go生成代码包的路径。
运行代码
在终端中分别运行Java服务端和Go客户端的代码。
首先,运行Java服务端:
java -cp <path_to_grpc_libraries>:. example.Server
确保将<path_to_grpc_libraries>替换为你的gRPC库的路径。
然后,运行Go客户端:
go run main.go
以上就是go和java的跨平台使用rpc的协议进行调用和数据交换通信的简单案例。
相关文章:
rpc跨平台通信的简单案例,java和go
当我们使用Go和Java进行RPC(Remote Procedure Call,远程过程调用)跨平台通信时,你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架,它支持多种编程语言,包括Go和Java。下面我将为你提供一个简单…...
Java设计模式之观察者模式详解
Java设计模式之观察者模式详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将一同深入探讨Java设计模式之观察者模式,这是一种代…...
分布式锁实现(mysql,以及redis)以及分布式的概念
道生一,一生二,二生三,三生万物 我旁边的一位老哥跟我说,你知道分布式是是用来干什么的嘛?一句话给我干懵了,我能隐含知道,大概是用来做分压处理的,并增加系统稳定性的。但是具体如…...
实现分布式锁:Zookeeper vs Redis
目录 引言 1. Zookeeper分布式锁 1.1特点和优势: 强一致性 顺序节点 Watch机制 1.2 Zookeeper分布式锁代码示例 2. Redis分布式锁 2.1特点和优势: 简单高效 可续租性 灵活性 2.2Redis分布式锁代码示例 3.对比和选择 3.1 一致性要求 3.2…...
电脑录屏必备技能,让分享变得更加简单!
随着网络技术的飞速发展,电脑录屏已经成为日常工作和学习中不可或缺的一部分。无论是录制在线课程、游戏解说、软件教程,还是远程会议、演示文稿等,电脑录屏都有着广泛的应用。接下来,本文将介绍三种常见的电脑录屏方法࿰…...
重构改善既有代码的设计-学习(一):封装
1、封装记录(Encapsulate Record) 一些记录性结构(例如hash、map、hashmap、dictionary等),一条记录上持有什么字段往往不够直观。如果其使用范围比较宽,这个问题往往会造成许多困扰。所以,记录…...
Python图像处理【19】基于霍夫变换的目标检测
基于霍夫变换的目标检测 0. 前言1. 使用圆形霍夫变换统计图像中圆形对象2. 使用渐进概率霍夫变换检测直线2.1 渐进霍夫变换原理2.2 直线检测 3. 使用广义霍夫变换检测任意形状的对象3.1 广义霍夫变换原理3.2 检测自定义形状 小结系列链接 0. 前言 霍夫变换 (Hough Transform,…...
Spring+SprinMVC+MyBatis注解方式简易模板
SpringSprinMVCMyBatis注解方式简易模板代码Demo GitHub访问 ssm-tpl-anno 一、数据准备 创建数据库test,执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Version :…...
Python基础第五篇(Python数据容器)
文章目录 一、数据容器入门二、数据容器 list 列表(1),list 列表定义(2),list列表的索引(3),list列表的常见操作(4),list列表的遍历 三、数据容器:tuple(元组)(1),tuple元组定义(2),tuple元组的索引(3),tuple元组的常见操作(4),tuple元组的遍…...
【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机
AAA配置步骤为: 1.开启telent远程登陆服务 2.创建用户,设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址,用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …...
GaussDB数据库中的MERGE INTO介绍
一、前言 二、GaussDB MERGE INTO 语句的原理概述 1、MERGE INTO 语句原理 2、MERGE INTO 的语法 3、语法解释 三、GaussDB MERGE INTO 语句的应用场景 四、GaussDB MERGE INTO 语句的示例 1、示例场景举例 2、示例实现过程 1)创建两个实验表,并…...
2024年上海高考数学最后四个多月的备考攻略,目标140+
亲爱的同学们,寒假已经来临,春节即将到来,距离2024年上海高考已经余额不足5个月了。作为让许多学子头疼,也是拉分大户的数学科目,你准备好了吗?今天,六分成长为您分享上海高考数学最后四个多月的…...
SSL证书自动化管理有什么好处?如何实现SSL证书自动化?
SSL证书是用于加密网站与用户之间传输数据的关键元素,在维护网络安全方面,管理SSL证书与部署SSL证书一样重要。定期更新、监测和更换SSL证书,可以确保网站的安全性和合规性。而自动化管理可以为此节省时间,并避免人为错误和不必要…...
路由器初始化配置、功能配置
实验环境 拓扑图 Ip规划表(各组使用自己的IP规划表) 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-2…...
node介绍
1.node是什么 Node是一个基于Chrome V8引擎的JS运行环境。 Node不是一个独立的语言、node不是JS框架。 Node是一个除了浏览器之外的、可以让JS运行的环境 Node.js是一个让JS运行在服务端的开发平台,是使用事件驱动,异步非阻塞I/O,单线程&…...
海外抖音TikTok、正在内测 AI 生成歌曲功能,依靠大语言模型 Bloom 进行文本生成歌曲
近日,据外媒The Verge报道,TikTok正在测试一项新功能,利用大语言模型Bloom的AI能力,允许用户上传歌词文本,并使用AI为其添加声音。这一创新旨在为用户提供更多创作音乐的工具和选项。 Bloom 是由AI初创公司Hugging Fac…...
【ARM 嵌入式 编译系列 3.6 -- 删除lib中的某个文件】
请阅读【嵌入式开发学习必备专栏 之 ARM GCC 编译专栏】 文章目录 删除lib中的某个文件 删除lib中的某个文件 比如,如果要删除 libc.a 静态库中的特定对象文件并重新使用这个静态库,在终端中可以使用 ar 命令。ar 是一个归档工具,它可以创建…...
web架构师编辑器内容-图层拖动排序功能的开发
新的学习方法 用手写简单方法实现一个功能然后用比较成熟的第三方解决方案即能学习原理又能学习第三方库的使用 从两个DEMO开始 Vue Draggable Next: Vue Draggable NextReact Sortable HOC: React Sortable HOC 列表排序的三个阶段 拖动开始(dragstart&#x…...
3.RHCSA脚本配置及通过node2改密码
运行脚本发现node2不成功 脚本破解 选第二个 Ctrl x 换行 破解成功后做node2的改密码题 回到redhat, 发现检测程序检测密码题成功,得了8分....
AtCoder Regular Contest 170(A~B)
A - Yet Another AB Problem 给你两个字符串S和T,你可以对S执行操作,选择两个字符,将前面的改为A,后面的改为B,最少操作几次可以把S改成T。如果改不成就输出-1。 从左往右一个一个改过去,分类讨论&#x…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
