2022-6月更文挑战3-浅谈由于bootstrap配置文件导致的nacos配置不生效问题

392 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

浅谈由于bootstrap配置文件导致的nacos配置不生效问题

前文

本文内容主要是在springcloud项目中,当引入配置中心nacos时,出现的nacos配置文件不生效的问题及其问题产生的原因。文章内容主要为对于该问题的解决及相关知识的记录,其中难免有不准确之处。

问题原因

首先根据nacos官方当进行了相关配置的引入,主要为springcloud配置以及springcloudAlibaba的相关配置,此处不进行具体的解释。下面进入到核心的内容,代码中选择采用配置文件中的某个内容作为验证点,简单看一下请求层的代码:

    @Value("${nacos.test.data:abc}")
    String testData;

    @RequestMapping("/test")
    @SentinelResource("/test")
    public Object a(){
        System.out.println(testData);
        return "hello world";
    }

可以看到我们在代码中进行了配置的获取。而原始的设计想法则是通过nacos配置中心进行配置内容的修改,使得当请求发生时,实际获取到的参数会发生变化。当然,在nacos中已经提前指定好与服务名相关的配置文件,此处也不进行详细的解释。

在看一下对于nacos配置中心的配置:

spring:
  application:
    name: test-code
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

如上所示,指定了nacos配置中心。但此处则导致了本文中所出现的问题,该配置文件被写到application.yml。实际上,nacos的配置需要我们写入到bootstrap.yaml中,作为启动后最先加载的配置文件才能生效。改正了这个问题后依然不生效,原因是没有进行相关的jar包引用:

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

引入该jar包后上述问题解决,成功的从nacos配置中心读取到目标数据:

image.png

为什么需要放在bootstrap中

bootstrap.yaml与application.yaml实际上是通过spring的不同上下文加载的,而bootstrap会优先进行加载,且其中的内容不会因为application中内容同名而被覆盖。而nacos像常规的springcloud的配置中心一样,要求我们将配置信息放入到bootstrap中,在启动第一阶段进行配置中心的连接。而这,也是出现该问题的关键之处。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。