[Nacos/Docker/MCP] Nacos 3.x : 为 AI MCP 而生

0 序言 : Nacos 3.x 的发布

  • 2025年4月28日,Nacos 3.0 正式发布:MCP Registry、安全零信任、链接更多生态
  • 升级 MCP Registry,围绕着 MCP 服务管理,MCP 多种类型注册,包含 MCP Server 注册、编排、动态调试和管理,并且提供 Nacos-MCP-Router 可以进行 MCP 动态发现,可以自动安装、代理 MCP Server,全生态面向 AI Registry 进行升级;

image

image

  • 升级安全架构,默认开启鉴权,基础架构一系列升级,作为云原生时代的基础设施级产品,Nacos 3.0 不仅是技术能力的跃升,更是以更高效、安全的方式帮助用户构建云原生 AI 应用架构!
  • 做一个对未来1-3年乃至更长时间的技术趋势判断:

对于国内开发者而言,基于 Java 构建的 AI 原生应用架构中,尤其是涉及到 MCP 管理的场景中,则必然少不了 Nacos,少不了 Nacos 3.x。

  • 对于 Nacos 1.x / 2.x 不了解的朋友,可参见历往篇章。

1 概述: Nacos 3.x

Nacos 3.x 的诞生背景、特性

  • Nacos, /nɑ:kəʊs/Dynamic Naming and Configuration Service 的首字母简称
  • 其定位于一个更易于构建云原生 AI 应用的动态服务发现、配置管理和服务管理平台
  • 从 2018 年 7 月开始宣布开源以来,已经走过了第六个年头,在这六年里,备受广大开源用户欢迎,收获许多社区大奖。
  • Nacos 在社区共同的建设下不断成长,逐步的开始帮助用户解决实际问题,助力企业数字化转型,目前已经广泛的使用在国内的公司中,根据微服务领域调查问卷,Nacos 在注册配置中心领域已经成为国内首选,占有 50%+ 国内市场份额,被各行各业的头部企业广泛使用!

image

  • Nacos 在 2.X 版本经过近三年的技术演进,已成功实现最初设计的高性能架构与灵活扩展能力,并持续优化产品易用性与安全防护体系。

随着人工智能时代的全面到来,大语言模型LLM )的成熟应用正推动行业进入AI原生化发展阶段
在此背景下,业界对AI原生应用的【开发标准】的探索、AI Agent 框架的技术创新、动态 Prompt场景化需求,以及 MCP 协议、A2A 通信规范等技术生态的构建,均对服务治理体系提出了新的要求。
Nacos 3.0 架构迭代的就是为了更好的这些技术趋势
Nacos 3.0重点构建【面向AI原生架构的服务治理平台】,为 模型 / MCP Server / Agent新型业务智能场景架构提供更高效的运行支撑;

  • Nacos 3.0 提升【安全性】,整体架构安全拆分,默认开启鉴权,并且支持动态数据源密钥等零信任方案;多语言生态,覆盖主流开发语言,Python、GoLang、Rust 作为重要部分,发布多个核心组件,可以打通 K8S 生态的 Service / ConfigMap / Secret 数据,面向全场景可以作为统一管理平台

image

2 安装部署

Nacos 3.x (standalone版 + Docker 镜像方式)

Step1 拉取镜像

//拉取镜像 - 方式1
docker pull nacos/nacos-server:v3.0.3

//拉取镜像 - 方式2 (第三方镜像仓库)
docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v3.0.3
# 新增镜像标签
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v3.0.3 docker.io/nacos/nacos-server:v3.0.3
  • 查看镜像
docker images

拉取时最好指定版本,可在github查看所需版本: https://github.com/nacos-group/nacos-docker

image

Step2 启动镜像

  • 以 standalone 版为例:
docker run -d --name nacos \
-p 8080:8080 \
-p 8848:8848 \
-p 9848:9848 \
-e MODE=standalone \
-e NACOS_AUTH_TOKEN=dG9rZW50b2tlbnRva2VudG9rZW50b2tlbnRva2VudG9rZW4= \
-e NACOS_AUTH_IDENTITY_KEY=MyAuthorization123456 \
-e NACOS_AUTH_IDENTITY_VALUE=MyToken123456 \
nacos/nacos-server:v3.0.3
  • 相比 nacos 2.x ,nacos 3.x 多了【强制】要求配置的3个【环境变量】:
  • NACOS_AUTH_TOKEN : Nacos 用于生成JWT Token的密钥,使用长度大于32字符的字符串,再经过Base64编码。

