java客户端
配置类
@Value无法在注册bean的时候获取配置文件中的值
@Configuration
public class ApolloConfig implements BeanDefinitionRegistryPostProcessor, EnvironmentAware {
private static final String SEPARATOR = ",";
private static final String NAMESPACE_APPLICATION = "application";
private Environment env;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 是否启用apollo,默认不启用
String property = env.getProperty("apollo.customize.enable");
Boolean enable = Boolean.valueOf(property);
if (!enable) {
return;
}
// namespace
String namaspace = env.getProperty("apollo.customize.namespaces");
String[] namespaces = StringUtils.isNotEmpty(namaspace) ? namaspace.split(SEPARATOR) : new String[]{NAMESPACE_APPLICATION};
// order
String orderConfig = env.getProperty("apollo.customize.order");
int order = StringUtils.isNotEmpty(orderConfig) ? Integer.parseInt(orderConfig) : Integer.MAX_VALUE;
PropertySourcesProcessor.addNamespaces(Lists.newArrayList(namespaces), order);
Map<String, Object> propertySourcesPlaceholderPropertyValues = new HashMap<>(16);
// to make sure the default PropertySourcesPlaceholderConfigurer's priority is higher than PropertyPlaceholderConfigurer
propertySourcesPlaceholderPropertyValues.put("order", 0);
BeanRegistrationUtil.registerBeanDefinitionIfNotExists(registry, PropertySourcesPlaceholderConfigurer.class.getName(),
PropertySourcesPlaceholderConfigurer.class, propertySourcesPlaceholderPropertyValues);
BeanRegistrationUtil.registerBeanDefinitionIfNotExists(registry, PropertySourcesProcessor.class.getName(),
PropertySourcesProcessor.class);
BeanRegistrationUtil.registerBeanDefinitionIfNotExists(registry, ApolloAnnotationProcessor.class.getName(),
ApolloAnnotationProcessor.class);
BeanRegistrationUtil.registerBeanDefinitionIfNotExists(registry, SpringValueProcessor.class.getName(),
SpringValueProcessor.class);
BeanRegistrationUtil.registerBeanDefinitionIfNotExists(registry, SpringValueDefinitionProcessor.class.getName(),
SpringValueDefinitionProcessor.class);
BeanRegistrationUtil.registerBeanDefinitionIfNotExists(registry, ApolloJsonValueProcessor.class.getName(),
ApolloJsonValueProcessor.class);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
}
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
}
配置文件
以下是自定义配置
# 是否启用apollo
apollo.customize.enable
# namespace,用','隔开
apollo.customize.namespaces
# order
apollo.customize.order
服务端
app.id
在不影响原来功能的情况下,不配置app.id时,可以取spring.application.name作为app.id
// com.ctrip.framework.foundation.internals.provider.DefaultApplicationProvider
// initAppId方法,添加如下代码
// 4. Try to get app id from spring.application.name.
m_appId = m_appProperties.getProperty("spring.application.name");
if (!Utils.isBlank(m_appId)) {
m_appId = m_appId.trim();
logger.info("App ID is set to {} by spring.application.name property from {}", m_appId, APP_PROPERTIES_CLASSPATH);
return;
}
数据库
Apollo官方仅支持MySQL,若想支持postgresql,可参考xiao0yy在Apollo 0.10.2基础上开发的Pg适配代码