Windows Docker K8s 安装部署Naocs ,SpringBoot 3.X 4.X整合Naocs 版本兼容 配置中心、服务注册与发现

简介: 本文记录 SpringBoot 3.3 整合 Nacos 3.3 的实战踩坑全过程:从 Windows/Docker/K8s 多方式部署(含鉴权配置)、命名空间适配难题,到正确引入 Spring Cloud Alibaba 依赖、配置 `@RefreshScope` 实现动态刷新,以及服务注册发现配置。直击官方文档不完善、版本兼容混乱等痛点,助开发者避坑提效。(239字)

0 前言

今天又在 SpringBoot 3.3.0 项目中引入了 Nacos ,过程一波三折,踩了不少坑,本来以为顶多一个上午就能搞定的事,硬是搞了 1.5 天。

Nacos 的官方文档真是我见过写的 最差的文档,按照官方文档的操作来,居然跑不起来,你说神奇不神奇

今天我就把 SpringBoot 整合 Nacos 的过程和遇到的问题都写下来,避免大家重复踩坑

1 安装 Nacos

1.1 Windows 安装 Nacos

Naocs 官方文档:https://nacos.io/

image-20261031191807065

现在官方文档的最新版都 3.3 了,那我们自然看最新的

image-20261031192006070

官方文档点进来就是这样,关于 Nacos ,这里就不介绍了,相信大家都相当了解,想要下载 Nacos ,就点击 快速开始

image-20261031192123332

咱们直奔主题,怎么下载呢?有个版本选择

image-20261031192209657

点进去之后往下滑,就能找到压缩包下载

image-20261031192242193

如果不想下载最新版本,想下载历史版本,点击【发布历史】

image-20261031192300561

上图就是 Nacos 的历史版本入口

image-20261031192454020

下载完怎么部署起来呢?官方文档有介绍,先解压缩包,在进入到 /nacos/bin 目录下,执行启动命令

startup.cmd -m standalone

其中 standalone 表示单机运行,而非集群模型运行

下面演示一下

image-20261031193353153

我已经进入 bin 目录下了

image-20261031193444855

在当前目录下输入 cmd ,回车

image-20261031193523906

这样就进入了终端输入框

image-20261031193632071

输入启动命令 startup.cmd -m standalone ,但是上图可以看到,要输入什么东西

image-20261031193817506

官方文档中说是开启了鉴权,所以要输入 token 秘钥签名,我也不知道干嘛的,暂时就随便输入了 123

image-20261031194021796

就在本以来 so easy 之际,意外来了,居然报错了,这很符合咱们技术人的历程:事情总不会一帆风顺

详细的报错信息如下:

Microsoft Windows [版本 10.0.19045.6466]
(c) Microsoft Corporation。保留所有权利。

D:\HQ\tools\17.nacos\nacos-server-3.3.0\nacos\bin>startup.cmd -m standalone
nacos.core.auth.server.identity.key value is empty, please input:
nacos.core.auth.server.identity.key Updated with new value:
nacos.core.auth.server.identity.key=
----------------------------------
nacos.core.auth.server.identity.value value is empty, please input: 123
nacos.core.auth.server.identity.value Updated with new value:
nacos.core.auth.server.identity.value=123
----------------------------------
"nacos is starting with standalone"
19:39:24,013 |-WARN in ch.qos.logback.classic.joran.action.LevelAction - <level> element is deprecated. Near [level] on line 730
19:39:24,017 |-WARN in ch.qos.logback.classic.joran.action.LevelAction - Please use "level" attribute within <logger> or <root> elements instead.

         ,--.
       ,--.'|
   ,--,:  : |                                           Nacos Server 3.3.0
