MCP 企业级分布式部署,这次让 Codex 走 TaoToken 照着 Spring AI Alibaba 落地 Nacos 注册配置
面试官问「如何实现企业级 MCP 分布式部署」时,单机 MCP Server 的短板会立刻暴露:没有负载均衡、节点扩缩容后客户端感知不到、工具列表更新还要重启。我这次不直接手写所有 YAML,而是让 Codex 走 TaoToken 的模型通道,照着 Spring AI Alibaba 的 Nacos 注册配置一步步生成。开始之前先去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 注册并创建 API Key,后面 Codex 的 ~/.codex/config.toml 会用到这把 Key。这个顺序有点反直觉:以前是先搭 Nacos 再想模型怎么调,现在是先把 Codex 的模型通道接稳,再让 Codex 按 Spring AI Alibaba 的目录生成 MCP Gateway 配置。原因很简单,企业级 MCP 分布式部署要改的配置文件很多,如果 Codex 自己还在 401 和 /v1 上打转,后面 Nacos 的 server-addr、namespace、service-names 只会更乱。
1. 面试官问企业级 MCP 分布式部署,单机 MCP Server 卡在哪
1.1 只跑单机为什么不够:负载均衡与节点变更动态感知
单机跑一个 MCP Server,本地调工具、读文件、查天气都没问题,可一旦放到企业环境,问题就变成三件事。第一,所有 MCP 客户端都打到一个节点,流量上来后没有负载均衡,某个工具调用一慢就拖住整条链路。第二,节点扩缩容之后,客户端并不知道新节点已经上线,也不知道旧节点已经下线,仍然按旧地址发请求。第三,MCP Server 暴露的 tools 列表可能动态增加或删除,如果每次都要重启代理应用,分布式部署就失去了意义。
原文里提到的 Nacos 注册中心,正好解决前两件事。MCP Server 启动后把自身注册到 Nacos,Nacos 通过健康检查维护可用节点列表,负载均衡器再从列表里挑一个健康节点转发。节点变更时,Nacos 能感知上下线,客户端或代理层拿到最新列表,不需要人工改配置。这里的重点不是「装一个 Nacos」就完事,而是让 MCP Server 的注册信息、健康状态、工具元数据都能被代理层读到。
1.2 两条路:Nacos 注册中心直连 vs Spring AI Alibaba MCP Gateway
原文给了两种实现方案。第一种是 MCP Server + Nacos 注册中心,最原始,也最接近微服务那套注册发现。MCP Server 自己注册到 Nacos,客户端通过负载均衡器调用。这个方案能跑,但需要业务侧配合注册逻辑,MCP 协议和 HTTP/Dubbo 之间的转换也要自己处理。
第二种是 Spring AI Alibaba MCP Gateway。它基于 Nacos 提供的 MCP server registry,在普通应用和 MCP 客户端之间加了一层代理。Gateway 把 Nacos 中注册的服务信息转换成 MCP 协议的服务器信息,MCP 客户端就可以像调用普通 MCP Server 一样调用这些服务。同时它还能做协议转换,把 MCP 请求转成对后端 HTTP、Dubbo 服务的调用。更关键的是,新增或删除 MCP 服务只需要在 Nacos 里操作,不用重启代理应用。
如果面试官追问「为什么选 Gateway」,可以这样答:它把注册发现、协议转换、动态更新收在一层里,业务代码不用为了 MCP 分布式部署做大改造。对于已经有一堆 HTTP 接口的团队,这比每个服务单独写 MCP Server 注册逻辑要省事。
2. 先把 Codex 的模型通道接到 TaoToken:~/.codex/config.toml 的 base_url
2.1 为什么先处理 Codex 的 Key 和 Base URL
Codex 直连模型时常见的麻烦有三个:第一,Key 要单独找,换模型还要换 Key;第二,401 报错出现后,不知道是 Key 失效还是环境变量没读到;第三,Base URL 多写一个 /v1,请求直接打到错误路径。TaoToken 在这里做的是统一 API 和兼容通道,把模型调用收成一把 Key、一个 Base URL,Codex 只负责生成和检查代码,不负责在多个模型供应商之间来回切。
所以操作顺序是:先打开 TaoToken 注册并创建 API Key,Key 用占位符 YOUR_API_KEY 表示。创建入口在控制台 API Keys 页面,后面配置环境变量时直接替换成你自己的 Key。不要把这个 Key 写进代码仓库,也不要提交到 Git。
2.2 写进 config.toml:model_provider 与 base_url = https://taotoken.net/api
Codex 的配置文件在 ~/.codex/config.toml。如果你之前配过 OpenAI 官方通道,里面会有 model_provider 和 [model_providers.xxx]。现在把供应商指向 TaoToken,Base URL 填 https://taotoken.net/api,注意末尾不要加 /v1。
model = "YOUR_MODEL_ID"
model_provider = "taotoken"
[model_providers.taotoken]
name = "TaoToken"
base_url = "https://taotoken.net/api"
env_key = "TAOTOKEN_API_KEY"
这里的 YOUR_MODEL_ID 不要凭感觉写,以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时列表为准。不同模型在工具调用、长上下文、代码生成上的表现不一样,企业级 MCP 配置检查建议选一个能稳定处理 YAML 和 Java 依赖的模型。
环境变量在 shell 里设置:
export TAOTOKEN_API_KEY=YOUR_API_KEY
如果你用的是 Windows PowerShell,对应写法是:
$env:TAOTOKEN_API_KEY="YOUR_API_KEY"
注意:
base_url只写https://taotoken.net/api。不要把官网落地页地址填进来,也不要写成https://taotoken.net/api/v1。官网地址用于注册、创建 Key、看模型广场和用量,接口地址才是填进 Codex 的。
2.3 验证 Codex 通道:用同一把 Key 问一句
配置保存后,先别急着写 Spring AI Alibaba 配置。运行 Codex,问一个和 MCP 无关的小问题,比如「用一句话解释 Nacos 服务注册发现」。如果 Codex 能正常返回,说明 Key、Base URL、模型 ID 这三件事至少通了。
如果返回 401,先看 TAOTOKEN_API_KEY 是否在当前终端生效,再看 config.toml 里的 env_key 是否写成了 TAOTOKEN_API_KEY。如果返回 404,优先检查 base_url 是不是多写了 /v1 或少了 /api。这一步确认之后,再把 Codex 拉进 Nacos MCP 配置的生成流程。
3. 让 Codex 按 Spring AI Alibaba 步骤生成 Nacos MCP 配置
3.1 给 Codex 的提示词:只生成/检查 spring.ai.alibaba.mcp.nacos
Codex 在这里的定位是配置生成器和检查器,不是直接连上 Nacos 去改数据。正确的用法是:把 Nacos 里已经创建好的 MCP Server 名称、namespace、server-addr 告诉 Codex,让它生成 application.yml 片段,或者检查你手写的缩进和字段有没有错。
提示词可以这样写:
我在用 Spring AI Alibaba MCP Gateway 做企业级 MCP 分布式部署。
Nacos 版本是 3.0,server-addr 是 127.0.0.1:8848,namespace 是 public。
我已经在 Nacos 的 MCP 列表管理里创建了一个 MCP Server,名称是 echo-server。
请生成 spring.ai.alibaba.mcp.nacos 相关配置,包括 gateway.service-names。
同时检查我的 Codex base_url 是否误写成 https://taotoken.net/api/v1。
只输出 YAML 片段和检查结论,不要建议我直接连接 Nacos 执行命令。
这样 Codex 产出的内容是可对照的配置,不会跑偏成「让 AI 直接操作注册中心」。
3.2 Codex 产出的 application.yml 片段怎么对照官方字段
Codex 可能会给你下面这类片段:
spring:
ai:
alibaba:
mcp:
nacos:
server-addr: 127.0.0.1:8848
namespace: public
username: ${NACOS_USERNAME:}
password: ${NACOS_PASSWORD:}
gateway:
service-names:
- echo-server
对照原文,server-addr、namespace、username、password 属于 Nacos 连接信息;gateway.service-names 是 Gateway 要代理的 MCP 服务名列表。这里最容易错的是缩进:nacos 和 gateway 都在 spring.ai.alibaba.mcp 下面,不是 gateway 嵌在 nacos 里面。如果 Codex 生成的层级不对,启动时可能读不到 service-names,表现就是 Gateway 启动了但 MCP 客户端看不到工具。
提示:
service-names里填的是 Nacos 中注册的 MCP Server 名称,不是模型 ID。模型 ID 在 Codex 的config.toml里,Nacos 服务名在application.yml里,两者不要混。
4. Nacos 3.0 控制台里创建 MCP Server、tools 与 request template
4.1 在 mcp 列表管理里建一个 mcp server
以 Nacos 3.0 为例,进入 Nacos 控制台后找到 MCP 列表管理功能,创建一个 MCP Server。名称建议和后面 gateway.service-names 保持一致,比如 echo-server。这一步对应原文的「在 nacos 中进入 mcp 列表管理功能,创建一个 mcp server」。创建完成后,Nacos 里会多一条 MCP 服务记录,Gateway 后面就是靠这个记录找到后端服务。
如果你在 Nacos 里改了服务名,却没改 application.yml 里的 service-names,启动后 Gateway 会报找不到服务。排障时先对这两个字符串,大小写和连字符都要一致。
4.2 添加 tools 与 request template:url、argsToUrlParam、method
在 MCP Server 里添加 tools,说明要暴露哪些工具。每个 tool 需要配置 request template,格式与 Higress 兼容。下面是一个可对照的模板,把原来的天气接口换成了订单查询示例:
{
"requestTemplate": {
"url": "/v1/order/query?token={{ .config.credentials.api_key.data }}",
"argsToUrlParam": true,
"method": "GET"
},
"responseTemplate": {
"body": "result: {{ .value }}"
}
}
url 是后端真实接口路径,argsToUrlParam 表示把参数拼到 URL 上,method 是 HTTP 方法。responseTemplate 决定返回内容怎么包装。实际项目中,你的后端可能是 Dubbo 服务或内部 HTTP 服务,Gateway 会按这里的模板做协议转换。
4.3 responseTemplate 与 credentials 占位符别写死
requestTemplate 里引用 {{ .config.credentials.api_key.data }} 这种做法,是为了把凭据放在 Nacos 配置里,而不是硬编码在模板字符串中。企业环境里 API Key、Token、数据库密码都不应该出现在可提交的代码里。Codex 生成配置时,如果它把真实 Key 写进 YAML,一定要改回占位符或环境变量。
responseTemplate 也不要写得太复杂。先用 {{ .value }} 把后端返回原样带出来,确认 MCP 客户端能拿到结果,再考虑做字段裁剪。很多「工具调用没返回」的问题,其实是 response template 写错导致解析失败,而不是 Nacos 注册失败。
5. 工程依赖与 MCP Gateway 启动:spring-ai-alibaba-mcp-gateway
5.1 pom.xml 里引入 gateway 与 nacos-mcp-server
Spring AI Alibaba MCP Gateway 的依赖要加进工程。版本号以官方仓库当时发布为准,原文示例用的是 1.0.0.3-SANPSHOT 一类快照版本,实际项目建议跟 Spring AI Alibaba 的 BOM 或官方文档对齐。下面用属性占位,避免写死:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-mcp-gateway</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-alibaba-starter-nacos-mcp-server</artifactId>
<version>${spring-ai-alibaba.version}</version>
</dependency>
</dependencies>
如果只加 Gateway 不加 Nacos MCP Server starter,启动时可能读不到 Nacos 中的 MCP 服务元数据。两个依赖配合,才能把注册在 Nacos 里的 MCP Server 转成 MCP 客户端可调用的服务器信息。
5.2 application.yml 配 gateway.service-names
把第 3 节 Codex 生成的片段补完整,放到 src/main/resources/application.yml:
server:
port: 8080
spring:
ai:
alibaba:
mcp:
nacos:
server-addr: 127.0.0.1:8848
namespace: public
username: ${NACOS_USERNAME:}
password: ${NACOS_PASSWORD:}
gateway:
service-names:
- echo-server
server-addr 指向 Nacos 地址,namespace 用你实际创建的命名空间。如果 Nacos 开了鉴权,username 和 password 从环境变量注入。service-names 只列出需要暴露给 MCP 客户端的服务,不要把所有注册服务都塞进去。
5.3 启动后看 Nacos 服务列表与 MCP 客户端调用
启动 Spring Boot 应用后,Gateway 会读取 Nacos 中持有的 MCP Server 配置信息,并对外暴露出来,供 MCP 客户端调用。此时企业级 MCP 分布式部署的关键能力就接上了:流量可以在多个节点之间做负载均衡,节点上下线由 Nacos 健康检查感知,新增或删除 MCP 服务不需要重启代理应用。
验证时不要只看启动日志里的 Started Application。先看 Nacos 服务列表里 echo-server 是否健康,再用 MCP 客户端调用一次 tools/list 或具体工具。如果客户端能看到工具,但调用返回空,回到第 4 节的 request template 检查 URL 和后端服务是否可达。
6. 验证与排障:Codex 401、base_url 多写 /v1、Nacos 服务名对不上
6.1 用同一把 Key 让 Codex 解释 Nacos 注册配置
Codex 通道通了之后,用同一把 Key 做一次配置检查。把 application.yml 片段贴给 Codex,问它:「spring.ai.alibaba.mcp.nacos 的 server-addr、namespace、gateway.service-names 是否和 Nacos 中注册的 MCP Server 名称一致?Codex 的 base_url 是否误写成 https://taotoken.net/api/v1?」如果 Codex 能正确指出字段和缩进,说明模型通道和配置理解都没问题。
这一步也能暴露模型选择问题。有些模型对 YAML 缩进不敏感,容易漏看 gateway 和 nacos 的层级关系。换一个更擅长结构化文本的模型,再以 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 模型广场当时列表为准选型即可。
6.2 401 先查 Key 和 env_key,再查 Base URL
Codex 返回 401 时,按这个顺序查:第一,echo $TAOTOKEN_API_KEY 是否输出你的 Key,占位符 YOUR_API_KEY 有没有被真的替换。第二,~/.codex/config.toml 里 env_key 是否写成 TAOTOKEN_API_KEY,大小写要一致。第三,Key 是否在控制台被删除或禁用。去 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 重新创建一把 Key,替换环境变量后再试。
Spring Boot 侧如果连 Nacos 报 403,那是 Nacos 鉴权问题,不是 TaoToken 的 401。两套认证不要混在一起排查。
6.3 404 与 /v1:Codex 的 base_url 保持 https://taotoken.net/api
Codex 返回 404 时,最常见原因是 base_url 多写了 /v1。把:
base_url = "https://taotoken.net/api/v1"
改成:
base_url = "https://taotoken.net/api"
末尾不要带斜杠,也不要带 /v1。官网地址 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 只用于注册、创建 Key、看模型广场和用量,不要填进 config.toml。这两类地址混用,是 404 和 401 反复出现的常见原因。
6.4 Nacos 服务名与 gateway.service-names 对不上
Spring Boot 启动成功但 MCP 客户端看不到工具,先看 gateway.service-names 里的名称和 Nacos MCP 列表里的服务名是否完全一致。echo-server 和 echo_server、EchoServer 在注册中心看来是三个服务。改名之后要同步改 application.yml,然后重启 Gateway 应用。
如果服务名一致但节点不可用,检查 Nacos 健康检查是否通过。MCP Server 所在机器的端口、网络策略、健康检查路径都要放通。Gateway 只是代理层,它不会替后端服务修网络。
7. 收尾:去控制台看这次调用有没有记上,顺便挑下一步
7.1 模型对话与 Coding Plan
Codex 能正常生成 Nacos MCP 配置之后,去 TaoToken 模型对话 用同一把 Key 发一条测试消息,确认这次调用在控制台有记录。如果你准备长期让 Codex 参与企业级 MCP 分布式部署的配置检查,可以打开 Coding Plan 看套餐是否够用。Key 的管理和新建在 控制台 API Keys。
7.2 创建 Key 与 Claude Code 接入文档
如果团队里还有人用 Claude Code 做 MCP 相关开发,可以让对方先看 Claude Code 接入文档,把模型通道按同样思路接稳,再回到 Nacos 和 Spring AI Alibaba MCP Gateway 的配置。企业级部署最怕的不是配置多,而是每个环节的地址、Key、服务名各说各话。先把 Codex 的 base_url 固定成 https://taotoken.net/api,再把 Nacos 的 server-addr、namespace、service-names 对齐,后面节点扩缩容和工具动态更新才有稳定的底子。
更多推荐



所有评论(0)