截止到2026.2月,spring cloud alibaba终于发布了兼容spring cloud2025的版本,于是笔者最近就想着把之前的mcp服务的配置放到nacos中
1、相关版本升级
笔者原先的项目使用的是spring ai的版本是1.0.0,现在需要对此进行升级,换到1.1.2版本,并将spring-ai-core替换为spring-ai-commons。以及需要升级io.modelcontextprotocol.sdk的版本,从1.0.0升级到1.1.2。还有需要升级spring boot的版本,从3.4.4升级到3.5.10,同时需要增加spring-cloud-starter-alibaba-nacos-discovery与spring-cloud-starter-alibaba-nacos-config依赖,版本为2025.0.0。
pom.xml更改的部分如下
xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-commons</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2025.0.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2025.0.0.0</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.1.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>io.modelcontextprotocol.sdk</groupId>
<artifactId>mcp-bom</artifactId>
<version>${mcp.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2、相关配置修改
spring cloud alibaba从2023.0.1.3 及以上版本 spring.cloud.nacos.config.shared-configs、extension-configs 以及默认加载的 application.name 配置已经废弃, 以上版本请统一使用 spring.config.import 方式导入 Nacos 配置
从2025.1.x 开始,不再支持 bootstrap.yml 以及 bootstrap.properties 用法,请使用 application.yml 或者 application.properties
所以笔者将原先项目的application.properties更新为application.yml,并且废弃bootstrap.yml配置,application.yml配置文件如下:
yaml
spring:
# 配置中心地址
application:
# 服务名称
name: mcp-server
# 环境配置 例如 admin-dev.yaml
profiles:
active: dev #dev-开发环境 test-生产测试环境 prod-生产环境
config:
# 使用spring.config.import导入nacos配置
import: optional:nacos:mcp-server-dev.yaml?group=DEFAULT_GROUP?refreshEnabled=true
cloud:
nacos:
discovery:
# 开启nacos作为服务注册中心,默认值:true
enabled: true
# nacos集群服务注册地址
server-addr: # nacos的端口和地址
# 临时实例,默认true,false永久实例,即使宕机也不会从nacos服务中删除,可应对雪崩保护,避免服务被删除
ephemeral: true
# 权重 1-100 数值越大权重越大分配的流量就越大,通常结合权重负载均衡策略
weight: 100
namespace: # nacos命名空间
username: # nacos控制台的用户名
password: # nacos控制台的用户名
config:
server-addr: # nacos的端口和地址
username: ${spring.cloud.nacos.discovery.username}
password: ${spring.cloud.nacos.discovery.password}
context-path: /nacos #nacos的contextPath
# 命名空间
namespace: # nacos命名空间
springdoc:
swagger-ui:
# 禁止默认路径
disable-swagger-default-url: true
logging:
level:
com.alibaba: warn
请注意,笔者使用的nacos的版本是3.1.1版本,此版本的控制台端口改为8080,8848和9848分别为nacos的注册发现端口和grpc,需要开放服务器的8848和9848端口,才能使应用程序访问nacos,8080端口可选择开放
3、相关代码修改
1)Application启动类需要添加@EnableDiscoveryClient注解,保证该客户端是nacos的client端
2)原先McpServerConfig类中里的stdioServerTransportProvider方法需要更改
typescript
@Bean
@ConditionalOnProperty(prefix = "transport", name = "mode", havingValue = "stdio")
public StdioServerTransportProvider stdioServerTransportProvider() {
return new StdioServerTransportProvider();
}
//更改后
@Bean
@ConditionalOnProperty(prefix = "transport", name = "mode", havingValue = "stdio")
public StdioServerTransportProvider stdioServerTransportProvider() {
McpJsonMapper mcpJsonMapper=new JacksonMcpJsonMapper(new ObjectMapper());
//新版本的方法增加了McpJsonMapper,需要使用new出来,并将ObjectMapper传入
return new StdioServerTransportProvider(mcpJsonMapper);
}
3)原先McpServerConfig类中里sseServerTransportProvider方法也需要修改
typescript
@Bean
@ConditionalOnProperty(prefix = "transport", name = "mode", havingValue = "sse")
public WebFluxSseServerTransportProvider sseServerTransportProvider() {
return new WebFluxSseServerTransportProvider(new ObjectMapper(), "/mcp/message");
}
//更改后
@Bean
@ConditionalOnProperty(prefix = "transport", name = "mode", havingValue = "sse")
public WebFluxSseServerTransportProvider sseServerTransportProvider(ObjectMapper objectMapper) {
McpJsonMapper mcpJsonMapper = new JacksonMcpJsonMapper(objectMapper);
/**
* 原先的WebFluxSseServerTransportProvider,需要通过build方法进行创建
* 并且WebFluxSseServerTransportProvider的构造方法新增了5个参数
*/
return WebFluxSseServerTransportProvider.builder()
//jsonMapper,使用McpJsonMapper创建
.jsonMapper(mcpJsonMapper)
//sse的端点
.sseEndpoint("/sse")
//mcp可以访问的路径
.messageEndpoint("/mcp/message")
.basePath("")
.keepAliveInterval(null)
.build();
}