,`--.'`|  ' :                       ,---.               Running in stand alone mode, All function modules
|   :  :  | |                      '   ,'\   .--.--.
:   |   \ | :  ,--.--.     ,---.  /   /   | /  /    '   Pid: 32
|   : '  '; | /       \   /     \.   ; ,. :|  :  /`./
'   ' ;.    ;.--.  .-. | /    / ''   | |: :|  :  ;_
|   | | \   | \__\/: . ..    ' / '   | .; : \  \    `.      https://nacos.io
'   : |  ; .' ," .--.; |'   ; :__|   :    |  `----.   \
|   | '`--'  /  /  ,.  |'   | '.'|\   \  /  /  /`--'  /
'   : |     ;  :   .'   \   :    : `----'  '--'.     /
;   |.'     |  ,     .-./\   \  /            `--'---'
'---'        `--`---'     `----'

2026-10-31 19:39:25,467 INFO Nacos Server is starting...

2026-10-31 19:39:26,474 INFO Nacos Server is starting...

2026-10-31 19:39:27,485 INFO Nacos Server is starting...

2026-10-31 19:39:28,494 INFO Nacos Server is starting...

2026-10-31 19:39:29,502 INFO Nacos Server is starting...

2026-10-31 19:39:30,141 WARN Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clusterOperatorV2Impl' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/ClusterOperatorV2Impl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'namingMetadataOperateService' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/v2/metadata/NamingMetadataOperateService.class]: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception

2026-10-31 19:39:30,149 WARN [WatchFileCenter] start close

2026-10-31 19:39:30,150 WARN [WatchFileCenter] start to shutdown this watcher which is watch : D:\HQ\tools\17.nacos\nacos-server-3.3.0\nacos\conf

2026-10-31 19:39:30,150 WARN [WatchFileCenter] already closed

2026-10-31 19:39:30,150 INFO [NotifyCenter] Start destroying Publisher

2026-10-31 19:39:30,151 INFO [NotifyCenter] Completed destruction of Publisher

2026-10-31 19:39:30,151 ERROR Startup errors :

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clusterOperatorV2Impl' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/ClusterOperatorV2Impl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'namingMetadataOperateService' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/v2/metadata/NamingMetadataOperateService.class]: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1382)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1221)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1218)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1184)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:994)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
        at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:154)
        at com.alibaba.nacos.bootstrap.NacosBootstrap.startCoreContext(NacosBootstrap.java:103)
        at com.alibaba.nacos.bootstrap.NacosBootstrap.startWithConsole(NacosBootstrap.java:87)
        at com.alibaba.nacos.bootstrap.NacosBootstrap.main(NacosBootstrap.java:55)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:106)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
        at org.springframework.boot.loader.launch.PropertiesLauncher.main(PropertiesLauncher.java:580)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'namingMetadataOperateService' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/v2/metadata/NamingMetadataOperateService.class]: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:321)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:309)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1382)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1221)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
        ... 26 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:220)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:129)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:318)
        ... 40 common frames omitted
Caused by: java.util.ServiceConfigurationError: com.alibaba.nacos.auth.config.NacosAuthConfig: Provider com.alibaba.nacos.core.auth.NacosServerAdminAuthConfig could not be instantiated
        at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:813)
        at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at com.alibaba.nacos.common.spi.NacosServiceLoader.load(NacosServiceLoader.java:49)
        at com.alibaba.nacos.auth.config.NacosAuthConfigHolder.<init>(NacosAuthConfigHolder.java:38)
        at com.alibaba.nacos.auth.config.NacosAuthConfigHolder.<clinit>(NacosAuthConfigHolder.java:32)
        at com.alibaba.nacos.core.distributed.raft.auth.NacosJRaftServerInterceptor.<init>(NacosJRaftServerInterceptor.java:54)
        at com.alibaba.nacos.core.distributed.raft.utils.JRaftUtils.initRpcServer(JRaftUtils.java:88)
        at com.alibaba.nacos.core.distributed.raft.JRaftServer.start(JRaftServer.java:210)
        at com.alibaba.nacos.core.distributed.raft.JRaftProtocol.init(JRaftProtocol.java:121)
        at com.alibaba.nacos.core.distributed.raft.JRaftProtocol.init(JRaftProtocol.java:92)
        at com.alibaba.nacos.core.distributed.ProtocolManager.lambda$initCPProtocol$3(ProtocolManager.java:142)
        at com.alibaba.nacos.sys.utils.ApplicationUtils.getBeanIfExist(ApplicationUtils.java:70)
        at com.alibaba.nacos.core.distributed.ProtocolManager.initCPProtocol(ProtocolManager.java:138)
        at com.alibaba.nacos.core.distributed.ProtocolManager.getCpProtocol(ProtocolManager.java:88)
        at com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService.<init>(NamingMetadataOperateService.java:46)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:207)
        ... 42 common frames omitted
