
一、Streamable HTTP 传输层设计革新
1. 核心设计思想
- 协议融合:将 HTTP/1.1、HTTP/2 与 SSE 协议特性深度整合
- 动态协商:通过 HTTP Header 实现传输协议动态协商(
X-MCP-Transport
) - 流式优先:默认启用流式传输,支持半双工通信
- 背压控制:基于 HTTP/2 流级流量控制实现智能速率调节
2. 与传统 HTTP+SSE 的对比
特性 | 传统 HTTP+SSE | Streamable HTTP |
---|
协议栈 | 单一 HTTP/1.1 | HTTP/1.1/2 智能切换 |
流式支持 | 依赖特定 Content-Type | 内置流式传输层 |
多路复用 | 不支持 | HTTP/2 多路复用 |
背压控制 | 无 | 流级流量控制 |
协议协商 | 静态配置 | 动态 Header 协商 |
3. 协议栈架构
+----------------+ +-------------------+ +------------------+
| Application | | Streamable | | HTTP/2 |
| Layer (MCP) |<----| HTTP Transport |<----| Multiplexing |
| | | Layer | | (可选) |
+----------------+ +-------------------+ +------------------+| | || JSON Events | Binary Frames |v v v
+----------------+ +-------------------+ +------------------+
| TLS 1.3 | | HTTP/1.1 | | QUIC |
+----------------+ +-------------------+ +------------------+

二、Spring AI Alibaba Streamable HTTP 实现
1. 核心组件架构
2. 关键代码实现
(1) 请求处理适配器
public class StreamableRequestAdapter {private final TransportMode transportMode;private final Decoder decoder;private final Encoder encoder;public StreamableRequestAdapter(MCPRequest request) {this.transportMode = determineTransportMode(request);this.decoder = createDecoder(transportMode);this.encoder = createEncoder(transportMode);}private TransportMode determineTransportMode(MCPRequest request) {if (request.getHeader("X-MCP-Transport").equals("binary")) {return TransportMode.HTTP2;}return request.getBodySize() > 1024 * 1024 ? TransportMode.SSE : TransportMode.JSON;}
}
(2) 流式响应处理器
@RestController
@RequestMapping("/mcp/v1")
public class MCPController {@PostMapping("/execute")public void executeCommand(@RequestBody MCPRequest request,HttpServletResponse response) {boolean isStreamable = request.getHeader("Accept-Stream").contains("text/event-stream");StreamableResponseWriter writer = new StreamableResponseWriter(response);writer.setContentType(isStreamable ? "text/event-stream" : "application/json");try (StreamableContext ctx = new StreamableContext(request, writer)) {executeTool(ctx);}}private void executeTool(StreamableContext ctx) {for (int i = 0; i < 5; i++) {ctx.writeEvent(new MCPEvent().setStreamId(UUID.randomUUID().toString()).setChunk("Processing chunk " + i));}ctx.complete();}
}
3. Spring Boot 配置
spring:ai:mcp:transport:mode: AUTOhttp2:enabled: truemax-concurrent-streams: 512sse:chunk-size: 1024reconnect-interval: 5000security:enabled: truetoken: ${MCP_TOKEN:default-secret}
三、Higress 集成方案
1. 核心网关配置
http {stream {server {listen 8080;proxy_pass backend_servers;proxy_protocol on;proxy_http_version 2;}}server {listen 8081 http2;location /mcp/v1 {proxy_pass http://mcp-service;proxy_set_header X-MCP-Transport $http_x_mcp_transport;proxy_http_version 2;# 流式传输优化proxy_request_buffering off;proxy_buffering off;proxy_chunked_transfer_encoding on;# 安全策略proxy_set_header Authorization $http_authorization;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}
2. WASM 智能路由模块
module.exports = {name: 'mcp-stream-optimizer',version: '1.0.0',async requestReceived(context) {const request = context.getRequest();const headers = request.getHeaders();if (headers['x-mcp-stream'] === 'required' && headers['content-type'] === 'application/octet-stream') {context.setTransportProtocol('h2');context.setResponseHeader('X-MCP-Transport', 'binary');}}
};