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、长轮询等
- 典型场景:配置变更、数据更新、事件通知等