k8s环境下舍弃了配置中心的功能,所有原本放在配置中心中的内容在应用中都会从被配置在应用所在的系统环境中,具体在代码中就是environment中名为systemEnvironment的PropertySource。
springboot会在Integer.MIN_VALUE + 4(MINVALUE+5之后才是规划给应用的order号)的时候从环境中获取名为systemEnvironment的PropertySource并将其所有内容重新生成为特定的不支持修改的PropertySource类型。所以我们的密文解密就会放在前面一步的时候处理。
@Order(Integer.MIN_VALUE + 3)
public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map originSource = environment.getPropertySources().get(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME);
Map newSource = new HashMap<>(128);
newSource.putAll(originSource );
for (String key : newSource.keySet() ) {
//解密并替换内容
newSource.put( key, "解密后内容");
}
//这里随便声明一个满足需求的PropertySource就可以,因为稍后springboot会重新把名为systemEnvironment的PropertySource生成
MapPropertySource newPropertySource = new MapPropertySource(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, newSource);
environment.getPropertySources().replace(StandardEnvironment.SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, newPropertySource );
}
}