Skip to content

JSON-RPC 2.0 协议是一种轻量级的远程过程调用(RPC)协议,基于 JSON 格式进行数据传输。它常用于客户端与服务端之间的接口调用,具有简单、易实现、跨语言等优点。


主要特点

  • 基于 JSON:所有请求和响应都用 JSON 格式表示,易于阅读和解析。
  • 无状态:每次请求都是独立的,服务端不需要保存会话状态。
  • 双向通信:既支持客户端请求服务端,也支持服务端主动通知客户端(如推送消息)。
  • 跨语言:只要能处理 JSON,就能实现 JSON-RPC 协议。

基本结构

1. 请求(Request)

json
{
  "jsonrpc": "2.0",        // 协议版本,必须为 "2.0"
  "method": "方法名",       // 要调用的远程方法名称
  "params": { ... },       // (可选)方法参数,支持对象或数组
  "id": 1                  // 请求唯一标识,响应时会带回
}

2. 响应(Response)

json
{
  "jsonrpc": "2.0",
  "result": { ... },       // 方法调用成功时的返回结果
  "id": 1                  // 与请求中的 id 一致
}

3. 错误响应(Error)

json
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32601,
    "message": "Method not found"
  },
  "id": 1
}

4. 通知(Notification)

  • 通知与请求类似,但没有 id 字段,表示不需要响应。
json
{
  "jsonrpc": "2.0",
  "method": "event",
  "params": { ... }
}

常见应用场景

  • 微服务之间的远程调用
  • 浏览器与后端的接口通信(如 WebSocket、SSE、HTTP)
  • 各类插件、扩展协议(如 MCP Server)

参考资料


在 JSON-RPC 2.0 协议下,实现“消息推送”通常有两种方式:


1. Notification(通知)机制

JSON-RPC 2.0 支持服务端主动向客户端发送 Notification(通知),即没有 id 字段的消息。
客户端收到后无需回复,适合用来推送事件、变更等消息。

示例:

json
{
  "jsonrpc": "2.0",
  "method": "notifications/tools/list_changed",
  "params": {
    "message": "工具列表已更新"
  }
}
  • method 通常以 notifications/ 开头,表示推送事件类型。
  • params 为推送的具体内容。

2. 推送通道的实现方式

由于 HTTP 是短连接,服务端无法主动推送,常用以下方式实现“服务端主动推送”:

1)WebSocket

  • 建立 WebSocket 长连接,服务端可随时向客户端发送 JSON-RPC Notification 消息。
  • 客户端收到后解析处理即可。

2)SSE(Server-Sent Events)

  • 客户端发起 SSE 连接,服务端通过流式方式不断推送 JSON-RPC Notification 消息。

3)长轮询(Long Polling)

  • 客户端定期发起请求,服务端有新消息时返回,无新消息则等待一段时间。

3. Higress/MCP 项目中的推送实现

在 Higress MCP 相关代码中,服务端会在工具列表等发生变化时,调用如下代码推送通知:

go
s.SendNotificationToClient("notifications/tools/list_changed", nil)
  • 这会向所有已连接的客户端推送“工具列表已变更”的通知,客户端收到后可自动刷新工具列表。

4. 客户端如何处理推送

  • 客户端需实现 WebSocket/SSE 客户端,持续监听服务端消息。
  • 收到 Notification 后,根据 method 字段判断事件类型,做相应处理(如刷新 UI、弹窗提示等)。

5. 小结

  • 推送消息格式:JSON-RPC Notification(无 id 字段)
  • 推送通道:WebSocket、SSE、长轮询等
  • 典型场景:配置变更、数据更新、事件通知等

✨ 网站运行时间: 3年11月15天 ❤️ 道阻且长,行则将至 - 微信号: heikedreamer