Caused by: com.alibaba.nacos.api.exception.runtime.NacosRuntimeException: errCode: 50002, errMsg: Empty identity, Please set `nacos.core.auth.server.identity.key` and `nacos.core.auth.server.identity.value`, detail: https://nacos.io/docs/latest/manual/admin/auth/
        at com.alibaba.nacos.core.auth.NacosServerAdminAuthConfig.validate(NacosServerAdminAuthConfig.java:74)
        at com.alibaba.nacos.core.auth.NacosServerAdminAuthConfig.<init>(NacosServerAdminAuthConfig.java:58)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        ... 61 common frames omitted
2026-10-31 19:39:30,155 ERROR Nacos failed to start, please see D:\HQ\tools\17.nacos\nacos-server-3.3.0\nacos\logs\nacos.log for more details.

2026-10-31 19:39:30,164 INFO

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.

2026-10-31 19:39:30,190 ERROR Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'clusterOperatorV2Impl' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/ClusterOperatorV2Impl.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'namingMetadataOperateService' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/v2/metadata/NamingMetadataOperateService.class]: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1382)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1221)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1218)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1184)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1121)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:994)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:621)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:756)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:445)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:321)
        at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:154)
        at com.alibaba.nacos.bootstrap.NacosBootstrap.startCoreContext(NacosBootstrap.java:103)
        at com.alibaba.nacos.bootstrap.NacosBootstrap.startWithConsole(NacosBootstrap.java:87)
        at com.alibaba.nacos.bootstrap.NacosBootstrap.main(NacosBootstrap.java:55)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:106)
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:64)
        at org.springframework.boot.loader.launch.PropertiesLauncher.main(PropertiesLauncher.java:580)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'namingMetadataOperateService' defined in URL [jar:nested:/D:/HQ/tools/17.nacos/nacos-server-3.3.0/nacos/target/nacos-server.jar/!BOOT-INF/lib/nacos-naming-3.3.0.jar!/com/alibaba/nacos/naming/core/v2/metadata/NamingMetadataOperateService.class]: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:321)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:309)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1382)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1221)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:371)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:331)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:201)
        at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:229)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1762)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1651)
        at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:912)
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791)
        ... 26 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService]: Constructor threw exception
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:220)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:129)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:318)
        ... 40 common frames omitted
Caused by: java.util.ServiceConfigurationError: com.alibaba.nacos.auth.config.NacosAuthConfig: Provider com.alibaba.nacos.core.auth.NacosServerAdminAuthConfig could not be instantiated
        at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:813)
        at java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:729)
        at java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1403)
        at com.alibaba.nacos.common.spi.NacosServiceLoader.load(NacosServiceLoader.java:49)
        at com.alibaba.nacos.auth.config.NacosAuthConfigHolder.<init>(NacosAuthConfigHolder.java:38)
        at com.alibaba.nacos.auth.config.NacosAuthConfigHolder.<clinit>(NacosAuthConfigHolder.java:32)
        at com.alibaba.nacos.core.distributed.raft.auth.NacosJRaftServerInterceptor.<init>(NacosJRaftServerInterceptor.java:54)
        at com.alibaba.nacos.core.distributed.raft.utils.JRaftUtils.initRpcServer(JRaftUtils.java:88)
        at com.alibaba.nacos.core.distributed.raft.JRaftServer.start(JRaftServer.java:210)
        at com.alibaba.nacos.core.distributed.raft.JRaftProtocol.init(JRaftProtocol.java:121)
        at com.alibaba.nacos.core.distributed.raft.JRaftProtocol.init(JRaftProtocol.java:92)
        at com.alibaba.nacos.core.distributed.ProtocolManager.lambda$initCPProtocol$3(ProtocolManager.java:142)
        at com.alibaba.nacos.sys.utils.ApplicationUtils.getBeanIfExist(ApplicationUtils.java:70)
        at com.alibaba.nacos.core.distributed.ProtocolManager.initCPProtocol(ProtocolManager.java:138)
        at com.alibaba.nacos.core.distributed.ProtocolManager.getCpProtocol(ProtocolManager.java:88)
        at com.alibaba.nacos.naming.core.v2.metadata.NamingMetadataOperateService.<init>(NamingMetadataOperateService.java:46)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:207)
        ... 42 common frames omitted
