0 前言
今天又在 SpringBoot 3.3.0 项目中引入了 Nacos ,过程一波三折,踩了不少坑,本来以为顶多一个上午就能搞定的事,硬是搞了 1.5 天。
Nacos 的官方文档真是我见过写的 最差的文档,按照官方文档的操作来,居然跑不起来,你说神奇不神奇
今天我就把 SpringBoot 整合 Nacos 的过程和遇到的问题都写下来,避免大家重复踩坑
1 安装 Nacos
1.1 Windows 安装 Nacos
Naocs 官方文档:https://nacos.io/

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

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

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

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

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

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

下载完怎么部署起来呢?官方文档有介绍,先解压缩包,在进入到 /nacos/bin 目录下,执行启动命令
startup.cmd -m standalone
其中 standalone 表示单机运行,而非集群模型运行
下面演示一下

我已经进入 bin 目录下了

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

这样就进入了终端输入框

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

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

就在本以来 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].

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

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

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

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

看上去增加了好多 AI 的功能
1.2 docker 启动 nacos
Nacos 官网也有介绍 docker 部署的方式,这里我介绍单机部署,如下图所示:

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

启动命令:
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

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

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

上图可以看到,已经启动成功了
1.3 K8s 部署 Naocs

官方文档中,明确说明 K8s不支持单例模式的部署,但是我们在开发时往往都是单机,而且公司习惯使用 K8s 部署,怎么办呢?
我也是纠结了好久,后来突然开窍,docker 单机部署的脚本,让 AI 改一下不就可以 K8s 部署吗?具体的脚本我就不写了,大家直接把上面 docker 部署 nacos 的脚本丢给 AI 就行了

官方文档中介绍了 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,如下图:

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

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

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>

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 上配置文件的格式
启动项目,能成功启动,如下图:

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

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

dataId 可以随便填,我写的是 application-dev.yml ,那么代码中就会读取这个配置中的内容
Group 是组名,用默认的
格式选择 YAML
我还随便写了配置,表示公司名是张三

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

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

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

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


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

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

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

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

官方文档翻了几遍,都没有介绍代码中配置命名空间,最后总结,按照 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/

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

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

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

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

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

application.yaml 如下:

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

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

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

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

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

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

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

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

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

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

仔细阅读 4 种方式之后就会发现,只有 第 4 种方式是最简单、最适合我们的,只需要使用 2 个注解: @RefreshScope 和 @Value
可能有人会问:源码里怎么都是读取 Nacos 自己已有的配置信息,如果我写了自定义的配置信息呢?比如前面我配置了 company.name ,这种自定义的能读到吗?试一下

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

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

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

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

看下官方文档中的介绍,只需要做 3 步:
- 引入依赖
- 配置 Nacos 地址
- 启动类上加个
@EnableDiscoveryClient注解
看上去相当 so easy
第一步:依赖早就引入了

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

第三步:启动类上加 @EnableDiscoveryClient 注解
项目启动后,回到 Nacos 页面,发现服务列表里有服务了,说明服务注册成功了。到这儿还没完!!!

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

我是在 Naocs 官网 https://nacos.io/docs/v3.1/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.75338c4d.0.0.1f9dcd36JJrLlw 看到的,但是我没有使用跟文档中介绍的版本号
3 总结
Nacos 官方文档,写的真是一言难尽,需要不停的去试错