apolloconfig / apollo

Apollo is a reliable configuration management system suitable for microservice configuration management scenarios.
https://www.apolloconfig.com
Apache License 2.0
29.13k stars 10.2k forks source link

多环境统一问题 #921

Closed chenghaochen1993 closed 6 years ago

chenghaochen1993 commented 6 years ago

当前apollo是一个环境要部署一套ConfigService Ad'minService。

chenghaochen1993 commented 6 years ago

能否把多个环境揉成一个,运行时指明环境,动态数据源返回数据,这样改动会很大吗?

nobodyiam commented 6 years ago

运行时指明环境是啥意思?一套服务根据环境参数切换数据库?

一个环境部署一套的初衷是为了隔离,以免测试环境不稳定导致生产环境故障

chenghaochen1993 commented 6 years ago

我这边没啥运维,如果部署三四套环境比较麻烦,我们组长要我在ConfigService 和AdminService 初始化多个数据源,Client请求配置的时候多加个环境参数,然后服务端,根据请求的参数返回对应的数据源的数据。服务端的代码我还没怎么看,不知道这样改动会不会需要改动很大。还有Client端的监听现在已经被我改成默认关闭监听,需手动启动。

nobodyiam commented 6 years ago

改动还是很大的,基本上config service和admin service都需要改动的。

或者另一个方案就是通过集群来区分环境,我们实际使用的时候测试环境FAT下面就会挂着default(测试环境), dev(开发环境),lpt(性能测试环境)

chenghaochen1993 commented 6 years ago

我在apollo-biz加了DB,DBConfig这两个类,但是在DBConfig里面就是注入不了这个DataSource,我自己写的demo在1.5.9版本的springboot是可以注入,我把demo换成apollo的1.3.8版本的springboot也不能注入了,不知道这里面有什么坑。 `@Configuration public class DB {

@Bean(name = "DEV") @Qualifier("DEV")
@Primary
@ConfigurationProperties(prefix="spring.dev")
public DataSource dataSourceDev(){
    return  DataSourceBuilder.create().build();
}

@Bean(name = "TEST")  @Qualifier("TEST")
@ConfigurationProperties(prefix="spring.test")
public DataSource dataSourceTest(){
    return DataSourceBuilder.create().build();
}

@Bean(name = "PRO") @Qualifier("PRO")
@ConfigurationProperties(prefix="spring.pro")
public DataSource dataSourcePro(){
    return DataSourceBuilder.create().build();
}

}`

` @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = {"com.ctrip.framework.apollo.biz.repository" }) public class DBConfig{

@Autowired
private JpaProperties jpaProperties;
@Autowired
private DB db;

@Autowired
@Qualifier("DEV")
private DataSource dev;
@Autowired
@Qualifier("TEST")
private DataSource test;
@Autowired
@Qualifier("PRO")
private DataSource pro;

private Map<String, String> getVendorProperties() {
    return jpaProperties.getHibernateProperties(dev);
}

@Bean(name="dynamicDataSource")
public DataSource dynamicDataSource() {
    DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();

    // 将 dev 数据源作为默认指定的数据源
    dynamicRoutingDataSource.setDefaultTargetDataSource(dev);
    Map<Object,Object> dataSourceMap = new HashMap<>(3);
    dataSourceMap.put(DBMenu.DEV.getKey(),dev);
    //dataSourceMap.put(DBMenu.TEST.getKey(),test);
    //dataSourceMap.put(DBMenu.PRO.getKey(),pro);
    dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
    return dynamicRoutingDataSource;
}

@Primary
@Bean(name = "entityManagerFactoryPrimary")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(dynamicDataSource())
            .packages("com.ctrip.framework.apollo.biz.entity")
            .persistenceUnit("primaryPersistenceUnit")
            .properties(getVendorProperties())
            .build();
}
@Primary
@Bean(name = "entityManagerPrimary")
public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
    return entityManagerFactoryPrimary(builder).getObject().createEntityManager();
}
@Primary
@Bean(name = "transactionManagerPrimary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
    return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());
}

}`

nobodyiam commented 6 years ago

case先关闭了,如还有问题,可以提供更多信息,或进群交流。