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.mzph.cn/news/622942.shtml

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

相关文章

AcWing 5386. 进水出水问题【线性dp+差值dp】

原题链接:https://www.acwing.com/problem/content/5389/ 某泳池装有 n 个水管,编号 1∼n。 每个水管都是既可用于进水,也可用于出水。 其中,第 i 个水管工作时的单位时间进水或出水量为 ai。 我们希望泳池保持水循环的同时&a…

【机器学习300问】7、怎么进行机器学习?机器学习的基本流程是什么?

一、写在前面 也许你和我一样,在刚开始学习机器学习的基本知识的时候,学到了很多的零碎知识点,无法穿成线织成网,本文是机器学习中提纲挈领的一环,将和你一起将今后所有的知识点都捕捉在这张网中。 当你在问“…

仿stackoverflow名片与b站名片实现(HTML、CSS)

目录 前言一、仿stackoverflow名片HTMLCSS 二、仿b站名片HTMLCSS 素材 前言 学习自ACwing - Web应用课 一、仿stackoverflow名片 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport&…

BDD(Behavior-Driven Development)行为驱动开发介绍

为什么需要BDD&#xff1f; “开发软件系统最困难的部分就是准确说明开发什么” (“The hardest single part of building a software system is deciding precisely what to build” — No Silver Bullet, Fred Brooks) 。 看一下下面的开发场景&#xff1a; 场景一&#xf…

生成随机id

在Node.js中&#xff0c;你可以使用uuid模块来生成随机的ID。uuid模块提供了多种生成唯一标识符的方法&#xff0c;包括基于时间戳、随机数等不同的算法。 以下是一个简单的示例&#xff0c;演示如何在Node.js中使用uuid模块生成随机ID&#xff1a; 首先&#xff0c;你需 np…

基于TCP的全双工网络编程实践

首先我们先了解一下什么是全双工通信&#xff1f; 全双工数据通信允许数据同时在两个方向上传输&#xff0c;因此&#xff0c;全双工通信相当于是两个单工通信方式的结合&#xff0c;它要求发送设备和接收设备都有独立的接收和发送能力。 TCP服务端代码&#xff1a; #includ…

M-VAE

Word2Vec c(y) 辅助信息 作者未提供代码

音频和视频基础知识

声音 什么是声音&#xff1a; 声音是由物体振动产生的&#xff0c;物体发生振动&#xff0c;对周围的空气产生挤压&#xff0c;从而产生声音。声音是一种压力波&#xff0c;使周围的空气产生疏密变化&#xff0c;形成疏密相间的纵波&#xff0c;由此产生了声波。 声波三要素&…

小程序跳转安卓会跳转两次 iOS不会的解决方案

原因&#xff1a;元素点击事件在子元素上有绑定&#xff0c;父元素上也有绑定会形成冒泡事件&#xff1b; 原生小程序&#xff1a; bind:tap&#xff1a;会冒泡&#xff1b; <view bind:tap"gotoDetail"><image :src"{{ item2.img }}" mode&qu…

HUAWEI华为MateStation S台式机电脑12代PUC-H7621N,H5621N原装出厂Windows11.22H2系统

链接&#xff1a;https://pan.baidu.com/s/1QtjLyGTwMZgYiBO5bUVPYg?pwd8mx0 提取码&#xff1a;8mx0 原厂WIN11系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、华为电脑管家等预装程序 文件格式&#xff1a;esd/wim/swm 安装方式&#xf…

dbeaver连接人大金仓报错 can‘t load driver class ‘com.kingbase8.Driver;‘

dbeaver可以连接很多数据库&#xff0c;设置dbeaver连接人大金仓&#xff0c;下载安装完成后&#xff0c;需要自行配置人大金仓的驱动&#xff0c;否则无法连接数据库。 一、dbeaver 下载 dbeaver 下载地址&#xff1a;https://dbeaver.io/download/ 二、查找人大金仓驱动 首…

[含完整代码]Linux使用.sh脚本自动部署(启动|停止|状态|日志)项目[超详细]

前言&#xff1a; 个人博客&#xff1a;www.wdcdbd.com 我们在linux部署.jar项目时&#xff0c;都需要通过java -jar的形式来部署&#xff0c;每次都要手动停止&#xff0c;部署&#xff0c;这样用起来会很麻烦。所以&#xff0c;这篇文章就是自己通过.sh脚本一键启动&#xf…

XCTF:hello_pwn[WriteUP]

使用checksec查看ELF文件信息 checksec 4f2f44c9471d4dc2b59768779e378282 这里只需要注意两个重点&#xff1a; Arch&#xff1a;64bit的文件&#xff0c;后面写exp的重点 Stack&#xff1a;No canary found 没有栈溢出保护 使用IDA对ELF文件进行反汇编 双击左侧的函数栏…

库函数点亮Led

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

陶瓷碗口缺口检测-图像分割

图像分割 由于对碗口进行缺口检测&#xff0c;因此只需要碗口的边界信息。得到陶瓷碗区域填充后的图像&#xff0c;对图像进行边缘检测。这是属于图像分割中的内容&#xff0c;在图像的边缘中&#xff0c;可以利用导数算子对数字图像求差分&#xff0c;将边缘提取出来。 本案…

【算法刷题】总结规律 算法题目第2讲 [234] 回文链表,因为深浅拷贝引出的bug

配合b站视频讲解食用更佳:https://www.bilibili.com/video/BV1vW4y1P7V7 核心提示&#xff1a;好几道题是处理有序数组的&#xff01; 适合人群&#xff1a;考研/复试/面试 解决痛点&#xff1a;1. 刷了就忘 2.换一道相似的题就不会 学完后会输出&#xff1a;对每类题目的框架…

test-04-test case generate 测试用例生成 tcases A model-based test case generator

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 自动生成测试用例 Tcases&#xf…

查看lucene和elasticsearch的版本对应关系

一、Maven仓库官网&#xff1a; https://mvnrepository.com/ 二、搜索elasticsearch&#xff0c;然后点击Server或者elasticsearch进入。 三、点击相应的版本号进入。 四、查看对应的lucene版本。 END

spring cloud feign介绍以及和dubbo对比

什么是feign 在微服务架构中&#xff0c;Feign 是一个声明式的 web 服务客户端&#xff0c;它使得编写 web 服务客户端变得更加容易。Feign 旨在帮助开发者轻松地调用远程服务。它是由 Netflix 开发的一部分 Spring Cloud Netflix 微服务套件。Feign 通过提供一个简洁的模板化…

SwiftUI CoreData Picker

开发多账本功能 CoreData 与 Picker 的使用 上代码&#xff1a; // // TestZhangBenPicker.swift // pandabill // // Created by 朱洪苇 on 2024/1/14. //import SwiftUIstruct TestZhangBenPicker: View {FetchRequest(sortDescriptors: [SortDescriptor(\.cc_at)],anima…