# Nacos 配置中心
# maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
# 配置
在以前的版本中会创建一个 bootstrap.yml 来把配置放在这个文件,让他优先加载
但是 在 Spring Cloud 2021 开始就不在扫描 bootstrap.yml 这个文件了,所以就在 application.yml 里面就行了
从2021.0.5版本起,Spring Cloud将不再默认启用bootstrap 包,所以针对该问题,解决方案有两种:
- application.yml中添加以下配置,用以指定引入的配置文件。
spring:
config:
import: nacos:${spring.application.name}.:${spring.cloud.nacos.config.file-extension}
- pom或build.gradle中引入boostrap依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.0.1</version>
</dependency>
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap:4.0.1'
# 读取配置文件
- 在 Nacos 上新建配置文件配置文件的命名,是有要求的,在项目启动的时候,会在控制台上打印文件名
user:
username: 123
- 配置 Nacos 地址
spring:
cloud:
nacos:
config:
file-extension: yml
server-addr: localhost:8848
- 读取配置文件,这里以输出为例
在项目启动的时候,会去加载配置文件,到本地,这里的 user.username 也就是放在了 Nacos 上的配置
@RestController
@RequestMapping("/depart")
@RequiredArgsConstructor
public class DepartController {
@Value("${user.username}")
private String name;
@GetMapping("/name")
public String username() {
return name;
}
}
# Nacos 配置文件共享
# 同一个组共享
共享文件必须在同一个group + namespace
spring:
cloud:
nacos:
config:
file-extension: yml
server-addr: 124.222.183.73:8848
shared-configs[0]:
data-id: sharconfig.yml
refresh: true
# 不同的 group 和 namespace共享
spring:
cloud:
nacos:
config:
file-extension: yml
server-addr: 124.222.183.73:8848
extension-configs[0]:
data-id: sharconfig.yml
refresh: true
# 同时有 shared-configs 又既有 extension-configs
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
file-extension: yml
server-addr: 124.222.183.73:8848
shared-configs[0]:
data-id: sharconfig.yml
refresh: true
extension-configs[0]:
data-id: sharconfig.yml
refresh: true
加载顺序
- 共享配置
- 扩展配置
- 当前服务配置 若在三个配置中具有相同属性设置,但它们具有不同的值,那么,后加载的会将先加载的给覆盖
优先级顺序
- 当前服务配置
- 扩展配置
- 共享配置
# 快照
Spring Cloud 会把配置 下载一个保存到本地,定期的更新,他的加载顺序为
当加载到一个配置文件后,不会在继续加载后续的
- 本地配置
- 远程(Nacos)
- 快照
# 动态刷新
在类上标注 @RefreshScope 即可