架构概览#

本文档描述 Cloud Native MCP Server 的整体架构、设计原则和部署模式。

系统架构#

Cloud Native MCP Server 采用分层架构设计,从上到下分为:

1. 客户端层#

支持多种客户端类型:

  • Claude Desktop: Anthropic 的官方桌面客户端
  • Web Browser: 通过浏览器访问
  • Custom MCP Clients: 自定义的 MCP 客户端

客户端通过 MCP 协议与服务器通信,支持以下传输方式:

  • SSE (Server-Sent Events): 实时事件推送
  • Streamable-HTTP: 流式 HTTP 响应

2. HTTP 服务器层#

处理传入的 HTTP/SSE 请求和连接:

  • 路由层: 动态路由注册,路径参数解析,查询参数验证
  • 中间件层: 认证、审计、速率限制、安全、指标收集
  • 健康检查: 优雅关闭,健康检查端点

3. 服务管理层#

管理所有注册的服务和工具:

  • 服务注册和发现: 自动注册和发现服务
  • 工具调用路由: 将请求路由到正确的服务
  • 服务生命周期管理: 初始化、健康检查、关闭
  • 健康检查协调: 协调各服务的健康检查

4. 基础设施层#

提供共享的基础设施服务:

  • 缓存层: LRU 缓存,分段缓存,TTL 支持
  • 密钥管理: 安全存储,密钥轮换,密钥生成
  • 日志系统: 结构化日志,多级别,JSON 和文本格式
  • 指标系统: Prometheus 格式,请求计数,延迟统计

5. 外部服务层#

集成的云原生服务:

  • Kubernetes: 容器编排平台
  • Grafana: 可视化平台
  • Prometheus: 指标监控
  • Kibana: 日志分析
  • Elasticsearch: 搜索引擎
  • Alertmanager: 告警管理
  • Jaeger: 分布式追踪
  • OpenTelemetry: 遥测收集

设计原则#

1. 模块化#

每个服务都是独立的模块,可以单独启用/禁用:

1
2
3
enableDisable:
  enabledServices: ["kubernetes", "helm", "prometheus"]
  disabledServices: ["elasticsearch", "kibana"]

优势:

  • 降低耦合度
  • 提高可维护性
  • 支持按需启用服务

2. 可扩展性#

易于添加新服务:

  1. 创建服务目录
  2. 实现服务接口
  3. 注册工具
  4. 配置选项

服务接口:

1
2
3
4
5
6
7
8
type Service interface {
    Name() string
    Initialize(config interface{}) error
    GetTools() []mcp.Tool
    CallTool(ctx context.Context, name string, arguments map[string]interface{}) (interface{}, error)
    HealthCheck() error
    Shutdown() error
}

3. 配置驱动#

所有行为都通过配置控制:

  • 服务启用/禁用
  • 认证方式
  • 缓存策略
  • 日志级别

配置优先级:

  1. 命令行参数(最高)
  2. 环境变量
  3. YAML 配置文件(最低)

4. 故障隔离#

服务故障不会影响其他服务:

1
2
3
4
5
6
func (s *Service) HealthCheck() error {
    if err := s.client.Ping(); err != nil {
        return fmt.Errorf("service unavailable: %w", err)
    }
    return nil
}

优势:

  • 提高系统稳定性
  • 防止级联故障
  • 便于问题定位

5. 优雅降级#

服务不可用时返回友好错误:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "error": {
    "code": "SERVICE_UNAVAILABLE",
    "message": "Grafana service is temporarily unavailable",
    "details": {
      "service": "grafana",
      "retry_after": "30s"
    }
  }
}

服务集成#

服务接口#

所有服务都实现统一的接口:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
type Service interface {
    // 服务名称
    Name() string

    // 初始化服务
    Initialize(config interface{}) error

    // 获取工具列表
    GetTools() []mcp.Tool

    // 调用工具
    CallTool(ctx context.Context, name string, arguments map[string]interface{}) (interface{}, error)

    // 健康检查
    HealthCheck() error

    // 关闭服务
    Shutdown() error
}

服务注册#

服务在启动时自动注册:

1
2
3
4
5
6
7
registry := services.NewRegistry()

// 注册服务
registry.Register(kubernetes.NewService())
registry.Register(grafana.NewService())
registry.Register(prometheus.NewService())
// ... 其他服务

工具调用流程#

  1. 客户端发送工具调用请求
  2. 路由层解析请求,确定服务和工具
  3. 中间件层执行认证、审计等
  4. 服务管理器路由到正确的服务
  5. 缓存层检查缓存
  6. 服务执行工具调用
  7. 结果返回给客户端
  8. 审计日志记录操作

扩展性#

添加新服务#

  1. 创建服务目录
1
mkdir internal/services/myservice
  1. 实现服务接口
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package myservice

type Service struct {
    config Config
    client *Client
}

func NewService() *Service {
    return &Service{}
}

func (s *Service) Name() string {
    return "myservice"
}

func (s *Service) Initialize(config interface{}) error {
    s.config = config.(Config)
    s.client = NewClient(s.config)
    return nil
}

func (s *Service) GetTools() []mcp.Tool {
    return []mcp.Tool{
        {
            Name:        "get_data",
            Description: "Get data from MyService",
            InputSchema: map[string]interface{}{
                "type": "object",
                "properties": map[string]interface{}{
                    "id": map[string]interface{}{
                        "type":        "string",
                        "description": "Data ID",
                    },
                },
                "required": []string{"id"},
            },
        },
    }
}

func (s *Service) CallTool(ctx context.Context, name string, args map[string]interface{}) (interface{}, error) {
    switch name {
    case "get_data":
        return s.GetData(ctx, args["id"].(string))
    default:
        return nil, fmt.Errorf("unknown tool: %s", name)
    }
}

func (s *Service) HealthCheck() error {
    return s.client.Ping()
}

func (s *Service) Shutdown() error {
    return s.client.Close()
}
  1. 注册服务
1
2
// cmd/server/server.go
registry.Register(myservice.NewService())
  1. 添加配置
1
2
3
4
myservice:
  enabled: false
  url: "http://myservice:8080"
  apiKey: "${MYSERVICE_API_KEY}"

部署架构#

单节点部署#

┌─────────────────┐
│   MCP Server    │
│  (All Services) │
└────────┬────────┘
         │
         ├─> Kubernetes
         ├─> Grafana
         ├─> Prometheus
         └─> ...

适用场景:

  • 开发环境
  • 测试环境
  • 小规模部署

多节点部署#

┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│  MCP Node 1  │  │  MCP Node 2  │  │  MCP Node 3  │
└──────┬───────┘  └──────┬───────┘  └──────┬───────┘
       │                 │                 │
       └─────────────────┴─────────────────┘
                         │
                         ▼
              ┌──────────────────┐
              │   Load Balancer  │
              └────────┬─────────┘
                       │
                       ▼
              ┌──────────────────┐
              │  External Services│
              └──────────────────┘

适用场景:

  • 生产环境
  • 高可用性要求
  • 高并发场景

微服务部署#

┌──────────────┐  ┌──────────────┐  ┌──────────────┐
│  MCP Gateway │  │  MCP Service │  │  MCP Service │
│   (Router)   │  │  (Kubernetes) │  │   (Grafana)  │
└──────┬───────┘  └──────────────┘  └──────────────┘
       │
       ▼
┌──────────────────┐
│  Service Mesh    │
│  (mTLS, Routing) │
└──────────────────┘

适用场景:

  • 大规模部署
  • 服务间通信加密
  • 高级路由和流量管理

相关文档#