配置中心的作用
基本用法
自动刷新配置
demo如下
spring.application.name=service-order
server.port=8000
spring.cloud.nacos.server-addr=127.0.0.1:8848
spring.config.import=nacos:service-order.properties
nacos冒号后面跟的实际上就是配置的Data Id
通过控制类demo测试
@RefreshScope//自动刷新
@RestController
public class OrderController {
@Value("${order.timeout}")
String timeout;
@Value("${order.auto-confirm}")
String autoConfirm;
@GetMapping("/config")
public String config() {
return timeout+","+autoConfirm;
}
}
访问controller即可,若想配置中心发生变化配置也跟着变化,则需要使用@RefreshScope注解 添加了配置中心的依赖,若没有引入nacos配置,则无法启动,在配置文件中加入以下即可
spring.cloud.nacos.config.import-check.enabled=false
若配置中心配置多,那么书写繁琐。
因此可以使用springboot的批量绑定,使用@ConfigurationProperties并指定前缀,配置批量绑定在nacos下,可以无需@RefreshScope就能实现自动刷新,需要将配置类注册为spring的一个bean才能生效,nacos中的-号则对应驼峰命名法,如autoConfirm即auto-confirm 首先将配置封装为一个类;
package com.atguigu.order.properties;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "order") //配置批量绑定在nacos下,可以无需@RefreshScope就能实现自动刷新
@Data
public class OrderProperties {
String timeout;
String autoConfirm;
}
修改demo
@Autowired
OrderProperties orderProperties;
@Autowired
OrderService orderService;
@GetMapping("/config")
public String config() {
return orderProperties.getTimeout()+","+orderProperties.getAutoConfirm();
}
仍然正常配置
监听配置变化
NacosConfigManager 监听配置变化
package com.atguigu.order;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@EnableDiscoveryClient
@SpringBootApplication
public class OrderMainApplication {
public static void main(String[] args) {
SpringApplication.run(OrderMainApplication.class, args);
}
//1、项目启动就监听配置文件变化
//2、发生变化后拿到变化值
//3、发送邮件
@Bean
ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){
return args -> {
ConfigService configService = nacosConfigManager.getConfigService();
configService.addListener("service-order.properties",
"DEFAULT_GROUP", new Listener() {
@Override
public Executor getExecutor() {
return Executors.newFixedThreadPool(4);
}
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("变化的配置信息:"+configInfo);
System.out.println("邮件通知...");
}
});
System.out.println("=========");
};
}
}
思考 Nacos中的数据集 和 application.properties 有相同的配置项,哪个生效?
==Nacos数据集生效==
springboot可以导入多个nacos数据集,以逗号分隔即可,若这些数据集也冲突,则谁先导入谁生效
数据隔离
区分环境
nacos配置中心通过namespace区分环境,通过分组区分微服务,通过数据集区分配置文件
默认的命名空间是public
nacos提供了克隆选项可以快速克隆配置到其他命名空间
激活环境
配置多的情况下,使用yml比较合适
server:
port: 8000
spring:
application:
name: service-order
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
# 激活的命名空间
namespace: dev
config:
import:
# 导入指定组的数据集
- nacos:common.properties?group=order
- nacos:database.properties?group=order
同时可以针对不同的命名空间选择导入不同的数据集
server:
port: 8000
spring:
profiles:
# 激活的命名空间
active: prod
application:
name: service-order
cloud:
nacos:
server-addr: 127.0.0.1:8848
config:
#禁用导入检查
import-check:
enabled: false
# 读取spring.profiles.active的值,默认则为public,可以设置为其它
namespace: ${spring.profiles.active:public}
# 当激活namespace为dev时导入的数据集
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
activate:
on-profile: dev
# 当激活namespace为test时导入的数据集
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
- nacos:haha.properties?group=order
activate:
on-profile: test
# 当激活namespace为prod时导入的数据集,不存在的数据集不会导入
---
spring:
config:
import:
- nacos:common.properties?group=order
- nacos:database.properties?group=order
- nacos:hehe.properties?group=order
activate:
on-profile: prod