Apollo改造-启动配置化

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适配代码

发布了37 篇原创文章 · 获赞 1 · 访问量 1067

猜你喜欢

转载自blog.csdn.net/zhuchencn/article/details/102533861