当前位置: 首页 > news >正文

【Spring AI】MCP Server实现多实例部署

在进行AI大型业务开发时,终将会遇到性能瓶颈,面临和常规微服务架构项目同样的问题,也就是访问压力,而解决这个问题的常见方法就是多实例部署服务。同样的,大模型在进行工具调用时也会遇到类似的问题,这篇文章我将介绍MCP Server如何实现多实例部署。

事实上在Spring AI上有人已经提出这个问题,不过目前仅能够手动实现

我将给你一个示例的部署代码

package org.example.mcpserverdemo;import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.server.McpServer;
import io.modelcontextprotocol.server.McpSyncServer;
import io.modelcontextprotocol.server.transport.WebMvcSseServerTransportProvider;
import io.modelcontextprotocol.spec.McpSchema;
import org.springframework.ai.mcp.McpToolUtils;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;/*** <p>** </p>** @author fanxt0218* @since 2025/6/13**/
@Configuration
public class McpServerConfig {@Bean("t1")public WebMvcSseServerTransportProvider webMvcSseServerTransportProvider1() {return  new WebMvcSseServerTransportProvider(new ObjectMapper(), "/mcp/message","/sse");}@Beanpublic RouterFunction<ServerResponse> mvcMcpRouterFunction1(@Qualifier("t1") WebMvcSseServerTransportProvider transportProvider) {return transportProvider.getRouterFunction();}@Bean("t2")public WebMvcSseServerTransportProvider webMvcSseServerTransportProvider2() {return  new WebMvcSseServerTransportProvider(new ObjectMapper(), "/mcp/message","/sse2");}@Beanpublic RouterFunction<ServerResponse> mvcMcpRouterFunction2(@Qualifier("t2")WebMvcSseServerTransportProvider transportProvider) {return transportProvider.getRouterFunction();}@Bean("weather-mcp-server_instance1")public McpSyncServer mcpServer(ToolCallbackProvider provider,@Qualifier("t1") WebMvcSseServerTransportProvider transportProvider) { // @formatter:off// Configure server capabilities with resource supportvar capabilities = McpSchema.ServerCapabilities.builder().tools(true) // Tool support with list changes notifications.logging() // Logging support.build();// Create the server with both tool and resource capabilities// Add @Toolsreturn McpServer.sync(transportProvider).serverInfo("MCP Demo Weather Server1", "1.0.1").capabilities(capabilities).tools(McpToolUtils.toSyncToolSpecifications(provider.getToolCallbacks())) // Add @Tools.build(); // @formatter:on} // @formatter:on@Bean(name = "weather-mcp-server_instance2")public McpSyncServer mcpServer2(ToolCallbackProvider provider,@Qualifier("t2") WebMvcSseServerTransportProvider transportProvider) { // @formatter:off// Configure server capabilities with resource supportvar capabilities = McpSchema.ServerCapabilities.builder().tools(true) // Tool support with list changes notifications.logging() // Logging support.build();// Create the server with both tool and resource capabilities// Add @Toolsreturn McpServer.sync(transportProvider).serverInfo("MCP Demo Weather Server2", "1.0.2").capabilities(capabilities).tools(McpToolUtils.toSyncToolSpecifications(provider.getToolCallbacks())) // Add @Tools.build(); // @formatter:on} // @formatter:on@Beanpublic ToolCallbackProvider weatherTools(WeatherService weatherService) {return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();}
}

第二步在启动类上加上这个配置,这是因为mvc模式不支持这样的配置,所以要手动剔除其配置

@SpringBootApplication(exclude={webMvcConfiguration.calss})

最终你可以将这些url暴露出去,这样实现了单服务的多端点部署

另一种方案就是多个不同的端口号方式部署,这也是常见的做法。

这一套流程下来最终的效果就是,你的客户端可以选择性的访问多个实例的MCP Server,同样你也可以为他们配置相应的优先级策略。

http://www.xdnf.cn/news/1027513.html

相关文章:

  • 【灵动Mini-F5265-OB】ADC之片内温度传感器与参考电压获取
  • springboot+vue大文件断点续传
  • 04 dnsmasq 的环境搭建
  • 【MIPI屏幕调试记录】个人记录用
  • Python+requests+pytest接口自动化测试框架的搭建
  • 专项提升-分析dump堆文件 服务器内存占用排查
  • 在死胡同里 做加法是什么意思?
  • 坚持做一件事情和好奇做一件事,本质区别和思考
  • 开发者视角:一键拉起功能解析
  • XAttention 计算步骤详解及示例
  • 【Qt】Qt控件
  • 【组件】纯html+css实现图片预览+切换图片的功能
  • 189. 轮转数组
  • Linux --基础IO
  • 大模型的开发应用(十):对话风格微调项目(上):数据工程与模型选型
  • 安卓开发常用框架与库详解
  • 发现 Kotlin MultiPlatform 的一点小变化
  • 技术干货 | 注塑件电磁网格划分指南(HyperMesh+SimLab)
  • BIO网络通信基础(TCP协议)
  • Dock最新方法
  • 第二十三章 23.Wireless LAN(CCNA)
  • Linux 文件系统核心概念
  • Atlassian AI(Rovo)在不同场景中的实际应用:ITSM、HR服务、需求管理、配置管理
  • Git Switch 与 Git Restore 详解
  • yum查看历史操作
  • 高并发场景下接口安全实现方案:全方位构建防护体系
  • 重复的囚徒困境博弈中应该如何决策?--阿克塞尔罗德竞赛(Axelrod‘s Tournament)实验
  • Spring注解的深层含义
  • 人工智能 倒底是 智能 还是 智障?
  • OmoFun动漫官网,动漫共和国最新入口|网页版