Caused by: com.alibaba.nacos.api.exception.runtime.NacosRuntimeException: errCode: 50002, errMsg: Empty identity, Please set `nacos.core.auth.server.identity.key` and `nacos.core.auth.server.identity.value`, detail: https://nacos.io/docs/latest/manual/admin/auth/
        at com.alibaba.nacos.core.auth.NacosServerAdminAuthConfig.validate(NacosServerAdminAuthConfig.java:74)
        at com.alibaba.nacos.core.auth.NacosServerAdminAuthConfig.<init>(NacosServerAdminAuthConfig.java:58)
        at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
        at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
        at java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:789)
        ... 61 common frames omitted
2026-10-31 19:39:30,195 INFO [ThreadPoolManager] Start destroying ThreadPool

2026-10-31 19:39:30,196 INFO [ThreadPoolManager] Completed destruction of ThreadPool

19:39:30,198 |-WARN in Logger[org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager] - No appenders present in context [default] for logger [org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager].

image-20261031212045206

在让 deepseek harness分析了 27 分钟之后,判断出是我的环境变量配置的有问题,说是我配置 jdk 带有双引号,虽然看上去没有,我让 AI 自动帮我改了

image-20261031205409366

下面重新启动一下,启动成功,如下图

image-20261031212541302

浏览器访问:localhost:8080 ,账号密码都是 Nacos

image-20261031212635650

登录进去之后,页面长这样:

image-20261031212919849

看上去增加了好多 AI 的功能

1.2 docker 启动 nacos

Nacos 官网也有介绍 docker 部署的方式,这里我介绍单机部署,如下图所示:

image-20261031210553310

docker 部署的方式看上去特别简单,就一行命令,如下图:

image-20261031210821994

启动命令:

docker run --name nacos-standalone-auth -e MODE=standalone -e NACOS_AUTH_ENABLE=true -e NACOS_AUTH_TOKEN=${customToken} -e NACOS_AUTH_IDENTITY_KEY=${customKey} -e NACOS_AUTH_IDENTITY_VALUE=${customValue} -p 8848:8848 -d -p 9848:9848  nacos/nacos-server:v3.3.0

启动命令中有 3 个变量,可以先随便写成 123

我自己写了一个能成功启动的脚本:

docker run --name nacos-standalone-derby \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=true \
  -e NACOS_AUTH_TOKEN=5BCuiOefdEI6boYEoJRiRKOmqDG3aBd32IW2jKl0TKc= \
  -e NACOS_AUTH_IDENTITY_KEY=nasos \
  -e NACOS_AUTH_IDENTITY_VALUE=nacos \
  -p 8060:8080 \
  -p 8868:8848 \
  -p 9848:9848 \
  -v /data/huqing/nacos/data:/home/nacos/data \
  -v /data/huqing/nacos/logs:/home/nacos/logs \
  -d nacos/nacos-server:v3.3.0

image-20261031220157168

启动脚本写在了 startNacos.sh 这个文件中

image-20261031220335917

启动之后如上图,使用 docker logs 命令查看日志

image-20261031220418365

上图可以看到,已经启动成功了

1.3 K8s 部署 Naocs

image-20261031222726162

官方文档中,明确说明 K8s不支持单例模式的部署,但是我们在开发时往往都是单机,而且公司习惯使用 K8s 部署,怎么办呢?

