目录
方式一: 用 @value 读取配置时,搭配 @RefreshScope
方式二: 直接用 @ConfigurationProperties 读取配置
Nacos配置管理
spring的配置文件优先级:bootstrap > application , properties > yml。需要注意的是相同的配置项会被覆盖。
项目里的配置文件根据环境分为:local、dev、test、prod。
# 设置配置文件的运行环境 spring.profiles.active=dev
需要注意的是:通用的基础配置写在application.yml。例如:
差异化的配置写在对应的环境配置文件里:
nacos配置中心
1.全局统一管理配置项
实际的业务开发中,多处使用到的变量会以配置项的形式进行全局统一管理。
借口需要读取user的name和age,通过注解@Value获取配置文件中的值,但是配置文件并没有匹配,会报错:
在对应配置文件中添加上就ok了
2.加载配置源
在上面的场景中,如果变更了user的name或者age,我们需要更新配置文件,重新编译打包发布。这样效率比较低,而nacos作为配置中心是支持热更新的。运行项目时,可以发现有加载一个默认配置项的日志:
Located property source: [BootstrapPropertySource {name='bootstrapProperties-mall-product-dev.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-mall-product.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-mall-product,DEFAULT_GROUP'}]
3.拆解nacos配置中心
nacoas配置原理
一般地,我们使用获取配置的流程如下:
而nacos的配置需要优先本地获取,这里就使用了bootstrap优先级高于application的操作
所以,项目中优先级较高的配置都会写在bootstrap配置文件中,这就是日志中的BootstrapPropertySource。
一般地,我们会配置nacos的相关信息在bootstrap配置文件里。
nacos配置文件优先级
上面的Located property source日志里枚举了三个配置文件,本地运行项目指定了dev环境。验证发现:
-
nacos没有任何配置文件:
配置项读取本地,优先级bootstrap>application,properties>yml,但是相同属性存在先加载的被后加载覆盖的现象
-
nacos存在配置文件:
日志中的name对应的是nacos配置中心的dataId.他们的先后顺序就是优先级。
mall-product-dev.properties > mall-product.properties > mall-product(需要注意的是没有后缀的配置文件类型如果是yml,那么是读取不到配置项的,所以养成良好的习惯:配置文件加上文件类型后缀)
nacos配置热更新
热更新最终的目的,是修改 nacos 中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新。
有两种方式:
方式一: 用 @value
读取配置时,搭配 @RefreshScope
在 @Value
注入的变量所在类上添加注解 @RefreshScope
方式二: 直接用 @ConfigurationProperties
读取配置
可以新建一个类专门用来完成配置加载
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateFormat;
}
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties patternProperties;
// @Value("${pattern.dateformat}") //Value注解 可以读取配置
// private String dateformat;
@GetMapping("now")
public String now(){
return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateFormat()));
}