原文链接:Nacos3下的分布式MCP
教程说明
说明:本教程将采用2025年5月20日正式的GA版,给出如下内容
- 核心功能模块的快速上手教程
- 核心功能模块的源码级解读
- Spring ai alibaba增强的快速上手教程 + 源码级解读
版本:JDK21 + SpringBoot3.4.5 + SpringAI 1.0.0 + SpringAI Alibaba 1.0.0.2
将陆续完成如下章节教程。本章是第七章(MCP使用范式)下的基于Nacos3的MCP分布式
代码开源如下:github.com/GTyingzi/sp...

微信推文往届解读可参考:
第一章内容
SpringAI(GA)的chat:快速上手+自动注入源码解读
第二章内容
SpringAI(GA):Sqlite、Mysql、Redis消息存储快速上手
第三章内容
第五章内容
SpringAI(GA):内存、Redis、ES的向量数据库存储---快速上手
SpringAI(GA):向量数据库理论源码解读+Redis、Es接入源码
第六章内容
第七章内容
整理不易,获取更好的观赏体验,可付费获取飞书云文档Spring AI最新教程权限,目前49.9,随着内容不断完善,会逐步涨价。
注:M6版快速上手教程+源码解读飞书云文档已免费提供
为鼓励大家积极参与为Spring Ai Alibaba开源社区 :<github.com/alibaba/spr...
为AI工程贡献力量,解决三个有效issue或提交一个有价值的PR,可免费获得当前SpringAI最新教程的飞书在线版>
Nacos3 的 MCP 分布式
Nacos 准备
选择 Nacos3.*版本,新建一个命名空间,记住此时的命名空间 ID:"4ad3108b-4d44-43d0-9634-3c1ac4850c8c"

mcp-nacos3-server
pom 文件
导入 nacos-mcp-server 依赖
- 说明:目前 1.0.0.2 有点 bug,现在初步进行了修复,请本地编译项目,使用快照版
xml
<properties>
<!-- Spring AI Alibaba -->
<spring-ai-alibaba.version>1.0.0.3-SNAPSHOT</spring-ai-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-nacos-mcp-server</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<!-- MCP Server WebFlux 支持(也可换成 WebMvc) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
</dependency>
</dependencies>
application.yml
yml
server:
port: 21000
spring:
main:
banner-mode: off
application:
name: mcp-nacos3-server
ai:
mcp:
server:
name: webflux-mcp-server
version: 1.0.0
type: ASYNC # Recommended for reactive applications
instructions: "This reactive server provides time information tools and resources"
sse-message-endpoint: /mcp/messages
capabilities:
tool: true
resource: true
prompt: true
completion: true
alibaba:
mcp:
nacos:
namespace: 4ad3108b-4d44-43d0-9634-3c1ac4850c8c
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
registry:
enabled: true
service-group: mcp-server
service-name: webflux-mcp-server
TimeService
提供一个时间工具服务
java
package com.spring.ai.tutorial.mcp.server.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
@Service
public class TimeService {
private static final Logger logger = LoggerFactory.getLogger(TimeService.class);
@Tool(description = "Get the time of a specified city.")
public String getCityTimeMethod(@ToolParam(description = "Time zone id, such as Asia/Shanghai") String timeZoneId) {
logger.info("The current time zone is {}", timeZoneId);
return String.format("The current time zone is %s and the current time is " + "%s", timeZoneId,
getTimeByZoneId(timeZoneId));
}
private String getTimeByZoneId(String zoneId) {
// Get the time zone using ZoneId
ZoneId zid = ZoneId.of(zoneId);
// Get the current time in this time zone
ZonedDateTime zonedDateTime = ZonedDateTime.now(zid);
// Defining a formatter
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
// Format ZonedDateTime as a string
String formattedDateTime = zonedDateTime.format(formatter);
return formattedDateTime;
}
}
Nacos3ServerApplication
java
package com.spring.ai.tutorial.mcp.server;
import com.alibaba.cloud.ai.autoconfigure.mcp.server.NacosDynamicMcpServerAutoConfiguration;
import com.spring.ai.tutorial.mcp.server.service.TimeService;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication(exclude = NacosDynamicMcpServerAutoConfiguration.class)
public class Nacos3ServerApplication {
public static void main(String[] args) {
SpringApplication.run(Nacos3ServerApplication.class, args);
}
@Bean
public ToolCallbackProvider timeTools(TimeService timeService) {
return MethodToolCallbackProvider.builder().toolObjects(timeService).build();
}
}
效果
分别以 21000、21001 端口启动两个 Nacos3ServerApplication 服务,注册到 Nacos3.*中

对应的 MCP Server 详情

同时,配置管理这里也有对应的 mcp-server、mcp-tools 等的信息

mcp-nacos3-client
pom 文件
xml
<properties>
<!-- Spring AI Alibaba -->
<spring-ai-alibaba.version>1.0.0.3-SNAPSHOT</spring-ai-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-openai</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-autoconfigure-model-chat-client</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-nacos-mcp-client</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
</dependencies>
application.yml
yml
spring:
application:
name: mcp-nacos3-client
main:
web-application-type: none
ai:
openai:
api-key: ${DASHSCOPEAPIKEY}
base-url: https://dashscope.aliyuncs.com/compatible-mode
chat:
options:
model: qwen-max
mcp:
client:
enabled: true
name: my-mcp-client
version: 1.0.0
request-timeout: 30s
type: ASYNC # or ASYNC for reactive applications
alibaba:
mcp:
nacos:
namespace: 4ad3108b-4d44-43d0-9634-3c1ac4850c8c
server-addr: 127.0.0.1:8848
username: nacos
password: nacos
client:
enabled: true
sse:
connections:
server1:
service-name: webflux-mcp-server
version: 1.0.0
注意关注如下配置:
- 命名空间配置:保持一致
- 启动分布式:
spring.ai.alibaba.mcp.nacos.client.enabled: true
,默认不开启 - 指定连接的服务名 + 版本号
Nacos3ClientApplication
java
package com.spring.ai.tutorial.mcp.client;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import java.util.Scanner;
@SpringBootApplication
public class Nacos3ClientApplication {
public static void main(String[] args) {
SpringApplication.run(Nacos3ClientApplication.class, args);
}
@Bean
public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, @Qualifier("loadbalancedMcpAsyncToolCallbacks") ToolCallbackProvider tools,
ConfigurableApplicationContext context) {
return args -> {
var chatClient = chatClientBuilder
.defaultToolCallbacks(tools)
.build();
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("\n>>> QUESTION: ");
String userInput = scanner.nextLine();
if (userInput.equalsIgnoreCase("exit")) {
break;
}
if (userInput.isEmpty()) {
userInput = "北京时间现在几点钟";
}
System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());
}
scanner.close();
context.close();
};
}
}
效果
MCP Client 端先后触发两次工具请求

第一次工具由 MCP Server21000 端口进行处理

第二次工具由 MCP Server21001 端口进行处理

学习交流圈
你好,我是影子,曾先后在🐻、新能源、老铁就职,现在是一名AI研发工程师,同时作为Spring AI Alibaba开源社区的Committer。目前新建了一个交流群,一个人走得快,一群人走得远,。另外,本人长期维护一套飞书云文档笔记,涵盖后端、大数据系统化的面试资料,可私信免费获取
