Nacos-配置中心
1.基本用法

1.1引入nacos配置中心依赖
直接在父模块services中引入即可
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1.2配置文件
在子模块service-order中的application.yml中添加如下配置信息
spring :
cloud:
config:
import: nacos:service-order.yml
1.3创建配置
在浏览器输入localhost:8848/nacos,进入配置管理>配置列表>创建配置,输入Data ID和配置内容后点击发布即可

1.4获取配置信息
在OrderController中添加如下:
// 获取配置信息
@Value("${order.timeout}")
private String orderTimeout;
@Value("${order.auto-confirm}")
private String orderAutoConfirm;
@GetMapping("/config")
public String config(){
return "order.timeout:" + orderTimeout + "order.auto-confirm:" + orderAutoConfirm;
}
启动MainOrderApplication,可以在控制台中看到[Nacos Config] Load config[dataId=service-order.yml, group=DEFAULT_GROUP] 成功加载了数据集

以及监听该配置[Nacos Config] Listening config: dataId=service-order.yml, group=DEFAULT_GROUP

浏览器访问localhost:8000/config

可以看到数据也从配置中心成功获取,当需要修改配置时,可以在该控制器类中加入@RefreshScope注解,激活自动刷新功能。
1.5 禁用配置检查
在实际业务开发中,并非每个服务都需要导入配置,这个时候直接运行启动类,就会报错,那就需要在配置文件中加入禁用配置的检查的设置了sping.cloud.nacos.config.import-check.enabled=false
spring :
cloud:
nacos:
server-addr: 127.0.0.1:8848
# 禁用配置检查
config:
import-check:
enabled: false
application :
name: service-product
server:
port: 9000
加入该项设置后,启动类就可以正确运行,但是因为未导入任何配置,因此控制台中也无法获取到配置信息
2.动态刷新
当导入的配置很多时,这个时候通过@value注解一个一个注入就很繁琐,可以选择通过将这些数据集抽取到一个properties类中,批量导入
2.1创建OrderProperties类
在com.atguigu.order包中连包带类创建properties.OrderProperties类,添加对应注解
package com.atguigu.order.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component // 将当前类对象注入到spring容器中
@ConfigurationProperties(prefix = "order") // 将当前类对象和配置文件中的order.*进行绑定,无需@RefreshScope注解刷新
@Data
public class OrderProperties {
private String orderTimeout;
private String orderAutoConfirm;
}
2.2批量导入配置集
删去OrderController中的Value注解和RefreshScope注解
修改OrderContrleer类中config方法的返回语句
调用orderProperties类的getter方法获取(注意通过Autowired注解注入orderProperties对象)
public String config(){
return "order.timeout:" + orderProperties.getOrderTimeout() + "order.auto-confirm:" + orderProperties.getOrderAutoConfirm();
}
运行启动类,效果和之前是完全相同的,该方式提供了批量快速导入且无需自动刷新功能。
3.配置监听
3.1优化启动类
在OrderMainApplication中添加监听配置方法
@Bean
ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager) {
return (ApplicationArguments args) -> {
ConfigService configService = nacosConfigManager.getConfigService();
configService.addListener("service-order.yml", "DEFAULT_GROUP", new Listener() {
@Override
public Executor getExecutor() {
return Executors.newFixedThreadPool(5);
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("变化值:" + configInfo);
System.out.println("发送邮件");
}
});
System.out.println("项目启动就监听配置文件变化");
};
}
3.2 测试配置监听
运行启动类
浏览器访问localhost:8848/nacos,进入配置管理>编辑配置

修改完点击发布即可,可以通过控制台看到修改后的配置集

思考: Nacos中的数据集 和 application.properties 有相同的 配置项,哪个优先生效?
配置优先级: 先导入优先/外部优先
当配置中心和application.yml配置文件中都存在配置集时,外部配置(配置中心)中的配置会优先生效
4.数据隔离
需求描述 • 项目有多套环境:dev,test,prod • 每个微服务,同一种配置,在每套环境的值都不一样。 • 如:database.properties • 如:common.properties • 项目可以通过切换环境,加载本环境的配置 • 难点 • 区分多套环境 • 区分多种微服务 • 区分多种配置 • 按需加载配置

4.1 创建命名空间&配置
在nacos控制台中创建命名空间

按此步骤,一共创建是三个命名空间

在配置管理中,创建配置,注意选择dev命名空间

按此步骤创建即可,要分别在三个命名空间创建相同的配集齐,较为繁琐,可以通过克隆来提高效率

重复上述步骤,直到三个命名空间中配置集相同。

4.2优化配置文件
server:
port: 8000
spring :
application:
name: service-order
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
namespace: dev
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
4.3测试数据隔离
添加dburl
public class OrderProperties {
private String orderTimeout;
private String orderAutoConfirm;
private String dburl;
}
完善OrderController
完善config方法
public String config(){
return "order.timeout:" + orderProperties.getOrderTimeout() + "order.auto-confirm:" +
orderProperties.getOrderAutoConfirm()+"order.dburl:" + orderProperties.getDburl();
}
运行OrderMainApplication启动类,可以看到成功监听了[Nacos Config] Listening config: dataId=common.yml, group=order和[Nacos Config] Listening config: dataId=database.yml, group=order

通过浏览器访问localhost: 8000/config,也成功获取了配置集

5.动态切换环境
5.1修改application.yml配置文件
server:
port: 8000
# 动态激活环境
spring:
profiles:
active: test
application:
name: service-order
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
# 命名空间
namespace: test
logging:
level:
com.alibaba.nacos.client.config: DEBUG
org.springframework.cloud.bootstrap: DEBUG
# 开发环境
---
spring:
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
activate:
on-profile: dev
# 测试环境
---
spring:
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
activate:
on-profile: test
# 生产环境
---
spring:
config:
import:
- nacos:common.yml?group=order
- nacos:database.yml?group=order
activate:
on-profile: prod
运行启动类,可以看到此时环境已然切换到了test测试环境

访问localhost:8000/nacos,可以看到此时获取的数据也均为测试环境的配置集

若需要切换不同的环境只需修改配置文件中的active和namespace即可实现动态环境切换。

6.总结
1. 引入 spring-cloud-starter-alibaba-nacos config 依赖,配置Nacos地址
2. 添加 数据集(data-id),使用 spring.config.import 导入数据集
3. @Value + @RefreshScope 取值 + 自动刷新
4. @ConfigurationProperties批量绑定自动刷新
5. NacosConfigManager 监听配置变化 扩展: 配置优先级;namespace区分环境、group区分 微服务、data-id区分配置 实现 数据隔离+环境切换
更多推荐


所有评论(0)