JSON-RPC:像“远程遥控器”一样调用服务

191 阅读4分钟

1. 一句话定义

JSON-RPC 是一种基于 JSON 格式的远程调用协议,允许你像调用本地函数一样,通过网络操作远程服务。它的核心是:​​“告诉服务端做什么,怎么传数据我说了算”​


2. 核心特性(用比喻理解)​

① 协议无关的“万能遥控器”​

  • 不挑设备:JSON-RPC 不依赖特定传输方式,可以跑在 HTTP、WebSocket、TCP 甚至信鸽(理论上🐦)上。
  • 核心能力:无论用哪种方式传输,只需保证数据格式是 JSON-RPC 规范。

② 方法导向的“指令集”​

  • 像遥控器按键:每个远程操作对应一个“方法名”(如 playMovieturnOffLight)。

  • 示例指令

    json
    {
      "jsonrpc": "2.0",
      "method": "startCoffeeMachine",  // 按下“煮咖啡”按钮
      "params": {"type": "Latte", "size": "Large"}, // 参数:咖啡类型和大小
      "id": 1  // 标记这是第1个请求
    }
    

③ 无状态的“临时工”​

  • 不记仇:每次请求独立,服务端不保存客户端状态。
  • 场景举例:就像每次点外卖都要重新告诉骑手地址,即使你昨天刚点过。

3. 工作原理(快递员比喻)​

请求发送流程

  1. 打包数据​(你写快递单):
    将方法名、参数按 JSON-RPC 格式封装成请求体。
  2. 选择快递公司​(传输层):
    选 HTTP、WebSocket 等“快递渠道”发送数据。
  3. 派送与处理​(服务端拆包裹):
    服务端解析 JSON,执行对应方法,返回结果。

响应示例

json
{
  "jsonrpc": "2.0",
  "result": "Coffee is ready! ☕️",  // 煮咖啡成功
  "id": 1  // 对应请求ID
}

4. 核心数据结构

请求格式

字段说明必填
jsonrpc协议版本(固定"2.0")✔️
method要调用的方法名(如 getUser✔️
params方法参数(对象或数组)
id请求标识(用于匹配响应)❌(通知类请求可省略)

响应格式

字段说明
jsonrpc协议版本(固定"2.0")
result成功时的返回结果
error失败时的错误信息(含错误码)
id对应请求的ID

5. 应用场景(什么情况用它?)​

① 复杂业务逻辑

  • 场景:需要执行多步骤操作(如电商下单:扣库存、生成订单、发短信)。
  • JSON-RPC 优势:一个请求封装复杂逻辑,避免 RESTful 多次调用。

② 实时交互系统

  • 场景:在线游戏指令、聊天消息推送。
  • 传输层选择:通过 WebSocket 实现低延迟通信。

③ 跨协议混合架构

  • 场景:物联网设备通过 TCP 上报数据 + 手机 App 通过 HTTP 控制设备。
  • JSON-RPC 优势:统一数据格式,不同协议无缝衔接。

6. 与 RESTful 的对比(点菜 vs 遥控器)​

对比维度JSON-RPCRESTful
设计哲学遥控器式操作(按按钮执行方法)菜单式操作(选资源 + 标准动作)
接口语义方法名自定义(如 launchRocket依赖 HTTP 方法(GET/POST等)
灵活性高(参数结构自由)低(需符合资源化设计)
典型场景复杂逻辑、跨协议通信简单 CRUD、标准化 API
传输层依赖不依赖(可适配任何协议)必须基于 HTTP

7. 代码示例(3 分钟上手)​

Python 客户端发送请求

python
import requests

# 调用远程方法:获取天气
response = requests.post(
    "http://api.weather.com/rpc",
    json={
        "jsonrpc": "2.0",
        "method": "getWeather",
        "params": {"city": "Beijing"},
        "id": 1
    }
)

print(response.json())  
# 输出:{"jsonrpc": "2.0", "result": "Sunny 26°C", "id": 1}

Node.js 服务端处理请求

javascript
const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'POST') {
    let body = '';
    req.on('data', chunk => body += chunk);
    req.on('end', () => {
      const request = JSON.parse(body);
      if (request.method === 'getWeather') {
        res.writeHead(200, {'Content-Type': 'application/json'});
        res.end(JSON.stringify({
          jsonrpc: "2.0",
          result: "Sunny 26°C",
          id: request.id
        }));
      }
    });
  }
});

server.listen(3000);

8. 优缺点总结

优点

  • 灵活自由:方法名、参数结构完全自定义。
  • 跨协议兼容:适配 HTTP、WebSocket、TCP 等多种传输方式。
  • 适合复杂逻辑:单次请求可封装多步骤操作。

缺点

  • 缺乏约定:方法名和参数设计依赖开发者规范,易导致混乱。
  • 不适合简单 CRUD:对资源型操作不如 RESTful 直观。

9. 什么时候不用 JSON-RPC?

  • 场景:构建公开的、标准化的资源型 API(如开放平台接口)。
  • 替代方案:选择 RESTful,利用 HTTP 语义天然易懂。

10. 总结

JSON-RPC 就像编程界的“万能遥控器”​

  • 你定义按钮(方法),它负责跨网络按下按钮。
  • 不挑设备(传输协议),但需要自己贴标签(设计接口)。
  • 适合场景:需要灵活性和复杂逻辑的远程调用,而非简单的资源管理。

记住它的核心口诀
​“方法我来定,数据我封装,传输你随意,结果返回来!”​

文章由AI生成