搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼

搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼 搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼背景与目标在 AI 应用开发中MCPModel Context Protocol成为连接 LLM 与外部工具的标准协议。本文通过实际代码演示从零搭建一个支持流式响应的 MCP 服务Streamable MCP并部署到阿里云百炼平台实现生产级可用。我们将使用Solon AI框架轻量级 Java 微服务框架构建服务端通过 SSEServer-Sent Events实现流式输出最终将服务容器化并部署至阿里云百炼。## 环境准备- JDK 17± Solon 2.8推荐最新版- Maven 3.6± Docker用于容器化部署- 阿里云百炼账号开通模型服务## 第一步创建 Solon AI MCP 项目使用 Maven 脚手架创建项目核心依赖如下xmldependencies !-- Solon AI 核心 -- dependency groupIdorg.noear/groupId artifactIdsolon-ai/artifactId version2.8.1/version /dependency !-- MCP 协议支持 -- dependency groupIdorg.noear/groupId artifactIdsolon-ai-mcp/artifactId version2.8.1/version /dependency !-- 流式响应支持 -- dependency groupIdorg.noear/groupId artifactIdsolon-ai-stream/artifactId version2.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.port8080]在阿里云百炼平台创建 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_TRANSPORTsse- 配置健康检查路径/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 的流式结果缓存进一步提升服务能力。