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 Context
和 Application 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 提供的),就比如像下面的:
@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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!