1. 项目概述
MCP(Microservice Control Plane)是微服务架构中的核心控制组件,负责服务注册、配置管理和状态监控。作为一名长期从事微服务开发的工程师,我发现很多中小型项目并不需要复杂的服务网格方案,用Python+Flask就能快速搭建一个轻量级的MCP服务。
这个方案特别适合以下场景:
- 团队刚开始微服务化转型,需要快速验证架构可行性
- 项目规模在10-20个服务节点之间
- 对高并发要求不高(QPS<1000)
- 需要快速落地基础服务治理能力
我选择Flask而不是FastAPI主要基于三点考虑:
- 学习曲线更平缓,团队成员上手快
- 同步模型在中小规模场景下完全够用
- 生态成熟,遇到问题容易找到解决方案
2. 环境准备与工具选型
2.1 Python版本选择
推荐使用Python 3.8+,我个人实测3.9.7版本最稳定。需要注意:
- 3.10+版本某些依赖包可能兼容性问题
- 3.7及以下版本已结束主流支持
- Windows环境下建议使用WSL2开发
安装核心依赖时建议锁定版本:
pip install flask==2.3.3 python-dotenv==1.0.0生产环境强烈建议加上Gunicorn作为WSGI服务器:
pip install gunicorn==21.2.0
2.2 工程结构设计
采用极简目录结构,避免过度设计:
mcp-service/ ├── .env # 环境配置 ├── main.py # 入口+路由 └── core.py # 业务逻辑这种结构的优势在于:
- 新人能快速理解项目全貌
- 修改时文件定位直观
- 部署时无需复杂配置
3. 核心模块实现
3.1 配置管理设计
.env文件配置示例:
# 开发环境配置 MCP_PORT=8000 MCP_ENV=dev REGISTER_EXPIRE=3600在core.py中实现配置加载:
from dotenv import load_dotenv import os load_dotenv() # 加载.env配置 class MCPCore: def __init__(self): self.expire = int(os.getenv('REGISTER_EXPIRE', 3600)) # 其他初始化...3.2 服务注册实现
内存存储方案虽然简单,但需要注意:
- 服务信息要包含更新时间戳
- 需要定期清理过期服务
- 生产环境应该改用Redis
核心代码实现:
import time class MCPCore: def __init__(self): self.services = {} # 服务注册表 def register_service(self, node_id, service_info): """服务注册方法""" if not self._validate_service_info(service_info): raise ValueError("Invalid service info") self.services[node_id] = { "info": service_info, "update_time": int(time.time()) } def _validate_service_info(self, info): """验证必填字段""" required = ["service_name", "service_port", "version"] return all(k in info for k in required)3.3 状态监控设计
状态上报接口需要处理:
- 基础资源指标(CPU/内存)
- 业务指标(请求量/错误率)
- 时间戳记录
实现示例:
class MCPCore: def __init__(self): self.status = {} # 状态存储 def report_status(self, node_id, status_data): """状态上报方法""" if not status_data: raise ValueError("Status data required") status_data["update_time"] = int(time.time()) self.status[node_id] = status_data4. 接口开发实战
4.1 Flask路由配置
main.py中的接口实现要点:
- 使用蓝图(BP)组织路由
- 统一错误处理
- 参数校验前置
完整示例:
from flask import Flask, request, jsonify from core import MCPCore app = Flask(__name__) mcp_core = MCPCore() @app.route("/mcp/config/<node_id>", methods=["POST"]) def set_node_config(node_id): try: conf = request.get_json() if not conf: raise ValueError("配置不能为空") mcp_core.set_config(node_id, conf) return jsonify({"code": 200, "msg": "OK"}) except Exception as e: return jsonify({"code": 400, "msg": str(e)}), 4004.2 接口测试方案
开发阶段测试建议:
- 使用Postman或curl手动测试
- 编写pytest自动化测试
- 利用Flask测试客户端
curl测试示例:
# 服务注册测试 curl -X POST http://localhost:8000/mcp/registry/node-01 \ -H "Content-Type: application/json" \ -d '{"service_name":"order-service","service_port":8080,"version":"1.0.0"}'5. 生产环境部署
5.1 Gunicorn配置
生产启动命令:
gunicorn -w 4 -b 0.0.0.0:8000 --access-logfile - main:app参数说明:
- -w 4:启动4个worker进程
- -b:绑定地址和端口
- --access-logfile:输出访问日志到标准输出
5.2 性能优化建议
- 增加Nginx反向代理
- 启用Gunicorn的gevent worker
- 对高频接口添加缓存
优化后的启动命令:
gunicorn -k gevent -w 8 -b 0.0.0.0:8000 main:app6. 常见问题排查
6.1 端口冲突问题
解决方案:
# 查找占用进程 lsof -i :8000 # 终止进程 kill -9 <PID>6.2 跨域问题处理
添加CORS支持:
from flask_cors import CORS app = Flask(__name__) CORS(app, resources={r"/mcp/*": {"origins": "*"}})6.3 依赖冲突解决
建议使用虚拟环境:
python -m venv venv source venv/bin/activate pip install -r requirements.txt7. 进阶优化方向
持久化存储:将内存存储替换为Redis
import redis r = redis.Redis(host='localhost', port=6379, db=0)服务发现:实现基于HTTP的简单服务发现
@app.route("/mcp/discovery/<service_name>") def service_discovery(service_name): services = [s for s in mcp_core.services.values() if s["info"]["service_name"] == service_name] return jsonify(services)健康检查:添加主动健康检查机制
def check_health(): now = time.time() for node_id, service in list(mcp_core.services.items()): if now - service["update_time"] > mcp_core.expire: del mcp_core.services[node_id]
在实际项目中,这套方案已经支撑了我们20+微服务的稳定运行。关键是要根据业务规模适时升级架构,当QPS超过2000时建议考虑更专业的服务网格方案。