SuperGateway

1- 📑 目录导航

  1. 🌐 环境准备
  2. 🛠️ MCP 服务开发详解
  3. ⚙️ SuperGateway 核心配置
  4. 🏭 企业级部署方案
  5. 🔒 监控与安全加固
  6. 🚀 实战案例:智能客服系统集成
  7. 📚 附录:协议规范与资源

2- 🌐 环境准备(全平台)

2.1- 系统要求

组件 最低配置 推荐配置
操作系统 Windows 10/Ubuntu 20.04 CentOS 8+/macOS Monterey
CPU 2 核(物理/虚拟) 4 核以上(生产环境)
内存 4GB DDR4 16GB DDR4
存储 20GB SSD 可用空间 500GB NVMe RAID0
网络 1Gbps 带宽 10Gbps 多路径冗余

2.2- 环境安装(Windows 11 图形化向导)

  1. Python 3.12 安装

    # 下载安装包(自动配置环境变量)
    Invoke-WebRequest -Uri "https://www.python.org/ftp/python/3.12.0/python-3.12.0-amd64.exe" -OutFile "$env:USERPROFILE\Downloads\python-installer.exe"
    Start-Process -FilePath "$env:USERPROFILE\Downloads\python-installer.exe" -ArgumentList "/quiet InstallAllUsers=1 PrependPath=1" -Wait
    
  2. Node.js 18.x 安装

    # 下载MSI安装包
    Invoke-WebRequest -Uri "https://nodejs.org/dist/v18.16.0/node-v18.16.0-x64.msi" -OutFile "$env:USERPROFILE\Downloads\node-installer.msi"
    Start-Process msiexec.exe -ArgumentList "/i `"$env:USERPROFILE\Downloads\node-installer.msi`" /quiet" -Wait
    
  3. uv 工具链安装

    iex ((New-Object System.Net.WebClient).DownloadString('https://astral.sh/uv/install.ps1'))
    
  4. 环境验证

    # 输出应显示最新版本
    python --version      # Python 3.12.0
    node --version        # v18.16.0
    uv --version          # uv 0.7.0
    

3- 🛠️ MCP 服务开发详解

3.1- 项目结构规范

my-mcp-service/                # 项目根目录
├── .venv/                     # Python虚拟环境
├── src/
│   ├── main.py                # 主服务入口
│   └── utils/                 # 工具函数库
├── requirements.txt           # 依赖清单
├── mcp.yaml                   # MCP配置文件
└── tests/                     # 单元测试

3.2- 高级功能实现

3.2.1- 异步数据库操作(PostgreSQL)

from fastapi import FastAPI
import databases
import sqlalchemy
from sqlalchemy import Table, Column, Integer, String, MetaData

# 数据库配置
DATABASE_URL = "postgresql://user:secret@localhost:5432/mydb"

# 初始化数据库连接
database = databases.Database(DATABASE_URL)
metadata = MetaData()

# 定义数据表
users = Table(
    "users",
    metadata,
    Column("id", Integer, primary_key=True),
    Column("username", String(32), unique=True),
    Column("email", String(128), unique=True)
)

app = FastAPI()

# 启动时连接数据库
@app.on_event("startup")
async def startup():
    await database.connect()

# 关闭时断开连接
@app.on_event("shutdown")
async def shutdown():
    await database.disconnect()

# 定义API端点
@app.get("/users/{user_id}")
async def read_user(user_id: int):
    query = users.select().where(users.c.id == user_id)
    return await database.fetch_one(query)

3.2.2- 文件上传处理(带病毒扫描)

from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import os
import hashlib
from clamav import ClamAVClient

app = FastAPI()

# 配置CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"]
)

# 文件上传处理
@app.post("/secure-upload/")
async def upload_file(file: UploadFile = File(...)):
    # 保存临时文件
    temp_path = f"/tmp/{file.filename}"
    contents = await file.read()
    with open(temp_path, "wb") as f:
        f.write(contents)
    
    # 病毒扫描
    clam = ClamAVClient()
    scan_result = clam.scan_file(temp_path)
    if scan_result['is_infected']:
        os.remove(temp_path)
        raise HTTPException(status_code=400, detail="文件包含恶意内容")
    
    # 计算哈希值
    file_hash = hashlib.sha256(contents).hexdigest()
    
    # 移动到永久存储
    final_path = f"/storage/{file_hash}"
    os.rename(temp_path, final_path)
    
    return {
        "filename": file.filename,
        "hash": file_hash,
        "size_bytes": len(contents)
    }

4- ⚙️ SuperGateway 核心配置

4.1- 生产级配置文件(gateway.yml)

server:
  port: 8443
  protocol: sse
  ssl:
    enabled: true
    cert: /etc/ssl/certs/server.crt
    key: /etc/ssl/private/server.key

transports:
  - name: weather_service
    type: stdio
    command: "python weather.py"
    routes:
      - path: /weather/v2
        method: POST
        schema:
          input:
            type: object
            properties:
              city:
                type: string
                pattern: "^[\\u4e00-\\u9fa5]{2,10}$"  # 中文城市名验证
              country:
                type: string
                enum: [CN, US, JP]
          output:
            type: string
            format: "JSON Schema 验证示例"

  - name: translation_service
    type: websocket
    address: 0.0.0.0:9000
    auth:
      type: jwt
      secret: $2b$12$EIXZ2YV/3jRyQ4Y5VZVjM1u  # bcrypt加密密钥
      audience: "mcp-service"
      issuer: "supergateway.io"

logging:
  level: DEBUG
  handlers:
    - file: /var/log/supergateway.log
      rotation: daily
      max_size: 100MB

4.2- 多协议支持配置

4.2.1- WebSocket 集群配置

npx supergateway \
  --transport ws \
  --wsPath /mcp-ws \
  --wsSubprotocols mcp.v2 \
  --messagePath /mcp-msg \
  --cluster-enabled \
  --cluster-nodes 10.0.0.1:8000,10.0.0.2:8000

4.2.2- HTTP/2 适配配置

npx supergateway \
  --stdio "python rest_adapter.py" \
  --port 8443 \
  --httpPath /api/v1 \
  --httpMethods GET,POST,PUT,DELETE \
  --httpHeaders "Content-Type: application/json" \
  --httpRateLimit 1000/minute

5- 🏭 企业级部署方案

5.1- Kubernetes 高可用部署

# 创建命名空间
kubectl create namespace mcp-system

# 部署配置(values.yaml)
replicaCount: 5
service:
  type: LoadBalancer
  loadBalancerIP: 10.0.0.100
persistence:
  enabled: true
  storageClass: gp3
  size: 100Gi
ingress:
  enabled: true
  host: gateway.example.com
  tls:
    - hosts:
        - gateway.example.com
      secretName: gateway-tls

# Helm 部署
helm repo add supergateway https://supercorp.github.io/supergateway-charts
helm upgrade --install sg-prod supergateway/supergateway -f values.yaml -n mcp-system

5.2- 多数据中心架构

[用户终端]
   │
   ▼
[全局负载均衡器] → [区域1集群] → [区域2集群] → [区域3集群]
   │                  │                  │
   ▼                  ▼                  ▼
[网关服务]         [网关服务]         [网关服务]
   │                  │                  │
   ▼                  ▼                  ▼
[微服务集群]       [微服务集群]       [微服务集群]

6- 🔒 监控与安全加固

6.1- Prometheus 监控配置

metrics:
  prometheus:
    enabled: true
    path: /prometheus-metrics
    scrapeInterval: 20s
    global:
      evaluationInterval: 30s
    rules:
      - alert: HighErrorRate
        expr: rate(http_requests_total{status="5xx"}[5m]) > 0.1
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "高错误率警报"
          description: "服务 {{ $labels.instance }} 错误率超过阈值"

6.2- 零信任安全模型

# 生成证书链
openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 365 -nodes -subj "/CN=SuperGateway CA"

# 服务端配置
openssl req -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj "/CN=api.mycorp.com"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365

# 客户端认证
curl --cert client.crt --key client.key https://api.mycorp.com

7- 🚀 实战案例:智能客服系统集成

7.1- 系统架构图

graph TD
    A[用户] --> B[API Gateway]
    B --> C{SuperGateway}
    C --> D[意图识别服务]
    C --> E[知识库查询]
    C --> F[LLM编排服务]
    D --> G[情感分析]
    E --> H[实时数据库]
    F --> I[大模型集群]
    G --> J[用户意图]
    H --> K[知识库数据]
    I --> L[生成响应]
    J --> M[最终回复]
    K --> M
    L --> M

7.2- 关键代码实现

7.2.1- 意图识别服务(带缓存)

from mcp.server.fastmcp import FastMCP
from transformers import pipeline
import redis
import json

mcp = FastMCP("intent_service")
classifier = pipeline("text-classification", model="bhadresh-savani/bert-base-uncased-emotion")
cache = redis.Redis(host='redis-cluster', port=6379, db=0)

@mcp.tool()
async def analyze_intent(text: str) -> dict:
    cache_key = f"intent:{text[:256]}"
    cached = cache.get(cache_key)
    
    if cached:
        return json.loads(cached)
    
    result = classifier(text)[0]
    response = {
        "intent": result['label'],
        "confidence": f"{result['score']:.2f}",
        "expiration": 300  # 5分钟缓存
    }
    
    cache.setex(cache_key, response['expiration'], json.dumps(response))
    return response

7.2.2- 大模型编排服务(带熔断)

from mcp.server.fastmcp import FastMCP
from fastapi import HTTPException
from circuitbreaker import circuit

mcp = FastMCP("llm_orchestrator")

@circuit(failure_threshold=5, recovery_timeout=60)
@mcp.tool()
async def generate_response(intent: str, context: dict) -> str:
    if intent == "faq":
        return "根据知识库,答案是..."
    elif intent == "support":
        return "请联系客服邮箱 [email protected]"
    else:
        raise HTTPException(status_code=400, detail="未知意图类型")

8- 📚 附录:协议规范与资源

8.1- 协议规范

8.2- 开发资源

类型 资源链接
GitHub 仓库 supercorp-ai/supergateway
示例项目 weather-demo
监控仪表盘 Grafana 模板
CLI 工具 supergateway-cli 下载地址

文档修订记录

  • v2.1 (2025-04-20) 新增企业级部署方案和零信任安全模型
  • v2.0 (2025-03-15) 重构代码示例,增加类型注解和错误处理
  • v1.5 (2025-02-28) 添加 Prometheus 监控配置和 Mermaid 图表

反馈与支持


通过本教程,您已掌握 SuperGateway 的完整技术体系。建议结合实际业务场景,从单服务验证逐步过渡到复杂系统集成。遇到问题时可优先查阅 官方知识库 或加入开发者社区交流。


9- GitHub-readme

9.1- SuperGateway 介绍

这是一个将标准输入/输出(stdio)转换为服务器发送事件(SSE)的网关工具。它允许你运行基于 stdio 的 MCP(Model Context Protocol)服务器,并通过 SSE 进行远程访问。

9.1.1- 功能特点

  • 将基于 stdio 的 MCP 服务器转换为 SSE 服务
  • 支持多个客户端同时连接
  • 自动识别和转发 JSON 格式的输出
  • 支持 CORS
  • 支持健康检查端点
  • 可配置的日志级别

9.1.2- 系统要求

  • Java 17 或更高版本
  • Maven 3.6 或更高版本

9.1.3- 构建和运行

  1. 构建项目:
cd src/java
mvn clean package
  1. 运行应用:
java -jar target/supergateway-1.0.0.jar [选项]

9.1.4- 命令行选项

  • --version: 显示版本号
  • --stdio: 要运行的 MCP 服务器命令
  • --sse: SSE URL 连接地址
  • --port: (stdio→SSE) 服务器监听端口 [默认: 8000]
  • --baseUrl: (stdio→SSE) SSE 客户端的基础 URL
  • --ssePath: (stdio→SSE) SSE 订阅路径 [默认: “/sse”]
  • --messagePath: (stdio→SSE) SSE 消息路径 [默认: “/message”]
  • --logLevel: 设置日志级别: “info” 或 “none” [默认: “info”]
  • --cors: 启用 CORS [默认: false]
  • --healthEndpoint: 添加健康检查端点,多个端点用逗号分隔
  • --help: 显示帮助信息

9.1.5- 使用示例

java -jar target/supergateway-1.0.0.jar \
  --stdio "java -jar your-mcp-server.jar" \
  --port 8000 \
  --baseUrl http://localhost:8000 \
  --ssePath /sse \
  --messagePath /message

9.1.6- API 接口

9.1.6.1- SSE 连接

  • URL: GET /sse
  • 说明:建立 SSE 连接以接收进程输出
  • 响应:服务器会返回一个 SSE 事件,包含消息发送端点

9.1.6.2- 发送消息

  • URL: POST /message?sessionId=<session_id>
  • Content-Type: application/json
  • 说明:向进程发送 JSON 格式的消息
  • 响应:
    • 200: 消息发送成功
    • 400: 无效的 JSON 消息
    • 503: 会话不存在或进程未就绪

9.1.6.3- 健康检查

  • URL: GET /health (如果配置了健康检查端点)
  • 说明:检查服务是否正常运行
  • 响应:返回 “ok”

9.1.7- 注意事项

  1. 进程输出必须是 JSON 格式才会被转发到 SSE 客户端
  2. 每个 SSE 客户端会自动获得一个唯一的 sessionId
  3. 所有消息都必须是有效的 JSON 格式
  4. 发送消息时必须使用从 SSE 连接获取的正确 sessionId
  5. MCP 服务器必须支持通过标准输入/输出进行通信