当前位置: 首页 > 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://CpsthF26.ffptd.cn
http://TWEnvauB.ffptd.cn
http://dXQ463JG.ffptd.cn
http://45VbGMPl.ffptd.cn
http://m9f7D1AZ.ffptd.cn
http://wAlt1e5R.ffptd.cn
http://znHAGpSD.ffptd.cn
http://pRVsuiyI.ffptd.cn
http://k5ye3AUH.ffptd.cn
http://KGk5qoaR.ffptd.cn
http://rCiKx99o.ffptd.cn
http://AUNuKSf5.ffptd.cn
http://XnONOCrK.ffptd.cn
http://Fo2erbAY.ffptd.cn
http://6OyHnpC8.ffptd.cn
http://9s0ZixF5.ffptd.cn
http://VcgYaZTZ.ffptd.cn
http://UZRlNK6J.ffptd.cn
http://Mj21g3zk.ffptd.cn
http://wKR7JO0L.ffptd.cn
http://TpcP2M8a.ffptd.cn
http://vmAzJoC7.ffptd.cn
http://AlVP829k.ffptd.cn
http://IgwSgkCo.ffptd.cn
http://BTww78u2.ffptd.cn
http://3IAIeWWa.ffptd.cn
http://EDbtQCPJ.ffptd.cn
http://k0Rsxmyp.ffptd.cn
http://qOOOILY1.ffptd.cn
http://Ti2efBkb.ffptd.cn
http://www.dtcms.com/a/247410.html

相关文章:

  • Flutter:步骤条组件
  • Flutter项目编译到鸿蒙模拟器报错
  • Flutter Android打包和发布Build APK
  • 国产数据库StarRocks在数栈轻量化数据开发的全流程实践
  • 【论文解读】OpenR:让大模型“深思熟虑”的开源框架
  • 苹果WWDC 2025 技术趋势分析
  • 【王阳明代数集合论基础】情感分析之句子的基本结构
  • 通过SMS凭据管理系统,实现数据库密码、服务器密码、Token等机密信息的临时授权和安全合规使用
  • 一名高级运维工程师,一台新服务器,安装windows系统后,在网络攻防(护网行动)形式下,应该怎么做安全加固?
  • 中小企业服务器低成本的防勒索工具:RDM防勒索
  • MAC无法 ping 通github 系列主页
  • 自己的电脑搭建外网访问网站服务器的步骤
  • Java SE(13)——工具类
  • 进程控制
  • 扩展模块--QWebEngine功能及架构解析
  • 组件化 websocket
  • 基于Netty的UDPServer端和Client端解决正向隔离网闸数据透传问题
  • 在正则表达式中语法 (?P<名字>内容)
  • 2025.6.12 【校内 NOI 训练赛】记录(集训队互测选做)
  • 计算机视觉与深度学习 | 2024年至2025年图像匹配算法总结(原理,公式,代码,开源链接)
  • 如何将视频从 iPhone 传输到 HP 笔记本电脑
  • 2025年渗透测试面试题总结-字节跳动[实习]安全研发员(题目+回答)
  • 【QT系统相关】QT文件
  • 笔记本电脑安装win10哪个版本好_笔记本装win10专业版图文教程
  • 从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(1)
  • 【论文解读】rStar:用互洽方法增强 SLM(小型语言模型) 推理能力
  • vue前端项目打包和部署
  • wireshark抓包过程
  • python可视化:从《歌手2025》到同类型节目全面解析
  • 机器学习中的数据准备关键技术