发布时间:2026/7/28 2:20:34
xml<dependencies> <!-- Solon AI 核心 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon-ai</artifactId> <version>2.8.1</version> </dependency> <!-- MCP 协议支持 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon-ai-mcp</artifactId> <version>2.8.1</version> </dependency> <!-- 流式响应支持 --> <dependency> <groupId>org.noear</groupId> <artifactId>solon-ai-stream</artifactId> <version>2.8.1</version> </dependency></dependencies>## 第二步:实现 Streamable MCP 服务我们构建一个天气查询工具,支持流式返回结果(逐步输出城市、温度、湿度信息)。java// 1. 定义工具接口 - WeatherTool.javaimport org.noear.solon.ai.tool.ToolProvider;import org.noear.solon.ai.tool.annotation.Tool;import org.noear.solon.ai.tool.annotation.ToolParam;import org.noear.solon.ai.stream.StreamEmitter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 天气查询工具 - 支持流式输出 */@ToolProviderpublic class WeatherTool { private static final Logger log = LoggerFactory.getLogger(WeatherTool.class); /** * 查询指定城市的天气信息(流式输出) * @param city 城市名称(如:北京) * @param emitter 流式发射器,用于逐步返回数据 */ @Tool(name = "get_weather_stream", description = "获取指定城市的天气信息,支持流式返回") public void getWeather( @ToolParam(description = "城市名称,如'北京'") String city, StreamEmitter emitter) { log.info("开始查询城市天气: {}", city); // 模拟逐步获取数据的过程 try { // 步骤1:返回城市信息 emitter.emit("{\"type\":\"city\",\"data\":\"" + city + "\"}\n"); Thread.sleep(500); // 模拟网络延迟 // 步骤2:返回温度 double temp = 25.0 + Math.random() * 10; emitter.emit("{\"type\":\"temperature\",\"data\":\"" + String.format("%.1f", temp) + "°C\"}\n"); Thread.sleep(500); // 步骤3:返回湿度 int humidity = 40 + (int)(Math.random() * 40); emitter.emit("{\"type\":\"humidity\",\"data\":\"" + humidity + "%\"}\n"); Thread.sleep(300); // 步骤4:返回风速 double windSpeed = 3.0 + Math.random() * 5; emitter.emit("{\"type\":\"wind_speed\",\"data\":\"" + String.format("%.1f", windSpeed) + "m/s\"}\n"); // 完成流式输出 emitter.complete(); log.info("天气查询完成: {}", city); } catch (InterruptedException e) { Thread.currentThread().interrupt(); emitter.error(new RuntimeException("查询中断")); } }}## 第三步:配置并启动 MCP 服务创建主启动类,集成 MCP 协议端点,并注册自定义工具。java// 2. 主启动类 - MCPApplication.javaimport org.noear.solon.Solon;import org.noear.solon.ai.mcp.McpServer;import org.noear.solon.ai.mcp.server.McpServerConfig;import org.noear.solon.ai.mcp.server.transport.SseMcpTransport;import org.noear.solon.ai.stream.StreamEmitter;/** * Streamable MCP 服务启动器 * 暴露 /mcp/sse 端点用于流式通信 */public class MCPApplication { public static void main(String[] args) { Solon.start(MCPApplication.class, args, app -> { // 注册自定义工具 app.context().beanMake(WeatherTool.class); // 配置 MCP 服务器(SSE 传输模式) McpServerConfig config = new McpServerConfig(); config.setName("WeatherMCP"); config.setVersion("1.0.0"); config.setTransport(new SseMcpTransport("/mcp/sse")); // 启动 MCP 服务 McpServer server = new McpServer(config); server.start(); // 在控制台打印服务地址 System.out.println("=== Streamable MCP 服务已启动 ==="); System.out.println("SSE 端点: http://localhost:8080/mcp/sse"); System.out.println("健康检查: http://localhost:8080/health"); }); } /** * 健康检查端点(可选) */ @Mapping("/health") public String health() { return "{\"status\":\"UP\",\"service\":\"WeatherMCP\"}"; }}## 第四步:配置阿里云百炼部署创建 Dockerfile 用于容器化部署,并配置阿里云百炼的 MCP 集成。dockerfile# Dockerfile - 用于阿里云百炼部署FROM openjdk:17-jdk-slimWORKDIR /app# 复制构建产物COPY target/mcp-weather-service-1.0.0.jar app.jar# 暴露 MCP 端口EXPOSE 8080# 启动命令(启用流式输出)ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=8080"]在阿里云百炼平台创建 MCP 服务时,需配置如下连接信息:json{ "mcp_servers": { "weather_service": { "url": "https://your-deployed-domain/mcp/sse", "type": "sse", "capabilities": { "streaming": true } } }}## 第五步:部署至阿里云百炼1. 构建 Docker 镜像并推送至阿里云容器镜像服务:bash# 构建镜像docker build -t registry.cn-hangzhou.aliyuncs.com/your-namespace/mcp-weather:1.0.0 .# 推送镜像docker push registry.cn-hangzhou.aliyuncs.com/your-namespace/mcp-weather:1.0.02. 在阿里云百炼控制台: - 创建「模型服务」→「MCP 服务」 - 选择容器部署,配置镜像地址 - 设置环境变量MCP_TRANSPORT=sse- 配置健康检查路径/health3. 绑定自定义域名,开启 HTTPS(百炼要求强制 HTTPS)。## 测试流式 MCP 服务使用 curl 模拟 MCP 客户端请求(通过 SSE 端点):bash# 模拟 MCP 客户端发送工具调用请求curl -X POST https://your-domain/mcp/sse \ -H "Content-Type: application/json" \ -H "Accept: text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "get_weather_stream", "arguments": { "city": "杭州" } } }'预期返回流式响应(逐步输出):data: {"type":"city","data":"杭州"}data: {"type":"temperature","data":"28.3°C"}data: {"type":"humidity","data":"65%"}data: {"type":"wind_speed","data":"4.2m/s"}## 总结本文通过完整代码演示,实现了基于 Solon AI 的 Streamable MCP 服务,并成功部署至阿里云百炼。关键要点:1.流式架构:利用 Solon AI 的StreamEmitter机制,将传统同步返回改为事件流,大幅提升用户体验(尤其是长耗时任务)。2.协议兼容:通过 SSE 传输模式,完美兼容 MCP 标准,可与任何支持 MCP 的 LLM 框架(如 LangChain、AutoGPT)集成。3.生产部署:借助阿里云百炼的容器编排能力,实现自动扩缩容、健康检查与日志监控,满足企业级可靠性要求。建议后续扩展:增加认证鉴权(JWT)、工具注册中心(动态加载工具)、以及基于 Redis 的流式结果缓存,进一步提升服务能力。