我也是纠结了好久,后来突然开窍,docker 单机部署的脚本,让 AI 改一下不就可以 K8s 部署吗?具体的脚本我就不写了,大家直接把上面 docker 部署 nacos 的脚本丢给 AI 就行了

image-20261031223006522

官方文档中介绍了 K8s 集群部署 nacos ,要先部署 NFS 、MySQL ,看上去特别麻烦,所以我还是使用 K8s 单机部署

2 SpringBoot 3.X 整合Nacos 3.3

2.1 错误配置中心

前面艰难地把 Nacos 部署起来了,现在要在我的 SpringBoot 项目中整合 Naocs ,由于我使用 SpringBoot 3.3.0 ,正好官方文档中有介绍【Nacos 融合 Spring Boot 3,如下图:

image-20261031233642207

官方文档中介绍的相当简单,只需要引入一个依赖,并在 application.yaml 中配置 Nacos 就行

image-20261031235008383

我新建了一个很干净的 SpringBoot 项目,项目结构非常简单,只有 pom.xml 、application.yaml 和 SpringNacosApplication(启动类)这 3 个文件,如下图:

image-20261031234222783

pom.xml 中我只引入了 2 个依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-alibaba-nacos-config</artifactId>
  <version>2023.0.3.2</version>
</dependency>

image-20261031234854747

application.yaml

# 端口
server:
  port: 9001

spring:
  application:
    # 服务名称
    name: spring-nacos
  config:
    import: # 读取 nacos 上的哪个文件呢?读 application-dev.yml 这个文件,它的组名是默认的,application-dev.yml其实就是 nacos 中的 dataId
      - nacos:application-dev.yml?group=DEFAULT_GROUP
  nacos:
    config:
      server-addr: localhost:8848        # 连接nacos的地址,注意不是浏览器访问nacos的地址,而是代码跟nacos通信的地址
      username: nacos                     # 登录nacos的账号
      password: nacos                     # 登录nacos的密码
      file-extension: yaml               # nacos 上配置文件的格式

启动项目,能成功启动,如下图:

image-20261101003404462

现在访问 Nacos ,新增一个命名空间:dev ,表示开发环境

image-20261101000628551

然后来配置列表,在 dev 这个命令空间下新建配置

image-20261101000723282

dataId 可以随便填,我写的是 application-dev.yml ,那么代码中就会读取这个配置中的内容

Group 是组名,用默认的

格式选择 YAML

我还随便写了配置,表示公司名是张三

image-20261101003518143

新建一个 Controller ,使用 @Value 注解来读取 nacos 中配置的变量值,看能不能读到

image-20261101003612185

重启项目,报错,显示读不到 company.name 这个变量

image-20261101003913454

日志往上翻还能看到,配置是空的,整个配置根本没读到

image-20261101004001473

我能想到的原因就是我把配置写在了 dev 这个命令空间下,代码中肯定是读取默认的命名空间下的配置了,于是我去默认的命名空间下新建了一个配置

image-20261101004231163

image-20261101004413867

重启项目后,能启动成功,日志也显示加载 Nacos 配置成功

image-20261101004350885

浏览器调用接口试下,也能调用成功,能获取到值

image-20261101004506118

这就说明一开始跑不起来的原因,就是命名空间的原因,这时候我就想到去 application.yaml 中配置命名空间,可是 spring.nacos.config 下面我找遍了,都没有关于命名空间的配置

image-20261101004741834

我甚至自作聪明,在 import 中补上命名空间的名字或者id,结果试了都不行

image-20261101004906329

官方文档翻了几遍,都没有介绍代码中配置命名空间,最后总结,按照 Nacos 官方文档中没有介绍如何配置命名空间,只能读取默认命名空间下的配置,这真的是想骂人了,Nacos 官方文档是我见过最差的文档

2.2 正确配置中心

问题还没解决,可是问题必须得解决啊,我自定义命名空间是很正常的需求,怎么读取到自定义命名空间下的配置呢?

