截止到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更改的部分如下


    <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-configsextension-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配置文件如下:

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方法需要更改

@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方法也需要修改

@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();
}
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com