需求:
将nacos配置也默认掉,0配置,因为基本上公司只会有固定的配置中心或者按环境有几套固定的,无需每个应用额外关心Nacos的配置,所以需要将Nacos的配置也默认掉,0配置
背景:
在使用Nacos时,需要在bootstrap中配置nacos的配置,这个bootstrap会在容器最先起动后将配置加载到环境变量中,是优先于application.yml,这样目的是在将配置全部放配置中心,集中化配置,但Nacos的启动配置还是需要配置的,配置如下
spring:
application:
name: user-test
cloud:
nacos:
config:
serverAddr: 127.0.0.1:8848
enabled: true # default true
# username: s
# password: s
# group: #defaults to DEFAULT_GROUP
file-extension: yml #${application.name}-${spring.profiles.active}.${file-extension}
discovery:
server-addr: 127.0.0.1:8848
解决方案:
思路:Nacos在启动时会加载环境变中spring.cloud.nacos前缀的配置,那么我们可以在应用启动时用代码将nacos的相关配置注入
具体做法:
1. 实现自定义的 EnvironmentPostProcessor,在启动时将环境变量注入
public class WafNacosEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
private static final String CONFIG_PREFIX = "spring.cloud.nacos.config.";
private static final String DISCOVERY_PREFIX = "spring.cloud.nacos.discovery.";
private static final String KEY_CONFIG_SERVERADDR = CONFIG_PREFIX + "serverAddr";
private static final String KEY_CONFIG_USERNAME = CONFIG_PREFIX + "username";
private static final String KEY_CONFIG_PASSWORD = CONFIG_PREFIX + "password";
private static final String KEY_CONFIG_GROUP = CONFIG_PREFIX + "group";
private static final String KEY_CONFIG_FILEEXTENSION = CONFIG_PREFIX + "file-extension";
private static final String KEY_DISCOVERY_SERVERADDR = DISCOVERY_PREFIX + "serverAddr";
private static final String KEY_DISCOVERY_USERNAME = DISCOVERY_PREFIX + "username";
private static final String KEY_DISCOVERY_PASSWORD = DISCOVERY_PREFIX + "password";
private static final String KEY_DISCOVERY_NAMESPACE= DISCOVERY_PREFIX + "namespace";
@Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
Map<String, Object> map = new HashMap<>();
Properties envProperties = WafNacosConfig.getNacosConfig(getActiveEnv(environment));
//nacos config
addProperties(environment, map, KEY_CONFIG_SERVERADDR,envProperties.getProperty(SERVER_ADDR));
addProperties(environment, map, KEY_CONFIG_USERNAME,envProperties.getProperty(USERNAME));
addProperties(environment, map, KEY_CONFIG_PASSWORD,envProperties.getProperty(PASSWORD));
addProperties(environment, map, KEY_CONFIG_GROUP,getApplicationName(environment));
addProperties(environment, map, KEY_CONFIG_FILEEXTENSION,"yml");
//nacos discovery
addProperties(environment, map, KEY_DISCOVERY_SERVERADDR,envProperties.getProperty(SERVER_ADDR));
addProperties(environment, map, KEY_DISCOVERY_USERNAME,envProperties.getProperty(USERNAME));
addProperties(environment, map, KEY_DISCOVERY_PASSWORD,envProperties.getProperty(PASSWORD));
addProperties(environment, map, KEY_DISCOVERY_NAMESPACE,getApplicationName(environment));
if(!map.isEmpty()) {
environment.getPropertySources().addLast(new MapPropertySource("NacosBootstrap", map));
}
}
private void addProperties(ConfigurableEnvironment environment, Map<String, Object> map, String key, String value){
if(!environment.containsProperty(key)){
map.put(key, value);
}
}
@Override
public int getOrder() {
return Ordered.LOWEST_PRECEDENCE;
}
}
2. 在spring.factories中增加启动
org.springframework.boot.env.EnvironmentPostProcessor=\
cn.xxx.nacos.WafNacosEnvironmentPostProcessor