网上搜了好久,Nacos 对 Spring Boot 3.x 的支持很糟糕,一旦使用 Spring Boot 3.x 及以上版本,不能直接整合 nacos ,而是得整合 spring cloud alibaba nacos

我还纠结了蛮久,我的项目只使用了 SpringBoot ,没有使用 Spring Cloud ,我不想使用 Spring Cloud 怎么办?由不得你了

网上直接搜索 spring cloud alibaba ,得知它的官网地址:https://sca.aliyun.com/

image-20261101005754434

进来后可以看到很多阿里巴巴开发的开源应用,第一个就是 nacos

image-20261101005925624

spring cloud alibaba nacos 最新版本是 2025.x ,我们就用最新的

image-20261101010117647

官方文档中明确介绍,要接入 Nacos 作为配置中心,只需要引入依赖并在 application.yaml 中配置就行,但是细心的人就会发现,这里跟 Nacos 官网介绍的依赖不一样

image-20261101010225598

关于服务注册与发现,也只需要引入一个依赖

image-20261101010626594

为了一次性到位,我就把 2 个依赖都引入了,一个是用于配置中心,一个用于服务注册与发现

image-20261101010711140

application.yaml 如下:

image-20261101201230241

上图可以看到,已经可以配置命名空间了

image-20261101201523793

项目启动,成功加载了 Nacos 上的配置,并且项目启动成功,没有报错

image-20261101201618833

手动调一下接口,也能读到数据,到这里就完了吗?当然没完

image-20261101201801296

现在我在 Nacos 上改下公司名字,改成 李四,

image-20261101201902344

再次调用接口,得到的还是张三,并没有读到最新的值:李四,说明当使用 @Value("${company.name}") 注解时,并不能读到 Nacos 上修改后的值

image-20261101202152324

我改换成 @NacosValue 注解,重启后再次调用接口,居然读不到值

image-20261101203254870

我仔细阅读官方文档,发现有一段很隐蔽的介绍,关于如何读取 Nacos 上的配置,有 4 中方式。估计大家看到这一脸懵逼,肯定会有疑问,这 4 种方式具体是怎么做呢?

image-20261101203512197

页面往下滑,有个 Nacos 配置管理源码示例,我就好奇点了进去

image-20261101203734431

点进来就是这样,需要打开 nacos-config-example 这个工程

image-20261101203836436

打开之后发现还真有 4 个类,这不就是官方文档中介绍的读取 Nacos 配置的 4 种方式吗?官网诚不欺我,就是介绍的不够详细,为什么不在 4 种方式后面都加一个超链接呢?

image-20261101204123365

仔细阅读 4 种方式之后就会发现,只有 第 4 种方式是最简单、最适合我们的,只需要使用 2 个注解: @RefreshScope 和 @Value

可能有人会问:源码里怎么都是读取 Nacos 自己已有的配置信息,如果我写了自定义的配置信息呢?比如前面我配置了 company.name ,这种自定义的能读到吗?试一下

image-20261101204508232

现在我已改好代码了,只用 2 个注解,读取的也是自定义配置

image-20261101204611648

项目启动一下,手动调用一下接口,发现能读到数据

image-20261101204657661

现在我去 Nacos 改下配置,把公司名字改成王五,但是项目不重启,而是再次调用接口,看下在不重启的情况下能不能读到修改后的配置

image-20261101204822505

能读到修改后的配置,完美

2.3 服务注册与发现

在搞定完配置中心之后,咱们继续搞服务注册与发现。什么是服务注册与发现?如果别的服务想调用你的接口,就得知道你的 ip 、端口,你换一台服务器部署,那对方也得改。那服务注册与发现就是把你的服务注册到 Nacos 中,然后别的服务在 Nacos 中就可以看到你的服务,并且在调用你的接口时,可以通过服务名来调用,而不需要知道你的 ip 、端口

image-20261101205311603

看下官方文档中的介绍,只需要做 3 步:

  1. 引入依赖
  2. 配置 Nacos 地址
  3. 启动类上加个 @EnableDiscoveryClient 注解

看上去相当 so easy

