Eureka 學習筆記(六)Eureka初始化環境

一、前言

    無論是原生Eureka還是SpringCloud中對Eureka的整合,邏輯是一樣的,只是在SpringCloud中將很多組件的創建移到AutoConfiguration中去了,如果有設計到的地方,筆者在以後的學習筆記中會提到。

二、contextInitialized方法

    承接我們發現的contextInitialized方法,我們來看看其內部做了什麼。大致可以發現,它是從ConfigurationManager獲取到了一個ConfigInstance的配置類,然後從中拿到dataCenter和environment,再判斷他們否爲空,分別在做一些配置的設置。

protected void initEurekaEnvironment() throws Exception {
    logger.info("Setting the eureka configuration..");

    String dataCenter = ConfigurationManager.getConfigInstance().getString(EUREKA_DATACENTER);
    if (dataCenter == null) {
        logger.info("Eureka data center value eureka.datacenter is not set, defaulting to default");
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, DEFAULT);
    } else {
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, dataCenter);
    }
    String environment = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT);
    if (environment == null) {
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, TEST);
        logger.info("Eureka environment value eureka.environment is not set, defaulting to test");
    }
}

三、創建AbstractConfiguration

    從代碼中可以看到,initEurekaEnvironment方法第一步是通過ConfigurationManager獲取到了一個AbstractConfiguration實例,並且獲取到了一個數據中心的名字(猜測)。我們點進去看看~


public static final String DISABLE_DEFAULT_CONFIG = "archaius.dynamicProperty.disableDefaultConfig";

public static AbstractConfiguration getConfigInstance() {
    if (instance == null) {
        synchronized (ConfigurationManager.class) {
            if (instance == null) {
                instance = getConfigInstance(Boolean.getBoolean(DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG));
            }
        }
    }
    return instance;
}

    這裏可以看到Eureka使用了double check的方式創建了一個AbstractConfiguration,並且從配置文件中獲取了是否禁用默認的配置。我們繼續點進getConfigInstance(Boolean.getBoolean(DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG));

private static AbstractConfiguration getConfigInstance(boolean defaultConfigDisabled) {
    if (instance == null && !defaultConfigDisabled) {
        instance = createDefaultConfigInstance();
        registerConfigBean();
    }
    return instance;        
}

    可以看到這裏判斷了一下,如果Config的實例爲空,並且沒有禁用默認配置,就會創建一個實例,否則返回一個空的實例。在條件成立的情況下,會先創建一個實例,在註冊這個實例。那我們先看一下createDefaultConfigInstance()方法。

private static AbstractConfiguration createDefaultConfigInstance() {
    ConcurrentCompositeConfiguration config = new ConcurrentCompositeConfiguration();  
    try {
        DynamicURLConfiguration defaultURLConfig = new DynamicURLConfiguration();
        config.addConfiguration(defaultURLConfig, URL_CONFIG_NAME);
    } catch (Throwable e) {
        logger.warn("Failed to create default dynamic configuration", e);
    }
    if (!Boolean.getBoolean(DISABLE_DEFAULT_SYS_CONFIG)) {
        SystemConfiguration sysConfig = new SystemConfiguration();
        config.addConfiguration(sysConfig, SYS_CONFIG_NAME);
    }
    if (!Boolean.getBoolean(DISABLE_DEFAULT_ENV_CONFIG)) {
        EnvironmentConfiguration envConfig = new EnvironmentConfiguration();
        config.addConfiguration(envConfig, ENV_CONFIG_NAME);
    }
    ConcurrentCompositeConfiguration appOverrideConfig = new ConcurrentCompositeConfiguration();
    config.addConfiguration(appOverrideConfig, APPLICATION_PROPERTIES);
    config.setContainerConfigurationIndex(config.getIndexOfConfiguration(appOverrideConfig));
    return config;
}

    這裏可以看到,它創建了一堆的配置類,具體是什麼,這裏就沒有過多關注了,筆者想想無非就是讀取一堆配置文件,然後封裝一下吧~那我們回退到上一個步驟,看一下registerConfigBean()方法幹了什麼。

public static final String ENABLE_JMX = "archaius.dynamicPropertyFactory.registerConfigWithJMX";

private static void registerConfigBean() {
    if (Boolean.getBoolean(DynamicPropertyFactory.ENABLE_JMX)) {
        try {
            configMBean = ConfigJMXManager.registerConfigMbean(instance);
        } catch (Exception e) {
            logger.error("Unable to register with JMX", e);
        }
    }        
}

    這裏可以看到,它就是先判斷一下有沒有配置要把bean註冊到java原生的jmx裏面,如果配置了就註冊進去,這裏我們就不關注了,不是主要的~那麼到這裏整個環節初始化就完成了^_^

protected void initEurekaEnvironment() throws Exception {
        logger.info("Setting the eureka configuration..");

    String dataCenter = ConfigurationManager.getConfigInstance().getString(EUREKA_DATACENTER);
    if (dataCenter == null) {
        logger.info("Eureka data center value eureka.datacenter is not set, defaulting to default");
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, DEFAULT);
    } else {
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_DATACENTER, dataCenter);
    }
    String environment = ConfigurationManager.getConfigInstance().getString(EUREKA_ENVIRONMENT);
    if (environment == null) {
        ConfigurationManager.getConfigInstance().setProperty(ARCHAIUS_DEPLOYMENT_ENVIRONMENT, TEST);
        logger.info("Eureka environment value eureka.environment is not set, defaulting to test");
    }
}

四、總結

    其實初始化環節還是挺簡單的,裏面有些非主流程的細節就沒有看了。這裏來個到目前爲止的流程圖吧: 在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章