Spring Cloud Alibaba快速入门02-Nacos(下)
文章目录
- nacos配置中心
- 基本使用
- 动态刷新-1 @Value+@RefreshScope
- 如果不需要配置中心
- 动态刷新-2 @ConfigurationProperties
- 动态刷新-3 NacosConfigManager
- 面试题:Nacos中的数据集 和 application.properties 有相同的 配置项,哪个生效?
nacos配置中心
基本使用
动态刷新-1 @Value+@RefreshScope
- 使用步骤
- @Value(“${xx}”) 获取配置 + @RefreshScope 实现自动刷新
- @ConfigurationProperties 无感自动刷新
- NacosConfigManager 监听配置变化
在nacos配置管理创建配置
其中Data ID为数据集id,写法为名称+后缀名。
这里填写为qf-service-order.properties
配置内容为
order.timeout=30min
order.auto-confirm=7d
填写完毕后点击发布
order项目加入依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
配置文件
server:port: 8080servlet:context-path: /
spring:application:name: qf-service-order# 配置nacos地址(告诉当前应用nacos在哪里)cloud:nacos:server-addr: 127.0.0.1:8848config:import: nacos:qf-service-order.properties
控制类
import com.qf.entity.Order;
import com.qf.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RefreshScope//自动刷新
@RestController
public class OrderController {@Value("${order.timeout}")String orderTimeout;@Value("${order.auto-confirm}")String orderAutoConfirm;@GetMapping("/config")public String config(){return "order.timeout="+orderTimeout+"; " + "order.auto-confirm="+orderAutoConfirm +";";}
}
访问接口http://127.0.0.1:8080/config
在nacos配置管理中修改值
此时在刷新接口,发现值发生改变。实现动态刷新
可以看到nacos加载了我们在配置列表中配置的数据集。
并且在最后可以看到已经在监听该dataId了
如果不需要配置中心
注意:此时因为在父模块中引用了nacos配置中心,所以如果有服务没有在配置文件中配置nacos中spring.config.import,在启动时会发生报错:
***************************
APPLICATION FAILED TO START
***************************Description:No spring.config.import property has been definedAction:Add a spring.config.import=nacos: property to your configuration.If configuration is not required add spring.config.import=optional:nacos: instead.To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.
此时配置spring.cloud.nacos.config.import-check.enabled=false即可关闭配置中心相关配置检查
动态刷新-2 @ConfigurationProperties
import lombok.Data;
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;
}
@Autowired
OrderProperties orderProperties;@GetMapping("/config")
public String config(){return "order.timeout="+orderProperties.getTimeout()+"; " +"order.auto-confirm="+orderProperties.getAutoConfirm() +";";
}
启动项目修改nacos配置管理即可完成动态刷新
动态刷新-3 NacosConfigManager
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.context.annotation.Bean;import java.util.concurrent.Executor;
import java.util.concurrent.Executors;@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}//1、项目启动就监听配置文件变化//2、发生变化后拿到变化值//3、发送邮件/*** 创建并配置ApplicationRunner bean* 该bean在应用启动后执行,用于监听Nacos配置变化** @param nacosConfigManager Nacos配置管理器,用于获取ConfigService,项目启动时自动拿到容器中的NacosConfigManager* @return ApplicationRunner 实例,用于执行应用启动后的操作*/@BeanApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){return args -> {// 获取ConfigService实例,用于操作Nacos配置ConfigService configService = nacosConfigManager.getConfigService();// 为"qf-service-order.properties"配置文件添加监听器//这里监听的文件写任何配置文件都可以,不是只能监听qf-service-order.properties// 当配置发生变化时,触发通知configService.addListener("qf-service-order.properties","DEFAULT_GROUP", new Listener() {// 返回一个固定大小的线程池,用于异步处理配置变化@Overridepublic Executor getExecutor() {return Executors.newFixedThreadPool(4);}// 接收配置信息变化并处理@Overridepublic void receiveConfigInfo(String configInfo) {// 打印变化的配置信息System.out.println("变化的配置信息:"+configInfo);// 模拟配置变化后的操作,如发送邮件通知System.out.println("邮件通知...");}});// 标志应用启动完成,监听器已注册System.out.println("=========");};}
}
启动项目修改nacos配置管理即可完成动态刷新监听
面试题:Nacos中的数据集 和 application.properties 有相同的 配置项,哪个生效?
答案:Nacos中数据集会覆盖application.properties中的配置项
添加相同的属性
server:port: 8080servlet:context-path: /
spring:application:name: qf-service-order# 配置nacos地址(告诉当前应用nacos在哪里)cloud:nacos:server-addr: 127.0.0.1:8848config:import: nacos:qf-service-order.properties
order:timeout: 50auto-confirm: 50
启动项目后可以发现使用的为nacos中配置的值
在spring.config.import中的配置文件中出现相同的属性
server:port: 8080servlet:context-path: /
spring:application:name: qf-service-order# 配置nacos地址(告诉当前应用nacos在哪里)cloud:nacos:server-addr: 127.0.0.1:8848config:# 当多个配置文件中配置属性相同时,配置文件的加载顺序决定了哪个配置会覆盖另一个。通常情况下,后加载的配置会覆盖先加载的配置。# 如这里两者有相同的属性键,common.properties 中的值会覆盖 qf-service-order.properties 中的值。import: nacos:qf-service-order.properties,nacos:common.properties
order:timeout: 50auto-confirm: 50
当多个配置文件中配置属性相同时,配置文件的加载顺序决定了哪个配置会覆盖另一个。通常情况下,后加载的配置会覆盖先加载的配置。
如这里两者有相同的属性键,common.properties 中的值会覆盖 qf-service-order.properties 中的值。