未配置时,docker logs nacos会显示错误日志: echo 'env NACOS_AUTH_TOKEN must be set with Base64 String.',如下2个变量的错误日志类比。
基于shell命令获取base64编码的文本的参考命令: echo -n "your_token" | base64

  • NACOS_AUTH_IDENTITY_KEY : Nacos Server端之间 Inner API的身份标识的Key,必填。
  • NACOS_AUTH_IDENTITY_VALUE : Nacos Server端之间 Inner API的身份标识的Value,必填。
  • 如果使用非 Docker 部署,可直接修改 application.properties 文件:
nacos.core.auth.enabled=true
nacos.core.auth.server.identity.key=Authorization
nacos.core.auth.server.identity.value=my_token_value
nacos.core.auth.plugin.nacos.token.secret.key=your_secret_key

重启 Nacos 服务后生效。

如需将配置文件持久化到 mysql,可参考:

[nacos] Nacos <2> 基于 Docker 安装Nacos 2.x - 博客园/千千寰宇

Step3 访问验证

  • 验证Nacos服务是否启动成功
  • 方法1:通过docker logs -f $container_id命令,查看Nacos服务启动日志,如果看到如下日志,说明服务启动成功。
Nacos started successfully in xxxx mode. use xxxx storage

image

  • 方法2:
curl -X POST "http://<nacos_host>:8848/nacos/v1/auth/login" -d "username=nacos&password=nacosPassword"

如: curl -X POST "http://127.0.0.1:8848/nacos/v1/auth/login" -d "username=nacos&password=nacosPassword"

页面会显示: Nacos Console default port is 8080, and the path is /.

image

相比 nacos 2.x ,nacos 3.x 最大的新增特性即:【MCP管理】

image

3 MCP Server 自动注册与发现

3.1 概述

  • 除了在控制台手动注册 MCP Server 服务以外,通过使用Spring AI Alibaba 框架 或者 Nacos MCP Wrapper Python 开发 MCP Server, 可以在 MCP Server启动后动态注册至 Nacos,并对齐进统一管理,支持以下能力:
  • MCP Server 服务动态管理:通过 MCP 服务列表增删改查服务信息
  • 描述动态生效:工具描述、参数定义等元信息支持运行时热更新,无需重启服务。
  • MCP Server Tools 动态开关:支持 MCP Server 服务 Tools 运行时动态开启和关闭,无需重启服务。
  • 全链路集成:服务注册信息自动同步至 Nacos 配置中心与服务发现模块,适配 AI Agent 调用需求
  • 注册到 Nacos MCP Registry 中的服务,可以通过 Spring AI Alibaba 框架 或者 Nacos MCP Router 进行发现和调用,或者对接 Higress 网关,实现全链路集成。

image

Higress(AI网关) / Spring AI Alibaba 程序(AI智能应用) / NACOS MCP 管理 的三者关系

3.2 MCP Server 自动注册

使用 Spring AI Alibaba Nacos MCP 框架开发 MCP Server

step1 依赖引入

<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-mcp-registry</artifactId>
    <version>{1.0.0.3及以上版本}</version>
</dependency>

<!-- MCP Server (WebMVC) -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
    <version>{1.0.0及以上版本}</version>
</dependency>

step2 服务定义(实例)

@Service
public class WeatherService {

  @Tool(description = "Get weather information by city name")
  public String getWeather(@ToolParam(description = "City name") String cityName) {
    return "Sunny in " + cityName;
  }
}

step3 自动注册参数配置

spring:
  application:
    name: mcp-nacos-registry-example
  ai:
    mcp:
      server:
        name: webmvc-mcp-server   # MCP服务名称
        version: 1.0.0            # 服务版本
        type: SYNC                # 调用类型:SYNC(同步)或ASYNC(异步)
        instructions: "This mcp server provides time information tools and resources"
    alibaba:
      mcp:
        nacos:
          server-addr:          # 替换为你的 Nacos 地址
          namespace: public    # Nacos 命名空间 ID(默认为public)
          username:           # 开源控制台用户名
          password:           # 开源控制台密码
          register:
            enabled: true   # 是否开启服务注册

