问题现象
启动springboot应用时报错,能够读取到nacos配置,但是使用nacos作为注册中心,应用注册到nacos失败。
应用配置bootstrap.properties如下:
# 应用编码,安装时替换变量
spring.application.name=data-center
# 应用端口,安装时替换变量
server.port=8510
#spring cloud alibaba nacos配置
# 应用配置文件
spring.cloud.nacos.config.server-addr=192.168.10.188:8848
# 应用配置文件名,将会读取nacos:$app_name.properties 配置文件
spring.cloud.nacos.config.name=data-center.properties
# 按产品配置分组名
spring.cloud.nacos.config.group=holms
# 命名空间,方便后续产品一体化部署,全部产品部署在同一命名空间,方便dubbo使用注册中心相互消费
spring.cloud.nacos.config.namespace=public
# dubbo注册中心
spring.cloud.nacos.discovery.server-addr=192.168.10.188:8848
# 注册中心分组,全部产品配置同一个分组,方便dubbo使用注册中心相互消费
spring.cloud.nacos.discovery.group=rpc
spring.cloud.nacos.discovery.namespace=public
#企业级通用common配置
spring.cloud.nacos.config.shared-configs[0].data-id=common.properties
spring.cloud.nacos.config.shared-configs[0].group=holms
spring.cloud.nacos.config.shared-configs[0].refresh=true
#产品线通用common配置
spring.cloud.nacos.config.shared-configs[1].data-id=common-holms.properties
spring.cloud.nacos.config.shared-configs[1].group=holms
spring.cloud.nacos.config.shared-configs[1].refresh=true
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.discovery.heart-beat-interval=3000
spring.cloud.nacos.discovery.heart-beat-timeout=10000
spring.main.allow-bean-definition-overriding=true
spring.main.allow-circular-references=true
spring.mvc.hiddenmethod.filter.enabled=true
错误信息
关键错误信息:
NacosServiceRegistry] [main] []: nacos registry, data-center register .NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{serverAddr=‘127.0.0.1:8848’……
详细错误信息:
2024-07-25 13:39:59.059 [10.57.240.122] [ERROR] [com.alibaba.cloud.nacos.registry.NacosServiceRegistry] [main] []: nacos registry, data-center register failed...NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{serverAddr='127.0.0.1:8848', username='test', password='', endpoint='', namespace='public', watchDelay=30000, logName='', service='yuntu-qiming', weight=1.0, clusterName='DEFAULT', group='yuntu', namingLoadCacheAtStart='false', metadata={preserved.heart.beat.timeout=10000, IPv6=null, preserved.register.source=SPRING_CLOUD, preserved.heart.beat.interval=3000}, registerEnabled=true, ip='192.168.10.122', networkInterface='', port=8501, secure=false, accessKey='', secretKey='', heartBeatInterval=3000, heartBeatTimeout=10000, ipDeleteTimeout=null, instanceEnabled=true, ephemeral=true, failureToleranceEnabled=false}, ipDeleteTimeout=null, failFast=true}},
com.alibaba.nacos.api.exception.NacosException: Client not connected, current status:STARTING
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:639)
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:619)
……
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.register(AbstractAutoServiceRegistration.java:232)
at com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration.register(NacosAutoServiceRegistration.java:78)
at org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration.start(AbstractAutoServiceRegistration.java:133)
原因分析
我的应用bootstrap.propeties 中明明已经配置了nacos作为注册中心,但是应用在启动后,一直显示的注册地址是127.0.0.1【NacosDiscoveryProperties{serverAddr=‘127.0.0.1:8848’】,这就很奇怪。
我尝试更改其他配置的值,在应用启动时打印出来,都能修改成功。唯独下面的几个配置项,无论如何修改,值都不会变化。
# dubbo注册中心
spring.cloud.nacos.discovery.server-addr=192.168.10.188:8848
# 注册中心分组,全部产品配置同一个分组,方便dubbo使用注册中心相互消费
spring.cloud.nacos.discovery.group=rpc
spring.cloud.nacos.discovery.namespace=public
于是,通过代码debug,观察serverAddr的值,发现该值一直为空。
经过反复几次实验,终于想到,会不会是其他地方也配置了该配置项,且没有配置值,从而导致该配置项的值一直是空。
于是排查启动命令是否有参数,再把nacos应用要读取的配置文件都检查一遍。
从bootstrap.properties 中可以看到,应用总共会读取三个配置文件:
common.properties,common-holms.properties,data-center.properties
那就挨个检查这三个配置文件吧,果不其然,在common.properties中终于找到。又是粗心的某位同事……
原因总结:应用启动 -> 率先读取bootstrap.properties -> 加载nacos上配置 -> 读取common.properties -> 使用common.properties 中配置覆盖掉bootstrap.properties 内容 -> 导致配置为空。
重复配置,且配置为空,导致读取不到nacos discovery 相关的配置信息。因为相同的key,被最后一组配置覆盖了。
问题解决
去掉 nacos上的common.properties 关于nacos discovery 相关重复的配置项,再次重启应用。问题解决