微服务集成Apollo配置中心,同时动态刷新数据库

  • 集成Apollo

    • 引入Apollo的jar
    <dependency>
        <groupId>com.ctrip.framework.apollo</groupId>
        <artifactId>apollo-client</artifactId>
        <version>1.4.0</version>
    </dependency>
    
    • 修改启动类
    在项目启动主类上添加 @EnableApolloConfig
    
    • 修改主配置文件
    # 在 application.yml 中,添加以下配置
    app:
      id: aiop-cmdb-job  #在Apollo中的唯一id,可以为项目名或不重复的数字,要与启动起来的apollo服务对应
    apollo:
      meta: http://localhost:8080  # 在 portal==》apollo-env.properties中配置的对应的meta
     
    
  • 配置动态刷新数据库

    • 添加动态配置类
    package aiop.cmdb.job.config;
    
    import com.ctrip.framework.apollo.Config;
    import com.ctrip.framework.apollo.model.ConfigChangeEvent;
    import com.ctrip.framework.apollo.spring.annotation.ApolloConfig;
    import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
    
    import javax.sql.DataSource;
    import java.util.Collections;
    
    /**
     * @author lisongyu
     * @date 2020/01/17
     */
    @Configuration
    @Slf4j
    public class DataSourceConfiguration {
    
    
        private final static String DATASOURCE_TAG = "db";
    
        @Autowired
        ApplicationContext context;
    
    
        @ApolloConfig
        Config config;
    
        @Bean
        public DynamicDataSource dynamicDataSource() {
            DynamicDataSource source = new DynamicDataSource();
            source.setTargetDataSources(Collections.singletonMap(DATASOURCE_TAG, dataSource()));
            return source;
        }
    
        @ApolloConfigChangeListener(interestedKeyPrefixes = {"spring.datasource","spring.rabbitmq","jedis.pool"})
        public void onChange(ConfigChangeEvent changeEvent) {
            changeEvent.changedKeys().forEach(s -> {
                DynamicDataSource source = context.getBean(DynamicDataSource.class);
                source.setTargetDataSources(Collections.singletonMap(DATASOURCE_TAG, dataSource()));
                source.afterPropertiesSet();
                log.info("动态切换数据源为:{}", config.getProperty("spring.datasource.url", ""));
            });
        }
    
        public DataSource dataSource() {
            DataSourceProperties dataSource = new DataSourceProperties();
            dataSource.setUrl(config.getProperty("spring.datasource.url", ""));
            dataSource.setUsername(config.getProperty("spring.datasource.username", ""));
            dataSource.setPassword(config.getProperty("spring.datasource.password", ""));
            return dataSource.initializeDataSourceBuilder().build();
        }
    
        class DynamicDataSource extends AbstractRoutingDataSource {
            @Override
            protected Object determineCurrentLookupKey() {
                return DATASOURCE_TAG;
            }
        }
    }
    
posted @ 2020-01-19 14:15  lisongyu  阅读(2690)  评论(2编辑  收藏  举报