step4 服务启动

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ToolCallbackProvider weatherTools(WeatherService weatherService) {
        return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
    }

}

使用 Nacos MCP Wrapper Python 开发 MCP Server

step1 环境准备

pip install nacos-mcp-wrapper-python

step2 自动注册参数配置

nacos_settings = NacosSettings()
nacos_settings.SERVER_ADDR = "127.0.0.1:8848" # <nacos_server_addr> e.g. 127.0.0.1:8848
nacos_settings.NAMESPACE= "public" # Nacos 命名空间ID
nacos_settings.USERNAME="" #开源控制台用户名
nacos_settings.PASSWORD="" #开源控制台密码

step3 MCP Server 代码编写

from nacos_mcp_wrapper.server.nacos_mcp import NacosMCP
from nacos_mcp_wrapper.server.nacos_settings import NacosSettings
import logging
import nacos_login as nacos_login

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

# Create an MCP server instance
nacos_settings = NacosSettings()
# 需要 nacos-server 开通 8848 / 9848 端口 | 验证方法: ssh 127.0.0.1 -p 9848 -v
nacos_settings.SERVER_ADDR = "127.0.0.1:8848"  # <nacos_server_addr> e.g. 127.0.0.1:8848
nacos_settings.USERNAME = "nacos"
nacos_settings.PASSWORD = "nacosPassword"
mcp = NacosMCP("nacos-mcp-python", nacos_settings=nacos_settings, version="1.0.1", port=18001)


# Register an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two integers together"""
    return a + b


# Register a subtraction tool
@mcp.tool()
def minus(a: int, b: int) -> int:
    """Subtract two numbers"""
    return a - b

# 注册工具(装饰器方式,与官方 SDK 完全一致)
@mcp.tool()
def calculate(expression: str) -> str:
    """执行数学计算表达式"""
    return str(eval(expression))

@mcp.tool()
def get_weather(city: str) -> str:
    """获取指定城市的天气"""
    return f"{city} 今天晴天,25°C"


# 运行逻辑:
#   程序启动后会注册几个工具:add / minus / calculate / get_weather
#   使用 SSE 方式运行在端口 18001(在第 9 行设置)
#   连接到 Nacos 服务注册中心 (地址:127.0.0.1:8848)
#   服务名称为 nacos-mcp-python,版本 1.0.1
#   异常会被捕获并打印错误信息

# 如何发现并调用该 mcp 服务? curl http://127.0.0.1:18001/sse //todo 待续


if __name__ == "__main__":
    logger.info(f"正在连接 Nacos 服务器:{nacos_settings.SERVER_ADDR}")
    logger.info(f"用户名:{nacos_settings.USERNAME}")
    try:
        # transport/通信模式
        mcp.run(transport="sse") # sse: Server-sent events/SSE (Server-sent Events):服务器推送事件到客户端;适用于:需要实时数据推送的场景; 特点:单向通信(服务器 → 客户端),基于 HTTP 长连接
        # mcp.run(transport="stdio") # stdio :标准输入输出:通过进程的 stdin/stdout 通信; 适用于:本地进程间通信、命令行工具集成; 特点:双向通信,适合本地部署
        # mcp.run(transport="streamable-http") # streamable-http/流式 HTTP:支持流式响应的 HTTP 协议; 适用于:需要双向通信的 Web 场景; 特点:双向通信,支持更复杂的交互模式
    except Exception as e:
        print(f"Runtime error: {e}")
        logger.error(f"Runtime error: {e}", exc_info=True)
        print(f"\n连接失败,请检查:")
        print(f"1. Nacos 服务器 {nacos_settings.SERVER_ADDR} 是否可访问")
        print(f"2. 用户名密码是否正确")
        print(f"3. 网络防火墙是否开放端口")

更多使用案例可参见:

image

3.X 推荐文献

Y 推荐文献

https://nacos.io/docs/v3.0/quickstart/quick-start-docker

X 参考文献

env NACOS_AUTH_TOKEN must be set with Base64 String.

env NACOS_AUTH_IDENTITY_KEY must be set.

posted @ 2025-09-20 00:23  千千寰宇  阅读(532)  评论(1)    收藏  举报