背景

当我们使用 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

项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

最新文章

  1. URL中的保留和不安全字符
  2. Maven安装本地jar
  3. 使用网站processon在线作图
  4. text/html与text/plain有什么区别?
  5. Shortcut key for CodeBlocks
  6. WebForm上传文件FileUpload
  7. mismatch位置(MD tag)- sam/bam格式解读进阶
  8. 使用ecshop电子商务系统的100个小问题
  9. Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得
  10. C++类中的静态成员变量与静态成员函数
  11. jquery判断图片是否加载完毕
  12. java中的“\t”
  13. 理解JavaScript中的call和apply方法
  14. 应用wavesurfer.js绘制音频波形图小白极速上手总结
  15. HttpReponse
  16. mysql-5.7.20
  17. angular如何引入公共JS
  18. Coding语言强弱类型且动静态类型简单解析。附图解
  19. oo作业总结(四)
  20. C#操作数据表中XML格式的数据

热门文章

  1. 谁能成为数据储存领域领头羊?永久数据存储--NGK的终极使命!
  2. 教你玩转CSS Position(定位)
  3. 链表、栈、队列、KMP相关知识点
  4. 为什么我们在定义HashMap的时候,就指定它的初始化大小呢
  5. 答不上的JUC笔试题
  6. Linux关机指令详解
  7. Linux fork()一个进程内核态的变化
  8. vue关于导航守卫的几种应用场景
  9. vue3与vue2的区别
  10. 区分函数防抖&amp;函数节流