image-20261101205635243

第一步:依赖早就引入了

image-20261101205736660

第二步:配置 Nacos ,但是细心的人就会发现,我代码中的配置跟官方文档中介绍的有点不一样,我把 server-addr 单独拎出来放在了最上面,用于公共配置,不然的话,在 config 和 discovery 下面都得配置 server-addr , 重复配置总有点膈应,所以我单独拎出来作为公共配置了

image-20261101210145691

第三步:启动类上加 @EnableDiscoveryClient 注解

image-20261101210318479

项目启动后,回到 Nacos 页面,发现服务列表里有服务了,说明服务注册成功了。到这儿还没完!!!

image-20261101210505874

细心的朋友可能会问?为什么你引入 Nacos 依赖时就知道要使用这个版本?那我在引入依赖时,我怎么知道版本号写多少?

image-20261101211201026

我是在 Naocs 官网 https://nacos.io/docs/v3.1/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.75338c4d.0.0.1f9dcd36JJrLlw 看到的,但是我没有使用跟文档中介绍的版本号

3 总结

Nacos 官方文档,写的真是一言难尽,需要不停的去试错

相关文章
|
3天前
|
JavaScript API iOS开发
DeepSeek Harness下载、安装、配置一篇搞定(2026整理,送常用插件)
DeepSeek Harness(DSH)是DeepSeek于2026年开源的MIT协议AI Agent框架,支持插件化组装模型、工具、沙箱与UI,兼容主流大模型。本文提供免Node.js的桌面端安装包(Win/macOS),含详细图文教程及热门插件推荐。
|
云安全 安全 网络安全
|
17天前
|
JSON 程序员 数据格式
最新版Notepad++下载、安装、配置保姆级教程(附官网安装包)
Notepad++ 是一款免费开源、轻量快速的 Windows 文本编辑器,支持多标签、语法高亮、代码折叠与宏录制,体积小、启动快、资源占用低,兼容 x64/x32/ARM 架构,是程序员和文字工作者的高效利器。
4136 1
|
16天前
|
人工智能 API 开发工具
DeepSeek Harness 神插件:白嫖 13 家大厂模型
`dsh-our-free-model` 是 DeepSeek Harness 神级插件:零配置、零API Key、零账号,聚合13家大厂免费模型(含DeepSeek V4.1 Flash、Kimi K3等),支持本地网关、用量看板与自动降级,真正实现“白嫖即用”。
2752 47
|
10天前
|
JavaScript 安全 前端开发
Nodejs Brotli decoder 代码执行漏洞 (CVE-2026-111497)10629
Node.js发布安全更新修复Brotli解码器高危RCE漏洞(CVE-2026-111497),建议受影响版本用户立即升级。
2068 2
|
9天前
|
人工智能 JSON Linux
【保姆级】ComfyUI部署教程(下载+安装+配置+工作流,2026最新)
ComfyUI 是一款开源节点式AI生成工具,支持图像、视频、音频及3D内容创作。通过拖拽连线组合模型加载、提示词、采样等节点,构建可复用、易修改的工作流,兼容SD1.5、SDXL、Flux、Qwen Image等主流模型。
|
13天前
|
Web App开发 人工智能 前端开发
2026 年 AI 浏览器怎么选?Ego Lite、Tabbit、Chrome DevTools MCP 深度对比,开发者到底该用哪个?
2026年AI浏览器选型指南:Ego Lite专注多Agent协同(Mac优先),Tabbit国产首选,原生支持Windows与Codex控制;Chrome DevTools MCP非浏览器而是开发者利器,深度集成Console/Network/Performance调试能力,让AI真正“看懂并验证”前端代码。
1537 3
|
11天前
|
开发者 索引
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用
Open Plugin Market 是一个开放插件索引平台,收录800+优质DSH插件,支持分类浏览、智能推荐与随机发现。无需安装市场,粘贴索引地址即可一键接入,网页版直访 dshopen.org,助力小开发者被看见。(239字)
2157 1
DeepSeekHarness大肥鱼自带插件市场了?加个地址就能用