现在要开始做一个新的业务模块了,系统思考下 新的业务模式应该是采用 JSON-RPC 2.0 还是 老套路 REST API 的接口协议 ,系统的学习下
1. 基本概念
JSON-RPC 2.0
- 无状态的、轻量级的远程过程调用(RPC)协议
- 使用 JSON 作为数据格式
- 所有调用通过发送 JSON 对象完成
- 主要关注"动作"和"过程"
- 版本号固定为 “2.0”
REST
- 表述性状态转移(Representational State Transfer)
- 基于 HTTP 协议的架构风格
- 以资源为中心
- 使用标准 HTTP 方法操作资源
- 无版本概念,依赖 HTTP 协议
2. 请求格式对比
JSON-RPC 2.0 请求格式
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
}
REST 请求格式
GET /api/v1/users/123
POST /api/v1/users
PUT /api/v1/users/123
DELETE /api/v1/users/123
3. 主要特点对比
JSON-RPC 2.0 特点
- 请求/响应格式固定
- 支持批量请求
- 支持通知(无需响应)
- 统一的错误处理机制
- 方法名自定义
- 所有操作都是 POST 请求
REST 特点
- 使用 HTTP 方法语义
- 以资源为中心
- 利用 HTTP 状态码
- 支持缓存机制
- URL 表达资源
- 支持多种 HTTP 方法
4. 适用场景
JSON-RPC 2.0 适合:
- 复杂业务逻辑处理
- 微服务间通信
- 需要批量操作
- 事件驱动系统
- 内部API系统
REST 适合:
- 资源的 CRUD 操作
- 需要缓存的场景
- 公开 API 接口
- 标准的 Web 服务
- 面向用户的 API
5. 示例代码
JSON-RPC 2.0 示例
单个请求:
{
"jsonrpc": "2.0",
"method": "createUser",
"params": {
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
},
"id": 1
}
批量请求:
[
{"jsonrpc": "2.0", "method": "getUser", "params": [1], "id": "1"},
{"jsonrpc": "2.0", "method": "getUser", "params": [2], "id": "2"}
]
REST 示例
创建资源:
POST /api/users
Content-Type: application/json
{
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}
批量操作:
POST /api/users/batch
Content-Type: application/json
{
"users": [
{"name": "张三", "age": 25},
{"name": "李四", "age": 30}
]
}
6. 优缺点对比
特性 | JSON-RPC 2.0 | REST |
---|---|---|
优点 | • 协议简单,易实现 • 支持批量请求 • 明确的错误处理 • 支持通知机制 • 适合复杂业务逻辑 |
• 简单直观 • 优秀的缓存机制 • 良好的可扩展性 • 丰富的工具支持 • 符合 HTTP 语义 |
缺点 | • 不如 REST 直观 • 缓存机制较弱 • 工具支持较少 • 不符合 HTTP 语义 |
• 复杂业务支持不友好 • URL 设计可能复杂 • 某些操作难以表示 • 可能需要多个请求 |
7. 安全性对比
安全特性 | JSON-RPC 2.0 | REST |
---|---|---|
认证机制 | 需要自行实现认证 | 标准 HTTP 认证 |
加密支持 | 可使用 HTTPS 加密 | HTTPS 加密 |
权限控制 | 需要方法级权限控制 | OAuth/JWT 支持 |
错误处理 | 统一的错误处理 | HTTP 状态码错误处理 |
8. 性能特性对比
性能特性 | JSON-RPC 2.0 | REST |
---|---|---|
请求优化 | 批量请求优化 | HTTP 缓存机制 |
开销控制 | 通知机制减少开销 | 条件请求 |
数据处理 | 自定义压缩机制 | 资源压缩 |
连接管理 | 连接复用 | 连接池化 |
9. 开发工具支持对比
工具特性 | JSON-RPC 2.0 | REST |
---|---|---|
工具生态 | 工具相对较少 | 丰富的工具生态 |
文档支持 | 需要自定义文档 | Swagger/OpenAPI 支持 |
测试工具 | 基础测试工具 | Postman 等测试工具 |
代码生成 | 客户端生成简单 | 完善的代码生成工具 |
10. 选择建议
选择 JSON-RPC 2.0 的情况:
- 内部服务间通信
- 复杂业务逻辑处理
- 需要批量操作
- 性能要求高的场景
选择 REST 的情况:
- 公开 API 接口
- 标准的 CRUD 操作
- 需要好的缓存机制
- 需要良好的工具支持
混合使用的情况:
- REST 用于资源操作
- JSON-RPC 用于复杂业务逻辑
- 根据具体场景选择合适的方式
11. 大模型 MCP (Model Context Protocol) 案例分析
11.1 为什么 MCP 选择 JSON-RPC 2.0
MCP(Model Context Protocol)是大模型与工具交互的协议。它选择 JSON-RPC 2.0 而不是 RESTful API 有其深层的技术考虑:
11.2 大模型通信的特殊需求
// MCP 典型的函数调用请求
{
"jsonrpc": "2.0",
"method": "mcp_sequential_thinking_sequentialthinking",
"params": {
"thought": "分析当前问题...",
"nextThoughtNeeded": true,
"thoughtNumber": 1,
"totalThoughts": 5
},
"id": 1
}
主要原因:
- 需要复杂的上下文传递
- 需要流式思考过程
- 需要支持函数调用链
- 需要支持异步操作
- 需要处理大量的结构化数据
11.3 函数调用特性
// 函数调用链示例
{
"jsonrpc": "2.0",
"method": "mcp_webresearch_search_google",
"params": {
"query": "最新 AI 发展",
"explanation": "搜索最新 AI 发展动态"
},
"id": "search_1"
}
// 后续的函数调用
{
"jsonrpc": "2.0",
"method": "mcp_webresearch_visit_page",
"params": {
"url": "https://example.com/ai-news",
"takeScreenshot": true
},
"id": "visit_1"
}
优势:
- 函数调用的自然表达
- 参数传递的灵活性
- 调用链的清晰表达
- 错误处理的统一性
11.4 流式思考过程的支持
// 连续思考过程
{
"jsonrpc": "2.0",
"method": "mcp_sequential_thinking_sequentialthinking",
"params": {
"thought": "第一步:理解问题本质",
"thoughtNumber": 1,
"totalThoughts": 3,
"nextThoughtNeeded": true
},
"id": "thought_1"
}
// 下一个思考步骤
{
"jsonrpc": "2.0",
"method": "mcp_sequential_thinking_sequentialthinking",
"params": {
"thought": "第二步:分析可能的解决方案",
"thoughtNumber": 2,
"totalThoughts": 3,
"nextThoughtNeeded": true
},
"id": "thought_2"
}
11.5 工具调用的灵活性
// 文件系统操作
{
"jsonrpc": "2.0",
"method": "mcp_filesystem_read_file",
"params": {
"path": "docs/example.md"
},
"id": "read_1"
}
// 命令行操作
{
"jsonrpc": "2.0",
"method": "mcp_desktop_commander_execute_command",
"params": {
"command": "ls -l",
"timeout_ms": 5000
},
"id": "cmd_1"
}
11.6 错误处理机制
// 统一的错误响应格式
{
"jsonrpc": "2.0",
"error": {
"code": -32000,
"message": "工具调用失败",
"data": {
"tool": "mcp_filesystem_read_file",
"reason": "文件不存在"
}
},
"id": "read_1"
}
11.7 上下文管理
// 维护对话上下文
{
"jsonrpc": "2.0",
"method": "mcp_context_manager",
"params": {
"conversation_id": "conv_123",
"user_query": "分析问题",
"system_context": {
"tools_available": ["tool1", "tool2"],
"user_info": {"os": "darwin", "shell": "/bin/zsh"}
}
},
"id": "ctx_1"
}
11.8 为什么特别适合 MCP
结构化通信:
- 清晰的方法调用
- 规范的参数传递
- 统一的响应格式
工具调用链:
- 支持连续调用
- 保持上下文一致
- 错误传播清晰
异步操作支持:
- 支持长时间运行的操作
- 支持并行工具调用
- 支持事件通知
性能考虑:
- 协议开销小
- 批量操作支持
- 连接复用
11.9 实际应用优势
// 工具调用示例
{
"jsonrpc": "2.0",
"method": "codebase_search",
"params": {
"query": "查找相关代码",
"explanation": "搜索代码库中的相关实现"
},
"id": "search_1"
}
// 文件编辑示例
{
"jsonrpc": "2.0",
"method": "edit_file",
"params": {
"target_file": "src/main.py",
"instructions": "添加新功能",
"code_edit": "// ... existing code ..."
},
"id": "edit_1"
}
11.10 MCP 选择 JSON-RPC 2.0 的核心原因
协议特性匹配:
- 适合函数调用模式
- 支持复杂参数传递
- 统一的错误处理
实现简单:
- 协议规范清晰
- 实现成本低
- 调试方便
性能优势:
- 低协议开销
- 支持批量操作
- 连接复用
功能完备:
- 支持异步操作
- 支持通知机制
- 支持双向通信
特别适合 AI 工具调用:
- 清晰的方法调用
- 结构化的参数
- 统一的错误处理
- 支持链式操作
这些特性使得 JSON-RPC 2.0 成为大模型 MCP 协议的理想选择,能够很好地支持 AI 模型与各种工具之间的交互通信需求。