【日常小问】Docker 部署 Nacos 2.4.3,Dubbo 3.3 连接 Config Service 失败排查 一、问题出现最近在本地搭建一个基于 Dubbo 3.3 Nacos 2.4.3 的项目Nacos 跑在 Docker 里项目以 jar 包方式跑在宿主机上。启动后遇到报错Failed to create nacos config service client. Reason: server status check failed. Server status: UP. Config Service Available: false.重试 11 次后直接抛异常退出项目起不来。最诡异的是——同事机器上的 Nacos 能连上我自己 Docker 里的就是不行。二、问题原因最终定位出两个原因一个在部署层面一个在 Dubbo 底层。2.1 端口映射不全部署问题Nacos 2.x 除了 HTTP 端口 8848还需要两个 gRPC 端口端口偏移量用途8848主端口HTTP API、健康探活98481000客户端 gRPCDubbo 实际连这个98491001集群 gRPC服务端间通信只映射 8848 的结果HTTP 探活能过Server status: UP但 Dubbo 做 gRPC 健康检查时连不上 9848报Config Service Available: false。三个端口必须全部映射。2.2 Dubbo 3.3 内置的 ConfigService 连接不兼容 Nacos 认证根本原因补全端口后如果 Nacos 开启了认证Dubbo 侧依然报同样的错误。关键发现Nacos 的认证功能本身没有问题——控制台登录、Token 签发均正常。问题出在 Dubbo 3.3 的底层实现。经逐一排查Dubbo 3.3 中有两处会独立创建 Nacos ConfigService 去做健康检查且都不传递认证凭证模块触发方式能否通过配置阻止NacosDynamicConfigurationConfig Center发现 classpath 上有 Nacos 即自动创建可以config-center: address: empty://localhostNacosMetadataReportMetadata ReportSPI 自动加载位于dubbo-3.3.0.jar核心包内无法阻止——不用 Maven 排除、不用enabled: false、不用 URL 传参第二处是死结NacosMetadataReport的构造函数里会创建 ConfigService 做健康检查这个请求不带任何认证凭证。只要 Nacos 开了认证它就会报Server status: UP. Config Service Available: false并阻塞启动。因此目前的结论是Dubbo 3.3 的 Metadata Report 模块不支持在 Nacos 开启认证的环境下工作。这个问题并非 Nacos 或项目配置的锅而是 Dubbo 3.3 的局限性。三、最终方案3.1 Nacos 侧关认证nacos.core.auth.enabledfalse3.2 Conductor 侧精简 Dubbo 配置虽然 Metadata Report 无法通过配置阻止但 Config Center 可以主动禁掉减少不必要的连接开销dubbo: application: metadata-type: local registry: address: nacos://127.0.0.1:8848 use-as-config-center: false config-center: address: empty://localhost3.3 Nacos 完整配置 启动命令本次项目选择用 Docker 里的 MySQL 做 Nacos 持久化。完整application.propertiesserver.servlet.contextPath/nacos server.port8848 spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://mysql:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneAsia/ShanghaiallowPublicKeyRetrievaltrue db.user.0root db.password.0123456 nacos.core.auth.enabledfalse nacos.console.ui.enabledtrue启动 Nacos注意用 Docker 网络直连 MySQL避免host.docker.internal连到宿主机上另一个 MySQL 实例# 创建网络把 MySQL 加进去 docker network create nacos-net docker network connect nacos-net mysql # 启动 Nacos三个端口都要映射 docker run -d --name nacos --network nacos-net \ -p 8848:8848 -p 9848:9848 -p 9849:9849 \ -e MODEstandalone -e PREFER_HOST_MODEhostname \ -v 本地路径\application.properties:/home/nacos/conf/application.properties:ro \ -v 本地路径\logs:/home/nacos/logs \ nacos/nacos-server:v2.4.33.4 初始化 MySQL Schema使用外部 MySQL 时需要从 Nacos 的 release zip 包中取conf/mysql-schema.sql建库导入# 1. 建库 docker exec -i mysql mysql -uroot -p123456 -e ^ CREATE DATABASE IF NOT EXISTS nacos_config DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci # 2. 导入 schemaPowerShell 下用 cmd /c 避免编码问题 cmd /c type C:\Users\Administrator\Desktop\nacos\conf\mysql-schema.sql | docker exec -i mysql mysql -uroot -p123456 nacos_config四、总结根因一Docker 部署 Nacos 2.x 忘映射 gRPC 端口 9848/9849根因二Dubbo 3.3 的NacosMetadataReport在 Nacos 开启认证时无法完成内部健康检查这是 Dubbo 3.3 的底层限制配置层面无解当前只能通过关闭 Nacos 认证规避排查这类问题的心得先做减法——先把认证、加密、外部存储全部关掉让最简单的环境跑通再逐个加回来curl 直接测 API——别只看 HTTP 探活用curl -X POST /nacos/v1/cs/configs确认 Config Service 能正常读写区分服务端问题和客户端问题——Nacos 控制台能登录、Token 能发说明服务端没问题锅在 Dubbo