1.JSON-RPC,是一个无状态且轻量级的远程过程调用(RPC)传送协议,其传递内容透过 JSON 为主,相对于一般的HTTP请求通过URI调用远程服务器,JSON-RPC直接在内容中定义了要调用的函数名称(如 {“method”: “sum”}),对于开发者来说非常的方便。Bitcoin和Ethereum都支持JSON-RPC通过客户端直接调用节点上的函数或方法。
2.RPC架构
2.1服务端要做如下工作:
1)、服务端需要注册可以被远程访问的对象
2)、创建网络监听器,等待发过来的请求
3)、获取发送来的请求
4)、处理发送来的请求
2.2.客户端要做如下工作:
1)、创建连接
2)、创建客户端
3)、客户端通过连接向服务端发送请求
2.3常见的RPC框架
dubbo: 阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。
motan: 新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。
rpcx: Go语言生态圈的Dubbo,比Dubbo更轻量,实现了Dubbo的许多特性,借助于Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的RPC服务。
gRPC: Google开发的高性能、通用的开源RPC框架,主要面向移动应用开发并基于HTTP2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。
thrift: Apache的一个跨语言的高性能的服务框架
3.JSON-RPC请求
一个2.0的JSON-RPC的请求必须包含以下4个字段。
jsonrpc: 指定JSON-RPC的版本,必须设置为2.0
id: 调用标识符,用于标示一次远程调用过程,值必须包含一个字符串、数值。
method: 所要调用方法名称的字符串
params: 方法传入的参数,若无参数则传入空[]
4.JSON-RPC响应
当发起一个RPC调用时,除通知之外服务端都必须有响应,响应表示为一个JSON对象包含以下几个字段。
jsonrpc: 指定JSON-RPC的版本,固定为为2.0
id: 调用标识符,用于标示一次远程调用过程,值必须包含一个字符串、数值。
result: 如果调用成功则显示响应结果
error: 如果调用失败则显示错误的信息,error带有以下几个字段
code: 错误类型,必须为整数 【必须】
message: 错误的简单描述字,该描述应尽量简短 【必须】
data: 包含关于错误附加信息的基本类型或结构化类型 【可选】
5.JSON-RPC错误码
-32700: Parse error语法解析错误 (服务端接收到无效的json。该错误发送于服务器尝试解析json文本)
-32600: Invalid Request (发送的json不是一个有效的请求对象)
-32601: Method not found (该方法不存在或无效)
-32602: Invalid params (无效的方法参数)
-32603: Internal error (JSON-RPC内部错误)
-32000 ~ -32099: Server error (预留用于自定义的服务器错误)
-32768 ~ -32000: 保留的预定义错误代码, 保留下列以供将来使用