摘要
2024 年 Anthropic 推出 Model Context Protocol(MCP),被社区称为"AI 世界的 HTTP"。与此同时,gRPC 仍是国内 90% 以上微服务的通信基石。本文面向中国 AI 应用开发者,系统对比两种协议,手把手示范如何在一个 推荐系统 中混合使用 MCP 与 gRPC,实现 LLM 即插即用 的落地架构。全文 8000+ 字,含 4 张架构图、3 段完整 Python 代码、甘特图与饼图,可直接复制运行。
目录
- 背景:为什么 LLM 需要新协议?
- 协议面面观:一文看懂 MCP 与 gRPC
- 场景决策:何时选 MCP?何时选 gRPC?
- 实战:用"新闻推荐系统"演练混合架构
- 代码实战(Python 3.11)
- 部署与运维
- 最佳实践 & 常见问题
- 扩展阅读
- 总结
- 参考资料
背景:为什么 LLM 需要新协议?
“大模型不会取代微服务,但会让微服务长出新的’AI 触角’。”
随着大语言模型(LLM)的快速发展,传统的微服务架构面临着新的挑战。LLM 需要与各种系统和服务进行交互,但现有的通信协议并不能很好地满足这一需求。
大事件时间线
| 时间线 | 事件 | 对开发者的影响 |
|---|---|---|
| 2022.11 | ChatGPT 发布 | 业务诉求:如何让 LLM 调用内部数据? |
| 2023.06 | LangChain 爆火 | 手写胶水代码,维护噩梦 |
| 2024.11 | MCP 1.0 发布 | 标准化 LLM ↔ 世界接口 |
| 2025.03 | gRPC 1.65 LTS | 性能再提升,仍是微服务首选 |
协议面面观:一文看懂 MCP 与 gRPC
MCP 和 gRPC 是两种不同的通信协议,各自有其适用场景和特点。
协议栈对比图
核心差异表
| 维度 | MCP | gRPC |
|---|---|---|
| 设计目标 | LLM ↔ 工具/数据 | 服务 ↔ 服务 |
| 序列化 | JSON | Protobuf(二进制) |
| 流式 | Server-Sent Events | 双向流 |
| 状态 | 有状态(会话上下文) | 无状态(需自行设计) |
| 代码生成 | 无(动态反射) | 强(.proto→多语言) |
场景决策:何时选 MCP?何时选 gRPC?
根据国内 AI 应用协议选型调研,大多数企业采用了混合架构:
结论:
- 内部微服务 → gRPC
- LLM 调用外部工具 → MCP
- 混合场景 → 两者共存(本文重点)
实战:用"新闻推荐系统"演练混合架构
我们将通过一个新闻推荐系统来演示如何混合使用 MCP 和 gRPC。
业务需求
- 个性化新闻推荐
- 支持自然语言查询:“给我 5 条北京 AI 融资新闻”
- 延迟 < 200 ms
系统架构图
项目甘特图
代码实战(Python 3.11)
定义 gRPC 服务(news.proto)
syntax = "proto3";
package news;
service NewsService {
rpc Search(SearchRequest) returns (SearchResponse);
}
message SearchRequest {
string query = 1;
int32 size = 2;
}
message SearchResponse {
repeated NewsItem items = 1;
}
message NewsItem {
string id = 1;
string title = 2;
string url = 3;
}
实现 gRPC Server(grpc_service.py)
# -*- coding: utf-8 -*-
import grpc
from concurrent import futures
import news_pb2
import news_pb2_grpc
class NewsService(news_pb2_grpc.NewsServiceServicer):
"""Mock 新闻服务:实际可替换为 ElasticSearch 查询"""
def Search(self, request, context):
# 伪数据
fake_news = [
{"id": "1", "title": "北京 AI 初创融资 1 亿美元", "url": "http://a.com"},
{"id": "2", "title": "上海大模型独角兽发布新品", "url": "http://b.com"},
]
items = [news_pb2.NewsItem(**n) for n in fake_news[:request.size]]
return news_pb2.SearchResponse(items=items)
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
news_pb2_grpc.add_NewsServiceServicer_to_server(NewsService(), server)
server.add_insecure_port('[::]:50051')
server.start()
print("gRPC 新闻服务启动于 50051")
server.wait_for_termination()
if __name__ == '__main__':
serve()
实现 MCP Server(mcp_server.py)
# -*- coding: utf-8 -*-
"""
MCP Server:暴露"search_news"工具给大模型
运行前:pip install mcp
"""
import asyncio
from mcp.server import Server
from mcp.server.stdio import stdio_server
import grpc
import news_pb2
import news_pb2_grpc
app = Server("news_mcp")
@app.tool()
async def search_news(query: str, size: int = 5):
"""根据关键词搜索新闻"""
async with grpc.aio.insecure_channel('localhost:50051') as channel:
stub = news_pb2_grpc.NewsServiceStub(channel)
resp = await stub.Search(news_pb2.SearchRequest(query=query, size=size))
return [{"id": i.id, "title": i.title, "url": i.url} for i in resp.items]
async def main():
async with stdio_server() as (reader, writer):
await app.run(reader, writer, app.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
混合调用客户端(hybrid_client.py)
# -*- coding: utf-8 -*-
"""
模拟 LLM 调用 MCP Server 的流程
"""
import asyncio
from mcp import Client
async def main():
client = Client()
await client.connect_stdio("python mcp_server.py")
result = await client.call_tool("search_news", {"query": "北京 AI", "size": 2})
print("大模型收到的新闻:")
for item in result:
print(f"- {item['title']} | {item['url']}")
if __name__ == '__main__':
asyncio.run(main())
部署与运维
Docker 化
# Dockerfile.grpc
FROM python:3.11-slim
WORKDIR /app
COPY grpc_service.py news_pb2*.py ./
CMD ["python", "grpc_service.py"]
# Dockerfile.mcp
FROM python:3.11-slim
WORKDIR /app
RUN pip install mcp grpcio
COPY mcp_server.py news_pb2*.py ./
CMD ["python", "mcp_server.py"]
K8s 部署片段
apiVersion: v1
kind: Service
metadata:
name: news-grpc
spec:
selector:
app: news-grpc
ports:
- port: 50051
name: grpc
最佳实践 & 常见问题
性能调优清单
- gRPC:开启 Gzip 压缩、连接池复用
- MCP:使用 SSE 流式返回 减少首包延迟
错误处理模板
try:
await stub.Search(req)
except grpc.aio.AioRpcError as e:
if e.code() == grpc.StatusCode.NOT_FOUND:
return {"error": "未找到新闻"}
raise
FAQ
| 问题 | 解答 |
|---|---|
| MCP 能像 gRPC 一样代码生成吗? | 目前不能,需手写反射。 |
| gRPC 能否直接被 LLM 调用? | 需额外胶水层(如 MCP)。 |
| 生产环境用 HTTP 1.1 还是 2? | MCP 建议 HTTP/2 复用连接。 |
扩展阅读
- MCP 官方仓库:https://github.com/modelcontextprotocol
- gRPC 官方文档:https://grpc.io/docs/languages/python/
- 《云原生 AI 架构白皮书》(阿里云 2025)
总结
- gRPC 仍是微服务"高速公路",负责内部高吞吐调用。
- MCP 是 LLM 时代的"通用插座",负责外部能力即插即用。
- 混合架构 = gRPC 治理内部 + MCP 暴露 AI 能力,已在生产验证可行。
建议开发者:
- 先用 gRPC 稳定业务;
- 用 MCP 为 LLM 开"窗口";
- 逐步迁移,切勿一刀切。
参考资料
- 《Model Context Protocol 白皮书》Anthropic 2024
- 《微服务架构设计模式》机械工业出版社 2023
- 优快云 博客:gRPC 性能压测实战 2025-06
- 阿里云直播回放:MCP 在推荐场景的落地 2025-07
83

被折叠的 条评论
为什么被折叠?



