Nacos 与项目整合

2023-11-20 14:19:26 浏览数 (1)

1、Nacos 与项目整合

1.1、最外层 pom 文件内容
代码语言:html复制
<!-- spring boot 版本 -->
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
	
   <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.2.6.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR7</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.0.RELEASE</spring-cloud-alibaba.version>
    </properties>
	
	<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
1.2、模块 pom
代码语言:html复制
 <dependencies>

        <!-- nacos -->
        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>


        <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-config -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

** bootstrap.yml **

代码语言:yaml复制
spring:
  application:
    name: order
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS-HOST:127.0.0.1}:${NACOS-PORT:8848}
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml


  profiles:
    active: dev

为什么要使用 bootstrap.yml 而不是 application.yml 呢?

第一是因为 bootstrap 优先于 application 加载。 第二是保证 Bootstrap ContextApplication Context 配置的分离,具体可以看 https://www.baeldung.com/spring-cloud-bootstrap-properties 的 Conclusion 与 https://www.cnblogs.com/blognetspace/p/8469033.html

项目启动的时候会默认加载一个 prefix '-' ${spring.active.profile} . ${spring.cloud.nacos.config.file-extension} 的配置文件,而 prefix 默认是 spring.application.name,当然也可以重置: spring.cloud.nacos.config.prefix

示例项目地址https://gitee.com/rookiesJ/nacos-test.git

2、配置读取

2.1、定位其他配置集

看过之前的章节可以知道,我们之前创建过命名空间,设定过 group,那之前的操作怎么使用呢?

我们只需要配置 spring.cloud.nacos.config.namespace 就可以指定命名空间,配置 spring.cloud.nacos.config.group 就可以指定分组。如果 namespace 不填的话默认是 “public” 的 ID,group 不填的话默认是 “DEFAULT_GROUP” 。

那 namespace 与 group 怎么填呢?

namespace 填的是 “命名空间 ID”,在菜单中的命名空间可以看到,或者看这个位置。

而 group 就在配置列表的配置集中的 Group 字段。

例子:

代码语言:yaml复制
spring:
  cloud:
    nacos:
      config:
        namespace:
        group:
2.2、项目中读取环境配置

既然我们在 Nacos 中配置了一些配置项,那里我们在项目中是如何去读取 Nacos 配置的呢?

其实和我们平时读取配置的操作是一模一样的。

代码语言:text复制
 @Value("${haha}")
 private String test;

就这样。

2.3、配置文件自动刷新

我们修改 Nacos 配置集中的配置项,然后控制台也有提示说某某属性已被更新成啥东西,但是为什么刷新后还是原来的值呢?spring.cloud.nacos.config.refresh-enabled 是 true 啊(默认是 true),自动刷新已经启动了啊,为什么还是最开始读取的?

这个跟 @Value 注解读取配置有关系,具体有啥关系,我后续再补上。反正它读取的是最开始加载的配置,要想刷新它读取的配置,必须在需要刷新的类上加上 @RefreshScope 注解(spring cloud 提供的),就比如像下面的:

代码语言:less复制
@RestController
@RefreshScope
public class TestController {


    @Value("${you}")
    private String test;

    @RequestMapping("test")
    public String test(){
        return test;
    }
}

这样就可以动态读取环境配置了。还有其他方法,我就不一一描述了。

2.3、一个模块对应多个配置文件

既然项目可以读取 Nacos 配置集,那能不能读取多个呢? ok,这个问题开发者也想到了,下面来看看如何操作。

第一种方式是采用 extension-configs 的配置方式:

代码语言:yaml复制
spring:
  cloud:
    nacos:
      config:
        extension-configs:
          -
            data-id: extends-base-dev.yml 
			refresh: true

refresh 是开启自动刷新配置功能。这个也可以指定 group 这样的配置,和上面的是一样的。如果是 .properties 格式化的,就写成spring.cloud.nacos.config.extension-configs[0].data-id=这样。

第二种方式是采用 shared-configs 的方式:

代码语言:yaml复制
spring:
  cloud:
    nacos:
      config:
        shared-configs:
          -
            data-id: extends-base-dev.yml
			refresh: true

他们之间的区别就在于加载优先级的问题,不过老的版本是 shared-configs 不能指定 group 等其他属性,1.4 版本没有这个问题。

2.4、配置文件加载优先级

bootstrap > application > extension-configs > shared-configs

在 extension-configs 等中的数组配置文件的下标越大,则优先级越高,后续加载的属性会覆盖掉前面的属性。越后加载,属性冲突后面加载的属性就会覆盖前面的属性。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