golang实现rpc方法二:使用jsonrpc库【跨平台】

首先在golang实现rpc方法一net/rpc库中实现了RPC方法,但是那个方法不是跨平台的,没法在其他语言中调用这个实现的RPC方法,接下来我们可以通过jsonroc库实现跨语言的RPC方法。俩种实现方式的代码其实也是差不多的,大差不差,只是调用的库不同。

项目左侧包结构

rpc服务端

serverrpc.go实现代码如下

package mainimport ("errors""fmt""log""net""net/rpc""net/rpc/jsonrpc""os"
)// 运算结构体
type Arith struct {
}// 运算请求结构体
type ArithRequest struct {A intB int
}// 运算响应结构体
type ArithResponse struct {Pro int //product 表示乘积Quo int //quotient 表示商Rem int //remaind 表示余数
}/*
运算结构体的乘法运算方法
第一个参数只需要拿到其里面的值只需要传一个结构体即可,
第二个参数需要将运算结果存到其里面所以需要传地址
*/
func (this *Arith) Multiply(req ArithRequest, res *ArithResponse) error {res.Pro = req.A * req.Breturn nil
}/*
运算结构体的除法运算方法
第一个参数只需要拿到其里面的值只需要传一个结构体即可,
第二个参数需要将运算结果存到其里面所以需要传地址
*/
func (this *Arith) Divide(req ArithRequest, res *ArithResponse) error {if req.B == 0 { //除法为0,运算不合法return errors.New("divide by zero")}res.Quo = req.A / req.Bres.Rem = req.A % req.Breturn nil
}
func main() {rpc.Register(new(Arith)) //注册rpc服务lis, err := net.Listen("tcp", "127.0.0.1:8090") //Listen是block(阻塞的)if err != nil {log.Fatalln("fatal error:", err)}fmt.Fprintf(os.Stdout, "%s", "start connection")//写了一个循环里面启动了一个协程可以处理多个协程for {conn, err := lis.Accept() //接收客户端连接请求if err != nil {  //当前请求存在错误,跳过当前请求continue}//启动一个协程并发处理请求go func(conn net.Conn) {fmt.Fprintf(os.Stdout, "%s", "new client is coming\n")jsonrpc.ServeConn(conn)}(conn) //自己调用自己}
}

rpc客户端

clientrpc.go实现代码如下

package mainimport ("fmt""log""net/rpc/jsonrpc"
)// 算数运算请求结构体
type ArithRequest struct {A intB int
}// 算数运算响应结构体
type ArithResponse struct {Pro int //product 乘积Quo int //quotient 商Rem int //remain 余数
}func main() {//通过jsonrpc库实现conn, err := jsonrpc.Dial("tcp", "127.0.0.1:8090")if err != nil {log.Fatalln("dailing error", err)}req := ArithRequest{9, 2} //请求结构体var res ArithResponse     //响应结构体,用于存储运算结果//实现jsonrpc之后,通过Call方法在客户端调用服务端里面算数运算结构体的乘法运算方法err = conn.Call("Arith.Multiply", req, &res)if err != nil {log.Fatalln("arith error", err)}fmt.Printf("%d * %d = %d\n", req.A, req.B, res.Pro)//实现jsonrpc之后,通过Call方法在客户端调用服务端里面算数运算结构体的除法运算方法err = conn.Call("Arith.Divide", req, &res)if err != nil {log.Fatalln("arith error", err)}fmt.Printf("%d / %d, quo is %d, rem is %d\n", req.A, req.B, res.Quo, res.Rem)
}

详细实现步骤

1.首先初始化项目

go mod init pro01  //pro01表示项目名称

2.在当前项目下新建包server,并且在该包下面新建serverrpc.go实现rpc服务端

3.在当前项目下新建包client,并且在该包下面新建clientrpc.go实现rpc客户端

4.运行rpc服务端程序 ,首先进入server包,然后运行serverrpc.go

cd server
go run serverrpc.go

5.运行rpc客户端程序,首先进入client包,然后运行clientrpc.go

cd client
go run clientrpc.go

6.查看输出结果是否正确,输出结果如下表示程序运行结果正确,当然我这里的结果是根据我在请求结构体里面给出的俩个数值进行计算的,具体结果是否正确根据自己的具体程序判断。 

常见错误

如果启动rpc服务时出现了如下图所示错误,说明在之前已经启动过rpc服务,并且没有关闭,导致端口被占用了,只需要把之前启动的程序停掉,然后重新启动rpc服务即可。

总结:

jsonrpc库和net/rpc都实现了rpc方法,实现了远程进程调用,区别在于net/rpc是不跨平台的,别的语言没法调用,而jsonrpc是跨平台的,别的语言也可以调用rpc方法。

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

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

相关文章

手机直连卫星及NTN简介

一、手机直连卫星的发展现状 近日,华为推出了支持北斗卫星短报文的Mate 50旗舰机、P60系列,苹果也跟Globalstar(全球星)合作推出了支持卫星求救的iPhone14,最亮眼的还是华为的。这几款产品揭开了卫星通信探索消费领域…

Retrieval-Augmented Generation for Large Language Models: A Survey

PS: 梳理该 Survey 的整体框架,后续补充相关参考文献的解析整理。本文的会从两个角度来分析总结,因此对于同一种技术可能在不同章节下都会有提及。第一个角度是从整体框架的迭代来看(对应RAG框架章节),第二个是从RAG中…

前端背景收集之烟花背景

文章目录 🐒个人主页🏅Vue项目常用组件模板仓库📖前言:🎀源码如下: 🐒个人主页 🏅Vue项目常用组件模板仓库 📖前言: 本篇博客主要提供前端背景收集之烟花背景…

强化学习应用(八):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法,用于解决基于马尔可夫决策过程(MDP)的问题。它通过学习一个价值函数来指导智能体在环境中做出决策,以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

完美解决报错Please verify that the package.json has a valid “main“ entry处理方法

出现下图中的错误 ,说明缺少main入口 解决方法: 1.删除 node_modules 和 package-lock.json这两个文件 2.命令行输入npm i 会重新下载包 3.重新执行检查没有报错

【LLM 论文阅读】NEFTU N E: LLM微调的免费午餐

指令微调的局限性 指令微调对于训练llm的能力至关重要,而模型的有用性在很大程度上取决于我们从小指令数据集中获得最大信息的能力。在本文中,我们提出在微调正向传递的过程中,在训练数据的嵌入向量中添加随机噪声,论文实验显示这…

静态路由、代理ARP

目录 静态路由静态路由指明下一跳和指明端口的区别代理ARP 我们知道,跨网络通信需要路由 路由有三种类型: 1.直连路由。 自动产生的路由,当网络设备连接到同一网络时,他们可以自动学习到对方的存在。自动学习相邻网络设备的直连信…

使用Excel批量给数据添加单引号和逗号

表格制作过程如下: A2表格暂时为空,模板建立完成以后,用来放置原始数据; 在B2表格内输入公式: ""&A2&""&"," 敲击回车; 解释: B2表格的公式&q…

科大讯飞星火大模型接入API js 部分 接口 安装注意事项

下载以下链接例子运行程序 https://xfyun-doc.xfyun.cn/static%2F16968175055332330%2Fspark_js_demo.zip 官网给的说明 准备 1.在demo中填写APPID、APISecret、APIKey,可到控制台-我的应用-大模型页面获取 2.安装nodejs 本地运行 1.打开cmd,进入dem…

微软等开源评估ChatGPT、Phi、Llma等,统一测试平台

微软亚洲研究院、中国科学院自动化研究所、中国科学技术大学和卡内基梅隆大学联合开源了,用于评估、分析大语言模型的统一测试平台——PromptBench。 Prompt Bench支持目前主流的开源、闭源大语言模型,例如,ChatGPT、GPT-4、Phi、Llma1/2、G…

【深度学习目标检测】十五、基于深度学习的口罩检测系统-含GUI和源码(python,yolov8)

YOLOv8是一种物体检测算法,是YOLO系列算法的最新版本。 YOLO(You Only Look Once)是一种实时物体检测算法,其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化,提高了检测速度和准确性。…

大语言模型向量数据库

大语言模型&向量数据库 LARGE LANGUAGE MODELSA. Vector Database & LLM WorkflowB. Vector Database for LLMC. Potential Applications for Vector Database on LLMD. Potential Applications for LLM on Vector DatabaseE. Retrieval-Based LLMF. Synergized Exampl…

使用Notepad++将多行数据合并成一行

步骤 1、按CtrlF,弹出“替换”的窗口; 2、选择“替换”菜单; 3、“查找目标”内容输入为:\r\n; 4、“替换为”内容为空; 5、“查找模式”选择为正则表达式; 6、设置好之后,点击“全…

BUG-<el-option>多选框不能多选,前端Element

文章目录 来源解决 来源 在一个 <el-select> 菜单组件中使用<el-option>时&#xff0c;为下拉菜单提供多个选项。每个 <el-option> 代表一个选项。 测试为一个用户添加多个角色&#xff0c;多选异常。 贴BUG代码&#xff1a; <el-form-item label"…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…

.NetCore部署微服务(二)

目录 前言 概念 一 Consul注册服务中心 1.1 consul下载 1.2 consul运行 二 服务注册 2.1 安装Consul包 2.2 修改配置文件 2.3 注入Consul服务 2.3 修改Controller&#xff0c;增加HealthCheck方法 三 运行服务 3.1 docker运行服务 前言 上一篇讲到微服务要灵活伸缩…

5 - 异常处理

目录 1. 总览 1.1 Exception 与 Error 1.2 checked unchecked 异常 1&#xff09;使用 try-catch 进行捕获 2&#xff09;使用 throws 关键字抛出 1.3 throw 与 throws 1&#xff09;throw 2&#xff09;throws 3&#xff09;区别 1.4 try-catch-finally 2. try wit…

leetcode 每日一题 2024年01月11日 构造有效字符串的最少插入数

题目 2645. 构造有效字符串的最少插入数 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 示例 …

17. 电话号码的字母组合(回溯)

从第一个数字开始遍历其对应的字母&#xff0c;将其加入StringBuffer中&#xff0c;继续深度优先搜索&#xff0c;当访问到最后一个数字的时候&#xff0c;将StringBuffer存储到ans中&#xff0c;然后回溯到下一个对应字母。 class Solution {public List<String> lette…

【二十】【动态规划】879. 盈利计划、377. 组合总和 Ⅳ、96. 不同的二叉搜索树 ,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…