微软开源的 MCP 教程「GitHub 热点速览」

微软开源的 MCP 教程「GitHub 热点速览」

引言:从 MCP 概念说起在分布式系统和微服务架构日益普及的今天,如何高效、安全地管理服务间的通信成为了开发者面临的核心挑战。MCP(Message Communication Protocol,消息通信协议)正是微软开源的一套轻量级、高性能的通信协议规范。它旨在解决传统 RPC 框架中的耦合问题,提供一种基于消息的、异步的、可扩展的通信模式。MCP 的核心设计思想是"消息即契约"。服务之间通过定义清晰的消息格式(通常为 JSON 或 Protobuf)进行交互,而不是直接调用对方的接口。这种设计带来了几个显著优势:- 解耦性 :服务无需依赖对方的具体实现,只需理解消息格式。- 可扩展性 :新增功能只需定义新消息,无需修改现有接口。- 可靠性 :消息可以持久化、重试、路由,天然支持异步处理。## 基础概念:MCP 的核心组件要理解 MCP,首先需要掌握它的三个基本组件:1. 消息(Message) :通信的基本单位,包含头部(元数据)和负载(数据)。2. 通道(Channel) :消息传输的逻辑路径,类似于消息队列中的主题(Topic)。3. 端点(Endpoint) :消息的生产者或消费者,负责发送和接收消息。微软开源的 MCP 教程在 GitHub 上提供了完整的示例代码,帮助开发者快速上手。下面我们从一个最基础的"Hello World"示例开始。### 基础示例:使用 Python 发送和接收消息python# 导入 MCP 库(假设已安装 mcp-python-sdk)from mcp import Message, Channel, Endpointimport json# 1. 创建一个消息通道channel = Channel("greeting_channel")# 2. 定义消息生产者端点class Producer(Endpoint): def send_greeting(self, name): # 构造消息:头部包含类型,负载包含数据 msg = Message( header={"type": "greeting"}, payload={"name": name} ) # 发送消息到通道 channel.publish(msg) print(f"已发送消息: {msg.payload}")# 3. 定义消息消费者端点class Consumer(Endpoint): def on_message(self, msg): # 处理接收到的消息 if msg.header.get("type") == "greeting": print(f"收到问候: 你好, {msg.payload['name']}!") else: print(f"收到未知类型消息: {msg.payload}")# 4. 实例化并测试producer = Producer()consumer = Consumer()# 消费者订阅通道consumer.subscribe(channel)# 生产者发送消息producer.send_greeting("World")代码解析 :- Channel 定义了消息的传输路径,类似于一个虚拟的消息队列。- Message 对象包含 header(头部)和 payload(负载),头部通常用于路由和类型判断。- Endpoint 是参与通信的实体,Producer 负责发送,Consumer 负责接收。- subscribe 方法让消费者监听指定通道,当有消息到达时自动触发 on_message。这个例子展示了 MCP 最核心的"发布-订阅"模式:生产者无需知道消费者的存在,消费者也只需要关心自己感兴趣的消息类型。## 进阶用法:消息路由与过滤在实际应用中,消息通常需要根据内容或头部信息进行路由。MCP 支持消息过滤机制,允许消费者只接收满足特定条件的消息。### 中级示例:实现基于条件的消息过滤pythonfrom mcp import Message, Channel, Endpoint, Filterimport random# 创建一个更复杂的通道,支持过滤channel = Channel("sensor_data", filter_enabled=True)# 生产者:模拟传感器数据class Sensor(Endpoint): def send_reading(self, sensor_id, value, unit): msg = Message( header={ "sensor_id": sensor_id, "type": "reading" }, payload={ "value": value, "unit": unit } ) channel.publish(msg) print(f"传感器 {sensor_id} 发送: {value} {unit}")# 消费者1:只接收温度传感器数据(过滤条件)class TemperatureMonitor(Endpoint): def on_message(self, msg): if msg.payload["unit"] == "celsius": print(f"温度监控器: {msg.payload['value']}°C")# 消费者2:只接收特定传感器(ID=1)的数据class SpecificSensorMonitor(Endpoint): def on_message(self, msg): print(f"传感器1监控器: ID={msg.header['sensor_id']}, 值={msg.payload['value']}")# 实例化sensor = Sensor()temp_monitor = TemperatureMonitor()specific_monitor = SpecificSensorMonitor()# 使用过滤器:只路由 unit 为 celsius 的消息temp_filter = Filter({"payload.unit": "celsius"})temp_monitor.subscribe(channel, filters=[temp_filter])# 使用过滤器:只路由 sensor_id 为 1 的消息specific_filter = Filter({"header.sensor_id": "1"})specific_monitor.subscribe(channel, filters=[specific_filter])# 模拟数据sensor.send_reading("1", 25.3, "celsius")sensor.send_reading("2", 60, "fahrenheit")sensor.send_reading("1", 22.7, "celsius")代码解析 :- Filter 对象允许基于消息的头部或负载属性进行匹配,支持点号分隔的路径访问(如 payload.unit)。- subscribe 方法接受 filters 参数,只有满足所有过滤条件的消息才会被路由到该消费者。- 这种机制非常适合物联网(IoT)场景,其中大量传感器数据需要按类型或来源分别处理。## 高级用法:消息持久化与可靠传递在分布式系统中,消息丢失是不可接受的。MCP 支持消息持久化,确保即使消费者离线,消息也不会丢失。它还提供了确认(ACK)机制,确保消息被正确处理。### 高级示例:使用持久化通道和确认机制pythonfrom mcp import Message, Channel, Endpoint, PersistenceConfigimport time# 配置持久化:消息保存到本地文件persist_config = PersistenceConfig( storage_path="./mcp_messages", max_retry=3)# 创建持久化通道channel = Channel("orders", persistence=persist_config)# 订单生产者class OrderProducer(Endpoint): def place_order(self, order_id, items): msg = Message( header={"order_id": order_id, "type": "new_order"}, payload={"items": items, "status": "pending"} ) # 发布消息,要求持久化 channel.publish(msg, persist=True) print(f"订单 {order_id} 已提交并持久化")# 订单消费者class OrderConsumer(Endpoint): def on_message(self, msg): try: # 模拟订单处理 order_id = msg.header["order_id"] items = msg.payload["items"] print(f"处理订单 {order_id}: {items}") # 模拟处理可能失败 if "error" in items: # 如果商品包含"error"则模拟失败 raise Exception("模拟处理失败") # 处理成功后发送确认 self.ack(msg) # 告诉通道消息已被成功处理 print(f"订单 {order_id} 处理完成,已确认") except Exception as e: print(f"订单处理失败: {e}") # 不发送确认,消息将被重新投递 self.nack(msg, retry_delay=2) # 2秒后重试# 实例化producer = OrderProducer()consumer = OrderConsumer()# 消费者订阅(使用自动确认模式)consumer.subscribe(channel, auto_ack=False) # 手动控制确认# 发送订单producer.place_order("ORD001", ["苹果", "香蕉"])producer.place_order("ORD002", ["error", "橘子"]) # 这个会失败# 等待处理time.sleep(5)print("\n查看持久化状态...")# 检查持久化存储for msg in channel.get_pending_messages(): print(f"待处理消息: {msg.header}")代码解析 :- PersistenceConfig 配置消息的持久化路径和最大重试次数。- publish(persist=True) 将消息保存到磁盘,防止服务重启后丢失。- auto_ack=False 让开发者手动控制消息确认。- ack(msg) 通知通道消息已成功处理,可以删除持久化副本。- nack(msg, retry_delay) 表示处理失败,通道会在指定延迟后重新投递。- 重试机制结合持久化,确保了消息的"至少一次"传递语义。## 总结通过从基础概念到高级用法的循序渐进学习,我们可以看到 MCP 协议在微服务通信中的强大能力:1. 基础层面 :MCP 通过消息、通道、端点的简单抽象,实现了服务间的松耦合通信。2. 进阶层面 :消息过滤和路由机制让系统能够灵活地处理不同类型的数据流,适用于 IoT、事件驱动架构等场景。3. 高级层面:消息持久化和确认机制保障了系统的可靠性,即使面对网络波动或服务故障,消息也不会丢失。微软开源的 MCP 教程在 GitHub 上提供了完整的文档和示例代码,是学习现代消息通信模式的绝佳资源。无论是构建简单的发布-订阅系统,还是设计复杂的分布式应用,MCP 都提供了一套轻量而强大的解决方案。作为编程讲师,我强烈建议你动手运行这些代码示例,尝试修改过滤条件、增加新的通道或实现自定义的确认逻辑。实践出真知,只有亲手调试过消息的发送、接收和重试过程,才能真正掌握 MCP 的精髓。Happy coding!

相关推荐
zhanghaha131415 小时前
Python语言基础:23_输入与输出 新手完全指南
microsoft
iMountTai15 小时前
DeepSeek-V4-Flash 接入 Codex(Windows 版)
开源
张彦峰ZYF16 小时前
全球开源大模型生态-从开放权重到开放智能系统:发展、进展、主力模型成就与方向分析
人工智能·开源·llm·agent
一点一木17 小时前
🚀 2026 年 7 月 GitHub 十大热门项目排行榜 🔥
人工智能·github
阿里嘎多学长17 小时前
2026-07-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
炸膛坦客17 小时前
Git 和 GitHub:(十三)改分支名
git·github
GitCode官方18 小时前
G-Star 精选开源项目推荐|第二十二期
开源
IvorySQL20 小时前
PG 日报|PG20 正式计划移除 refint 模块,官方指引迁移原生外键
数据库·人工智能·postgresql·开源·区块链
开源推荐官1 天前
getInvoice 是回填不是开票,Tigshop开源商城发票接口理一理
android·开源·php