微服务应用和普通WEB应用配置文件区分处理的一种方式

    由于微服务的逐步应用,目前可能会存在微服务版和普通WEB版的2种应用形式同时存在,微服务配置一般用yml格式文件,普通WEB服务一般用XML 和properties 格式文件。那么如何在代码中切换或兼容这2种不同的参数配置方式呢?

      这里给出一个处理办法。基本思路:

1、微服务的配置文件使用配置对象,因为在微服务中可使用@ConfigurationProperties注解功能直接将yml配置文件中的信息转换为配置对象,非常方便。同时,在配置类(添加@Configuration注解)中对配置信息进行读取,例如:

    @Bean
    @ConfigurationProperties(prefix = "properties.prefix")
    ClientConfigInfo clientConfigInfo(){
        ClientConfigInfo clientConfigInfo = new ClientConfigInfo();        
        return clientConfigInfo;
    }

2、普通WEB应用的属性文件一般会封装为一个全局性的属性对象如Platform,这种做法一般直接是直接在代码中使用Platform.getPropertie("key")静态方法来获取参数信息。

public static void init()  throws AAConfigException {
    
        //--------------------------------------------------
        appId = Platform.getProperty("APP_ID");
        log.info("appId:" + appId);

        if (appId == null) {
            throw new UdsConfigException("item \"APP_ID\" is null.");
        }        
        
        String sConnectTimeout =  Platform.getProperty("AA_CONNECT_TIMEOUT");
        log.info("ConnectTimeout:" + sConnectTimeout);
        
        if(sConnectTimeout == null || "".equals(sConnectTimeout)){
            sConnectTimeout = "30";
        }

       //...

}

3、自动切换。在使用配置信息进行初始化时(假设初始化类叫XXX,具有init()和init(ClientConfigInfo)2种初始化化方法),代码中使用配置信息对象(见下面的示例),进行判断。在代码中声明clientConfigInfo自动织入,如果使用微服务模式,则clientConfigInfo对象会被初始化,故调用init(clientConfigInfo)方法;如果使用普通WEB模式,则clientConfigInfo对象没有被实例化,所以clientConfigInfo为空,故调用init()方法。

    这里@Autowired参数require=false是关键,若不加上它,普通WEB模式下时会找不到ClientConfigInfo的实例而启动失败。  

        @Autowired(required=false)

        ClientConfigInfo clientConfigInfo;

 

        if(clientConfigInfo == null){
           XXX.init();
        } else {
           XXX.init(clientConfigInfo);
        }   

 

 

posted @ 2018-07-31 14:56  hongweigg  阅读(4)  评论(0编辑  收藏  举报