1什么是配置中心
在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移(分割),这样配置就分散了,不仅如此,分散中还包含着冗余,如下图:
2为什么要使用配置中心
配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去管理配置。
Nacos是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
3 下载部署
见nacos 注册中心篇
4 实战
4.1 引入 pom
<!-- bootstrap 启动器,让 bootstrap.yaml 生效 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
4.2 bootstrap.yml 配置
配置中心的配置只能放在bootstrap.yml 中
spring:
application:
# 应用名称
name: mycloud-nacos
profiles:
# 环境配置
active: pro
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: xxxx:8848
config:
# 配置中心地址 默认按照application-name去匹配配置文件
server-addr: xxxx:8848
# 配置文件格式
file-extension: yaml
配置中心地址 默认按照application-name去匹配配置文件,默认读properties后缀。
4.3 nacos 平台新增配置文件
namespace:名称空间用于隔离不同租户的配置。组和数据 id 可以在不同的名称空间中相同。名称空间的典型场景是不同项目组的配置隔离,例如,team1/team2/team3之间的隔离。
Group:默认情况下,当没有定义{ spring.cloud.nacos.config.group }配置时,使用 DEFAULT _ group。如果您需要定义自己的组,可以在以下属性中定义它:
spring.cloud.nacos.config.group=DEVELOP_GROUP
这个配置必须在 bootstrap.properties 文件中,Group 的值必须与 spring.cloud.nacos.config.Group 的值相同,常用来作为不同的项目
Data ID: 默认为
a
p
p
l
i
c
a
t
i
o
n
.
n
a
m
e
−
{application.name}-
application.name−{spring.profiles.active}.properties
其中spring.profiles.active 是根据服务application配置文件制定的环境自动适配的
Data ID 默认采用properties后缀我们可以通过 spring.cloud.nacos.config.file-extension: yaml 来让它读取yaml 后缀,可作为区分多模块项目配置文件,以及多环境配置文件
3)
配置mycloud-nacos.yaml
配置mycloud-nacos-dev.yaml
配置 mycloud-nacos-pro.yaml
4.4 读取nacos 多环境配置
1) 在nacos 上新增配置文件
@RestController
@RequestMapping("/nacos")
@RefreshScope
@Slf4j
public class TestController {
@Value("${age}")
private Integer age;
@Value("${id}")
private Integer id;
@RequestMapping("/testConfig")
public void testConfig(){
log.info("-------age:{}-----",age);
log.info("-------id:{}-----",id);
log.info("-------name:{}", SpringUtil.getEnvironmentProperty("name"));
}
}
2) 当 spring.profiles.active: pro 时
![在这里插入图片描述](https://img-blog.csdnimg.cn/e08976c740d44c15beb3ec8d2ca27a41.png)
**可见当指定环境时 mycloud-nacos-pro.yaml
,mycloud-nacos.yaml 配置都会被读取且前者中的相同配置会覆盖后者,完全符合springboot中多环境配置文件规则。**
3) 当 spring.profiles.active: dev 时
age 变成了 880 说明nacos的配置会跟着spring.profiles.active 变化。
![在这里插入图片描述](https://img-blog.csdnimg.cn/a1964dafc36545c2b97a100362288deb.png)
**3) 当 采用spring.profiles.include:druid,dev 时**
dataId 为 applicationName-dev.yaml, applicationName-druid.yaml 都会被加载
### 4.5读取 nacos 共享配置
1)bootstrap.yaml:
```java
server:
port: 7001
# Spring
spring:
application:
# 应用名称
name: mycloud-nacos
profiles:
# 环境配置
active: pro
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: xxxx:8848
config:
# 配置中心地址 默认按照application-name去匹配配置文件
server-addr: xxxx:8848
# 配置文件格式
file-extension: yaml
# 共享配置
shared-configs[0]:
data-id: common.${spring.cloud.nacos.config.file-extension:yaml}
refresh: true #不加共享配置不会生效
- nacos上新增配置文件 common-dev.yaml
3)设置spring.profiles.active: dev
4)结果
address 已经能够读到,但是我们发现id 并不是common-dev.yaml 中设置的8600 而是mycloud-nacos.yaml 中设置的 1 ,这说明共享配置的优先级比较低。
4.5 配置自动刷新
@RefreshScope 是nacos 开启配置自动刷新的注解,开启后nacos中配置跟新,服务会拉取最新配置进行更新。
常用搭配
1.@RefreshScope + @ConfigurationProperties()
2.@RefreshScope + @value
测试在nacos2.0版本 @ConfigurationProperties() 不配置@RefreshScope 也可自动刷新,@value必须配置@RefreshScope才可自动刷新。
@Configuration
@ConfigurationProperties(prefix = "auth")
@Data
@Slf4j
public class AuthConfig {
private String address;
@PostConstruct
public void init(){
log.info("----------auth address:{}",address);
}
}
@Value("${testVal}")
private int testVal;
@Resource
private AuthConfig authConfig;
@GetMapping("/sendmsg")
public void test(){
log.info("-----auth authConfig:{}",authConfig);
log.info("----- testVal:{}",testVal);
}
改变nacos 配置 authConfig 同步改变,testVal 值没改变,而且发现AuthConfig 中 @PostConstruct 修饰的init方法被调用了,说明nacos上配置刷新时,配置类会重新初始化。