美文网首页
springboot 2.4.13 无法从nacos获取配置,但

springboot 2.4.13 无法从nacos获取配置,但

作者: 暮丶晓 | 来源:发表于2022-07-02 19:30 被阅读0次

    springboot 2.4.13,集成了nacos,启动后,nacos注册中心有服务,但是,发现,配置没有生效。于是,开启了一段源码查找的过程。

    首先,是pom引入的nacos配置

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2021.1</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>2021.1</version>
    </dependency>
    

    然后,application.yml添加nacos配置

    spring:
      cloud:
        nacos:
          server-addr: 127.0.0.1:8848
          config:
            enabled: true
            fileExtension: yaml
          discovery:
            enabled: true
          username: nacos
          password: nacos
    

    启动后,发现注册中心有服务,但是,服务的配置不是从nacos配置中心获取的,而是本地的。

    查找一下nacos源码,找到nacos配置自动注入那块儿:

    NacosConfigBootstrapConfiguration

    然后发现,是这个NacosPropertySourceLocator实现的配置导入的

    NacosPropertySourceLocator

    查询源码,可以发现,相关的配置,是通过这个方法,加载的,这个方法是总入口。

    于是,尝试加断点,查看配置信息,看看为什么没有导入配置。然而,程序根本就没有进入这个方法里面!!!

    根据接口实现,可以发现NacosPropertySourceLocator 是PropertySourceLocator的实现类,这个方法的调用执行,不是nacos自己去做的,而是通过spring去做的。

    SpringApplication SpringApplication SpringApplicationRunListeners EventPublishingRunListener SimpleApplicationEventMulticaster SimpleApplicationEventMulticaster BootstrapApplicationListener

    spring cloud 通过BootstrapApplicationListener,以监听器的方式,通过监听springboot启动过程中的事件,通过onApplicationEvent方法处理事件,导入spring cloud相关配置。

    通过加断点,可以发现,这里的方法bootstrapEnabled()返回值是false,直接就不执行后续的加载了。

    因此,需要保证bootstrapEnabled返回值是true。

    PropertyUtils

    查看PropertyUtils源码,可以发现,需要配置项 spring.cloud.bootstrap.enabled=true 并且存在 org.springframework.cloud.bootstrap.marker.Marker 类的时候,spring cloud 才会去加载spring cloud的配置。

    因此,pom中需要添加marker所在的组件依赖:

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bootstrap</artifactId>
        <version>3.1.3</version>
    </dependency>
    

    此时,需要在bootstrap.yml中添加spring cloud配置:

    spring:
     cloud:
       bootstrap:
         enabled: true
       nacos:
         server-addr: 127.0.0.1:8848
         config:
           enabled: true
           fileExtension: yaml
         discovery:
           enabled: true
         username: nacos
         password: nacos
    

    (至于为什么是bootstrap.yml而不是application.yml,这又是另一个问题了)

    有了上面的配置,程序启动后,就能正常的从nacos配置中心获取配置了。

    相关文章

      网友评论

          本文标题:springboot 2.4.13 无法从nacos获取配置,但

          本文链接:https://www.haomeiwen.com/subject/srukbrtx.html