天天看点

SpringCloud NacosConfig: create config service error! (NacosException: null)bootstrap.properties/yml

在使用nacos作为配置中心整合springcloud时,项目启动会报错,导致nacos的配置功能无法启用

最后解决办法是将nacos的配置写在bootstrap.properties内

(参考:Nacos整合SpringCloud入门示例)

分析过程如下:

异常信息:

SpringCloud NacosConfig: create config service error! (NacosException: null)bootstrap.properties/yml
2019-03-13 19:32:07.019 ERROR 19543 --- [           main] o.s.c.a.nacos.NacosConfigProperties      : create config service error!properties=NacosConfigProperties{serverAddr='null', encode='null', group='DEFAULT_GROUP', sharedDataids='null', refreshableDataids='null', prefix='null', fileExtension='properties', timeout=3000, endpoint='null', namespace='null', accessKey='null', secretKey='null', contextPath='null', clusterName='null', name='null', activeProfiles=[]},e=,
com.alibaba.nacos.api.exception.NacosException: null
    at com.alibaba.nacos.api.config.ConfigFactory.createConfigService(ConfigFactory.java:45) ~[nacos-api-0.6.2.jar:na]
    at com.alibaba.nacos.api.NacosFactory.createConfigService(NacosFactory.java:41) ~[nacos-api-0.6.2.jar:na]
    at org.springframework.cloud.alibaba.nacos.NacosConfigProperties.configServiceInstance(NacosConfigProperties.java:347) ~[spring-cloud-alibaba-nacos-config-0.2.1.RELEASE.jar:0.2.1.RELEASE]
    at org.springframework.cloud.alibaba.nacos.client.NacosPropertySourceLocator.locate(NacosPropertySourceLocator.java:63) [spring-cloud-alibaba-nacos-config-0.2.1.RELEASE.jar:0.2.1.RELEASE]
    at org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration.initialize(PropertySourceBootstrapConfiguration.java:94) [spring-cloud-context-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:633) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:373) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:325) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.2.RELEASE.jar:2.0.2.RELEASE]
    at top.kylewang.nacos.cloud.user.NacosCloudUserApplication.main(NacosCloudUserApplication.java:12) [classes/:na]
           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

相关环境:

  • 项目依赖版本
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>0.2.1.RELEASE</version>
</dependency>
           
  • 1
  • 2
  • 3
  • 4
  • 5

配置文件:

server.port=8082
server.servlet.context-path=/user
spring.application.name=user-service
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
           
  • 1
  • 2
  • 3
  • 4

异常分析:

  1. 从异常栈信息上找到顶部抛出异常的类,可以看到是在创建NacosConfgiServer时报错
    SpringCloud NacosConfig: create config service error! (NacosException: null)bootstrap.properties/yml
  2. 跟着debug的调用链进去看源码发现,此异常是在调用NacosConfigServer的构造器,并在 new ServerHttpAgent (properties) 时抛出,这里应该是根据我们在项目中配置的nacos server的地址,去创建一个监听远端配置的agent,但是打断点可以看到,此时使用的properties内部值全部为空,我配置的contextPath和serverAddr也没有生效。
    SpringCloud NacosConfig: create config service error! (NacosException: null)bootstrap.properties/yml
    SpringCloud NacosConfig: create config service error! (NacosException: null)bootstrap.properties/yml
  3. 此时想到是不是我的配置文件还没有加载,然后将本来配置在application.properties里的配置,换到bootstrap.properties内然后再启动,再次构建NacosConfigServer时,已经将我配置的serverAddr成功注入。项目启动成功,没有抛出异常,并且正常访问nacos的配置
    SpringCloud NacosConfig: create config service error! (NacosException: null)bootstrap.properties/yml
  4. 通过后续了解,SpringCloudConfig和 NacosConfig这种统一配置服务在springboot项目中初始化时,都是加载bootstrap.properties配置文件去初始化上下文。

    这是由spring boot的加载属性文件的优先级决定的,想要在加载属性之前去config server上取配置文件,那NacosConfig或SpringCloudConfig相关配置就是需要最先加载的,而bootstrap.properties的加载是先于application.properties的,所以config client要配置config的相关配置就只能写到bootstrap.properties里了

文章转自:https://blog.csdn.net/wk52525/article/details/88547069