JSON-RPC是一个无状态且轻量级的远程过程调用传送协议,传输内容使用JSON编解码。

JSON-RPC

Golang官方提供了net/rpc/jsonrpc库实现了JSON-RPC,net/rpc/jsonrpc包实现了JSON-RPC协议,实现了net/rpc包的ClientCodecServerCodec接口,增加了对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相关推荐

  1. 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 ...

  2. 转载 jsonrpc环境搭建和简单实例

    jsonrpc环境搭建和简单实例 一.环境准备 下载需要的jar包和js文件,下载地址:https://yunpan.cn/cxvbm9DhK9tDq  访问密码 6a50 二.新建一个web工程,j ...

  3. ASP.net Joyrock异步应用示例、JSON-RPC使用方法

    使用Joyrock 需要先引用Jayrock.dll,Jayrock.Json.dll两文件,另外在web页面引入json.js文件(不在同一个地方下载的json.js可用不了), .net 后台文件 ...

  4. python-jsonrpc框架实现JsonRPC协议的web服务

    一.JsonRPC介绍 json-rpc是基于json的跨语言远程调用协议,比xml-rpc.webservice等基于文本的协议传输数据格小:相对hessian.Java-rpc等二进制协议便于调试 ...

  5. fguillot json rpc_使用Hyperf框架搭建jsonrpc服务

    一.开发项目划分与搭建JSON RPC 是一种基于 JSON 格式的轻量级的 RPC 协议标准,易于使用和阅读.在 Hyperf 里由 hyperf/json-rpc 组件来实现,可自定义基于 HTT ...

  6. fguillot json rpc_Hyperf 框架创建 JSON-rpc 服务

    我们创建一个User服务供其他服务调用以实现认证和鉴权. checkToken 方法接收两个参数,一个token,一个permission,首先验证token获得user,对user的鉴权将在以后的权 ...

  7. go标准库的学习-net/rpc/jsonrpc

    参考:https://studygolang.com/pkgdoc 导入方式: import "net/rpc/jsonrpc" jsonrpc包实现了JSON-RPC的Clien ...

  8. php rpc调用,PHP 通过 JSON-RPC 调用实现以太坊交互

    PHP 通过 JSON-RPC 调用实现以太坊交互 由 hubwiz 创建于2年前, 最后更新于 2年前 版本号 #1 6262 views 0 likes 0 collects 自去年以来,我们正在 ...

  9. 大数据架构中使用JSON-RPC好,还是RESTful API好?

    对外开放给全世界的API推荐采用RESTful,是否严格按照规范是一个要权衡的问题.要综合成本.稳定性.易用性.业务场景等等多种因素. 看到知乎上有这样一个问题 WEB开发中,使用JSON-RPC好, ...

  10. JSON-RPC、XML-RPC、SOAP三者的关系

    2019独角兽企业重金招聘Python工程师标准>>> JSON-RPC规范:http://json-rpc.org/wiki/specification XML-RPC规范:htt ...

最新文章

  1. 微软Win8将有多个版本 四款面向ARM平台
  2. Rift.io基于OSM发布首个商用MANO软件
  3. Unix时间戳转换(python)
  4. Python数据分析几个比较常用的方法
  5. Ubuntu断电重启后黑屏左上角光标闪烁,分辨率低解决办法
  6. Django 应用程序 + 模型 + 基本数据访问
  7. C语言试题三十三之比较两个字符串的长度,(不得调用c语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。
  8. 一文解读光纤收发器单模和多模的区别!
  9. OpenDaylight开发hello-world项目之开发工具安装
  10. 卷积神经网络 手势识别_如何构建识别手语手势的卷积神经网络
  11. 解决Error #15: Initializing libiomp5.dylib, but found libomp.dylib already initialized.
  12. 联想x250为什么这么贵_外媒:联想笔记本thinkpadX250如何联想thinkpadX250价格及评价...
  13. python实例 81,82
  14. Dubbo + Zookeeper入门初探(转载)
  15. -个很个性的二本人计时
  16. c语言多个大写变小写字母,c语言大写字母转换成小写字母
  17. 经营微博的十个经典案例
  18. 高一计算机课期中考试总结反思,高一期中考试总结反思
  19. android设置主题背景为壁纸_Android 应用背景加载系统动态壁纸
  20. 【C++学习笔记】基本内置类型和变量

热门文章

  1. 【软件测试】软件测试为什么会用到Linux?
  2. 印象笔记如何分享链接_印象笔记共享问题解决经过
  3. Tomcat6 无法登陆Tomcat Manager
  4. java电影购票系统_Java Swing实现电影购票系统项目
  5. 数值分析实验报告 matlab,数值分析方法与实验基于MATLAB实现
  6. android怎么oauth2公版认证,Android中腾讯微博OAuth认证(一)---获取RequestToken
  7. python新浪微博爬虫_scrapy实现新浪微博爬虫
  8. XRHT电钢琴电子琴实训室教学管理系统配置方案
  9. redis可视化工具desktop manager
  10. 个人博客网站搭建详细视频教程和源码