• SpringFramework 应用接入 Apollo 配置中心


    环境:

    SpringFramework:4.3.5.RELEASE

    apollo-client:1.5.1

    1.在项目的 resources/META-INF/ 目录下添加 app.properties 文件:

    #Apollo配置id
    app.id = phpdragon-demo
    apollo.bootstrap.enabled = true
    apollo.eagerLoad.enabled = true
    apollo.cacheDir = /data/app_data/apollo_cache/

    2. 新建 ApolloConfigurer 类,负责处理合并本地properties配置:

    import com.alibaba.dubbo.common.utils.ConfigUtils;
    import com.ctrip.framework.apollo.Config;
    import com.ctrip.framework.apollo.ConfigService;
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
    
    import java.util.Properties;
    import java.util.Set;
    
    /**
     * 处理apollo配置
     */
    public class ApolloConfigurer extends PropertyPlaceholderConfigurer {
    
        static final String[] NAMESPACES = {"PUBLIC", "REDIS", "ZOOKEEPER", "application"};
        
        @Override
        protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
            try {
                this.reloadProperties(props);
            } catch (Exception e) {
                e.printStackTrace();
                logger.info("获取apollo配置失败");
            }
    
            //设置到dubbo的上下里
            ConfigUtils.addProperties(props);
    
            super.processProperties(beanFactoryToProcess, props);
        }
    
        private void reloadProperties(Properties props) {
            for (String namespace : NAMESPACES) {
                Config config = ConfigService.getConfig(namespace);
                Set<String> fieldNames = config.getPropertyNames();
                for (String attributeName : fieldNames) {
                    props.put(attributeName, config.getProperty(attributeName, ""));
                    //设置到系统变量里
                    System.setProperty(attributeName, config.getProperty(attributeName, ""));
                }
            }
        }
    
        @Override
        protected String resolvePlaceholder(String placeholder, Properties props) {
            this.reloadProperties(props);
            return props.getProperty(placeholder);
        }
    }

    3.在 Spring 的配置xml文件中声明配置:

    <bean class="com.phpdragon.config.ApolloConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
        <property name="ignoreResourceNotFound" value="true"/>
        <property name="trimValues" value="true"/>
        <property name="locations">
            <list>
                <value>classpath*:*.properties</value>
                <value>classpath*:properties/*.properties</value>
            </list>
        </property>
        <property name="fileEncoding" value="UTF-8"/>
    </bean>

    4.编写配置类接收远程配置变量:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    import redis.clients.jedis.JedisPoolConfig;
    
    import lombok.Data;
    
    /**
     *
     */
    @Data
    @Configuration
    //@EnableApolloConfig不能使用该注解,否则会导致无效,该注解由 ApolloConfigurer 接管类似功能
    public class RedisConfig {
    
        @Value("${sys.redis.host}")
        private String hostName;
    
        @Value("${sys.redis.port}")
        private int port;
    
        @Value("${redis.password}")
        private String password;
    
        @Value("${redis.timeout}")
        private int timeout;
    
        @Value("${redis.pool.maxTotal}")
        private int maxTotal;
    
        @Value("${redis.pool.minIdle}")
        private int minIdle;
    
        @Value("${redis.pool.maxIdle}")
        private int maxIdle;
    
        @Value("${redis.pool.maxWaitMillis}")
        private long maxWaitMillis;
    
        @Value("${redis.pool.testOnBorrow}")
        private boolean testOnBorrow;
    
        @Value("${redis.pool.testOnReturn}")
        private boolean testOnReturn;
    
    }
  • 相关阅读:
    Mysql5.7中子查询时order by与group by合用无效的解决办法
    vue $ref的基本用法
    vue渲染列表时报错Avoid using nonprimitive value as key, use string/number value instead.
    uniapp的微信小程序错误警告(uview项目)Some selectors are not allowed in component wxss, including tag name selectors, ID selectors, and attribute selectors。
    如何在 Linux 中找出最近或今天被修改的文件
    微信小程序uniapp编译后vendor.js文件过大
    随笔目录
    cesium加载百度地图_四大Webgis地图框架的对比选择[转]
    Python import Statement
    WordPress中安装插件需要ftp怎么办?
  • 原文地址:https://www.cnblogs.com/phpdragon/p/12562429.html
Copyright © 2020-2023  润新知