Go jsonrpc
JSON-RPC是一个无状态且轻量级的远程过程调用传送协议,传输内容使用JSON编解码。
Golang官方提供了net/rpc/jsonrpc
库实现了JSON-RPC,net/rpc/jsonrpc
包实现了JSON-RPC协议,实现了net/rpc
包的ClientCodec
和ServerCodec
接口,增加了对JSON数据的序列化和反序列化。
jsonrpc
采用JSON对数据编解码,因而支持跨语言调用。jsonrpc
库基于TCP实现,暂不支持HTTP进行数据传输。
import "net/rpc"
import "net/rpc/jsonrpc"
net/rpc
实现了Golang的RPC框架,net/rpc/jsonrpc
则具体实现了JSON-RPC协议,因此具有JSON数据的序列化和反序列化能力。
公共参数
- 客户端和服务端双方传递数据,数据结构必须让双方都能够处理。
请求参数 - 传输的参数数据
//参数
type Args struct{UserId int `json:"userid"`
}
返回值 - 服务端返回的数据
//返回
type Reply struct{Code int `json:"code"`Message string `json:"message"`Data string `json:"data"`
}
服务定义
- 服务定义时入参需遵循
jsonrpc
的定义规范,返回值需以指针方式传入。 - 符合约定的方法必须具备两个参数和一个
error
类型的返回值。 - 第一个参数为客户端调用RPC时交给服务端的数据,可以是指针也可以是实体。
- 第二个参数为服务端返回给客户端的数据,必须为指针类型。
//服务
type UserService struct{}
//RPC
func (s *UserService) Get(args Args, reply *Reply) error{userId := args.UserIdreply.Code = 1reply.Message = "success"reply.Data = fmt.Sprintf("userid = %d", userId)return nil
}
服务端
- 注册和启动服务,监听端口接受请求。
func serve(){//创建服务rcvr := new(UserService)//注册服务err := rpc.Register(rcvr)if err!=nil{log.Fatal(err)}//监听端口listener,err := net.Listen("tcp", "127.0.0.1:7002")if err!=nil{log.Fatal(err)}defer listener.Close()log.Println("jsonrpc server 127.0.0.1:7002 start...")//获取连接for{//等待客户端Socketconn,err := listener.Accept()if err!=nil{log.Println(err)continue}//并发处理连接go func(conn net.Conn){log.Println("client in coming")jsonrpc.ServeConn(conn)}(conn)}
}
jsonrpc.ServeConn
ServeConn
函数用于在单个连接上执行DefaultServer
.ServeConn
会发生阻塞,直到服务端挂起。- 调用者应另开
goroutine
调用ServeConn
方法 jsonrpc.ServeConn(conn)
在指定conn
连接上使用JSON格式进行编解码
func ServeConn(conn io.ReadWriteCloser) {rpc.ServeCodec(NewServerCodec(conn))
}
注意jsonrpc.ServeConn(conn)
实际上等价于
// 创建服务端编解码器
codec := jsonrpc.NewServerCodec(conn)
// 编解码处理
rpc.ServeCodec(codec)
客户端
客户端必须确保服务端在传输数据中所使用的结构体。首先,可通过net
包使用TCP协议连接至服务器,同时可设置超时时间。然后通过之前的TCP连接建立客户端实例。
func call(){//连接服务端client,err := jsonrpc.Dial("tcp", "127.0.0.1:7002")if err!=nil {log.Fatalln(err)}//发起远程调用var reply Replyargs := &Args{UserId:1}err = client.Call("UserService.Get", args, &reply)if err!=nil{log.Fatalln(err)}log.Printf("code:%d, message:%s, data:%s\n", reply.Code, reply.Message, reply.Data)
}
jsonrpc.Dial
- Dial函数通过指定的网络和地址连接JSON-RPC服务端,返回RPC客户端实例。
func Dial(network, address string) (*rpc.Client, error) {conn, err := net.Dial(network, address)if err != nil {return nil, err}return NewClient(conn), err
}
jsonrpc.NewClient
- NewClient返回一个全新的
rpc.Client
用来管理连接对端服务的请求
func NewClient(conn io.ReadWriteCloser) *rpc.Client {return rpc.NewClientWithCodec(NewClientCodec(conn))
}
例如:
conn,err := net.Dial("tcp", "127.0.0.1:7002")
if err!=nil{log.Fatalln(err)
}
defer conn.Close()
client := jsonrpc.NewClient(conn)
请求响应
jsonrpc
传输的是单一的对象,序列化为JSON格式。
jsonrpc
请求对象会包含三个属性
属性 | 描述 |
---|---|
method | 请求调用的方法 |
params | 数组,表示传给方法的参数数组。 |
id | 请求ID,任意类型,接受响应后据此判断对应的请求。 |
jsonrpc
响应对象包含三个属性
属性 | 描述 |
---|---|
result |
方法返回的对象,若error 非空则为null 。
|
error | 调用是否出错 |
id | 对应请求的ID |
另外还定义了一种通知类型,除了id
属性为null
外,通知对象的属性与请求对象完全一样。
同步异步
对于net/rpc
客户端,在远程调用时具有同步(Synchronous)和异步(Asynchronous)两种方式,不论哪种方式,源码中,请求总是在一个新的goroutine
中执行,并使用一个通道(chan)来存放服务端返回值。
- 使用同步方式调用,调用方法内部会等待通道的数据,并一致阻塞到远程服务器返回。
- 使用异步方式调用,客户端调用方法会直接将通道返回,这样可适时的处理数据而不会影响到当前的
goroutine
。
client.Call
- 同步调用
func (client *Client) Call(serviceMethod string, args interface{}, reply interface{}) error {call := <-client.Go(serviceMethod, args, reply, make(chan *Call, 1)).Donereturn call.Error
}
client.Go
- 异步调用
func (client *Client) Go(serviceMethod string, args interface{}, reply interface{}, done chan *Call) *Call {call := new(Call)call.ServiceMethod = serviceMethodcall.Args = argscall.Reply = replyif done == nil {done = make(chan *Call, 10) // buffered.} else {// If caller passes done != nil, it must arrange that// done has enough buffer for the number of simultaneous// RPCs that will be using that channel. If the channel// is totally unbuffered, it's best not to run at all.if cap(done) == 0 {log.Panic("rpc: done channel is unbuffered")}}call.Done = doneclient.send(call)return call
}
jsonrpc.Call
type Call struct {ServiceMethod string // The name of the service and method to call.Args interface{} // The argument to the function (*struct).Reply interface{} // The reply from the function (*struct).Error error // After completion, the error status.Done chan *Call // Receives *Call when Go is complete.
}
http://www.taodudu.cc/news/show-2112334.html
相关文章:
- java json-rpc_JSON-RPC(jsonrpc4j)使用demo
- jsonrpc php使用,php-JsonRPC
- python jsonrpc_jsonrpc使用
- JSON-RPC是什么东西
- jsonrpc
- JSON-RPC
- 【材料力学回顾】弯曲正应力公式
- 小学计算机学什么,小学信息技术课学什么
- 材料模拟python_关于材料计算,模拟,仿真什么区别?
- 机器学习(ML)在材料领域应用专题
- 【线上活动】材料计算训练营(量子力学、物理、化学、新能源、碳中和、生物制药、化工、新材料、催化、锂电池、半导体)
- 运筹学笔记 网络计划
- Computational Social Science计算社会学-《Science》文章翻译
- 计算语言学之拼写纠错
- Materials Studio建模与材料模拟计算工作站方案2022
- lammps计算聚合物例子_lammps计算金属扩散
- 材料学真的没前途吗?
- matlab 设置计算精度,matlab计算精度设置
- 学材料化学想转行计算机,2020大学最没用的十大专业-十大劝退专业(转专业必看)...
- 计算机科学中的计算机思维在本质上源自于,计算思维对学习计算机知识有何作用?...
- 【材料计算】第一性原理、密度泛函理论、从头算之间的关系
- 【材料计算】输入文件INCAR
- 计算机做电池模拟,探讨锂电领域常用模拟计算方法
- 用于计算成像的超材料
- 学计算机专业你后悔吗?为什么?
- 学计算机的学数学分析吗,学计算机专业是不是对数学的要求很高?
- 为什么材料专业要劝退?材料专业就找不到好工作吗?
- 材料信息学介绍
- 计算机在材料科学领域有哪些应用,计算机在材料科学中的应用分析
- 计算机设计大赛材料准备讲解
Go jsonrpc相关推荐
- Java框架JSON-RPC项目demo代码实战 + JAVA WEB配置虚拟目录(转自21天java web开发)
Java框架JSON-RPC项目demo代码实战 备注 JAVA WEB配置虚拟目录(转自21天java web开发) https://blog.csdn.net/wjxbj/article/det ...
- 转载 jsonrpc环境搭建和简单实例
jsonrpc环境搭建和简单实例 一.环境准备 下载需要的jar包和js文件,下载地址:https://yunpan.cn/cxvbm9DhK9tDq 访问密码 6a50 二.新建一个web工程,j ...
- ASP.net Joyrock异步应用示例、JSON-RPC使用方法
使用Joyrock 需要先引用Jayrock.dll,Jayrock.Json.dll两文件,另外在web页面引入json.js文件(不在同一个地方下载的json.js可用不了), .net 后台文件 ...
- python-jsonrpc框架实现JsonRPC协议的web服务
一.JsonRPC介绍 json-rpc是基于json的跨语言远程调用协议,比xml-rpc.webservice等基于文本的协议传输数据格小:相对hessian.Java-rpc等二进制协议便于调试 ...
- fguillot json rpc_使用Hyperf框架搭建jsonrpc服务
一.开发项目划分与搭建JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读.在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTT ...
- fguillot json rpc_Hyperf 框架创建 JSON-rpc 服务
我们创建一个User服务供其他服务调用以实现认证和鉴权. checkToken 方法接收两个参数,一个token,一个permission,首先验证token获得user,对user的鉴权将在以后的权 ...
- go标准库的学习-net/rpc/jsonrpc
参考:https://studygolang.com/pkgdoc 导入方式: import "net/rpc/jsonrpc" jsonrpc包实现了JSON-RPC的Clien ...
- php rpc调用,PHP 通过 JSON-RPC 调用实现以太坊交互
PHP 通过 JSON-RPC 调用实现以太坊交互 由 hubwiz 创建于2年前, 最后更新于 2年前 版本号 #1 6262 views 0 likes 0 collects 自去年以来,我们正在 ...
- 大数据架构中使用JSON-RPC好,还是RESTful API好?
对外开放给全世界的API推荐采用RESTful,是否严格按照规范是一个要权衡的问题.要综合成本.稳定性.易用性.业务场景等等多种因素. 看到知乎上有这样一个问题 WEB开发中,使用JSON-RPC好, ...
- JSON-RPC、XML-RPC、SOAP三者的关系
2019独角兽企业重金招聘Python工程师标准>>> JSON-RPC规范:http://json-rpc.org/wiki/specification XML-RPC规范:htt ...
最新文章
- 微软Win8将有多个版本 四款面向ARM平台
- Rift.io基于OSM发布首个商用MANO软件
- Unix时间戳转换(python)
- Python数据分析几个比较常用的方法
- Ubuntu断电重启后黑屏左上角光标闪烁,分辨率低解决办法
- Django 应用程序 + 模型 + 基本数据访问
- C语言试题三十三之比较两个字符串的长度,(不得调用c语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。
- 一文解读光纤收发器单模和多模的区别!
- OpenDaylight开发hello-world项目之开发工具安装
- 卷积神经网络 手势识别_如何构建识别手语手势的卷积神经网络
- 解决Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
- 联想x250为什么这么贵_外媒:联想笔记本thinkpadX250如何联想thinkpadX250价格及评价...
- python实例 81,82
- Dubbo + Zookeeper入门初探(转载)
- -个很个性的二本人计时
- c语言多个大写变小写字母,c语言大写字母转换成小写字母
- 经营微博的十个经典案例
- 高一计算机课期中考试总结反思,高一期中考试总结反思
- android设置主题背景为壁纸_Android 应用背景加载系统动态壁纸
- 【C++学习笔记】基本内置类型和变量
热门文章
- 【软件测试】软件测试为什么会用到Linux?
- 印象笔记如何分享链接_印象笔记共享问题解决经过
- Tomcat6 无法登陆Tomcat Manager
- java电影购票系统_Java Swing实现电影购票系统项目
- 数值分析实验报告 matlab,数值分析方法与实验基于MATLAB实现
- android怎么oauth2公版认证,Android中腾讯微博OAuth认证(一)---获取RequestToken
- python新浪微博爬虫_scrapy实现新浪微博爬虫
- XRHT电钢琴电子琴实训室教学管理系统配置方案
- redis可视化工具desktop manager
- 个人博客网站搭建详细视频教程和源码