背景
当我们使用 spring boot 在多环境打包,配置属性在不同环境的值不同,如下:
spring:
profiles:
active: @project.profile@ #根据 maven 动态配置 profile
---
spring:
profiles: dev
demo: lengleng_dev
---
spring:
profiles: prd
demo: lengleng_prd
或者使用 spring cloud 配置中心(nacos/config)等
再有就是 应用配置的同一个属性,值的来源可能来自 配置文件、环境变量、启动参数 等等。很多情况由于 如上配置的复杂性,应用在读取配置的时候,并不是我们预期的值,比如我们想使用是配置文件 dev 环境的值,却被环境变量的 或者其他的数据覆盖等,这些往往只有等我们运行时,输出日志才能发现错误原因。
解决方案
spring boot 2.3 Actuator 提供 /actuator/configprops
端点(之前版本也有此端点,但是行为发生变化了 /actuator/env
保持一致),提供对配置文件属性跟踪功能,方便我们在 spring boot 应用中,实时的获取配置文件实际加载值。
如何使用
- 引入 actuator 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 暴露
configprops
端点
management:
endpoints:
web:
exposure:
include: 'configprops'
- 对应配置类
@Data
@Component
@ConfigurationProperties("demo")
public class DemoConfig {
private String username;
private String password;
}
- 访问 Endpoint 实时获取配置文件的值
特殊说明
- configprops Endpoint 会对敏感字段默认脱敏,默认关键字类
public class Sanitizer {private static final String[] REGEX_PARTS = {"*", "$", "^", "+"};
private static final Set<String> DEFAULT_KEYS_TO_SANITIZE = new LinkedHashSet<>(Arrays.asList("password", "secret",
"key", "token", ".*credentials.*", "vcap_services", "sun.java.command"));
}
- 配置个性化脱敏规则
management:
endpoint:
configprops:
keys-to-sanitize:
- 'aaa'
- 'bbb'
- 当配置类的某个属性值为空时,通过 /actuator/configprops 访问,不会展示此属性。
总结
- configprops 端点对应 ConfigurationPropertiesReportEndpoint 类,通过阅读 可以了解从
PropertySource
获取配置的技巧 - 应用场景:CI 在执行单元测试的前置应该通过此端点判断配置是否和预期一致,避免无用执行条件
- 以上源码可以参考:https://github.com/lltx/spring-boot-course