一、前言
無論是原生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");
}
}
四、總結
其實初始化環節還是挺簡單的,裏面有些非主流程的細節就沒有看了。這裏來個到目前爲止的流程圖吧: