上篇文章中,我們對於EurekaServer的啓動過程做了簡單的講解,接下來,我們將會進入更加細節的代碼分析階段。
1.EurekaBootStrap 之環境初始化
上文中,我們已經知道了初始化會運行如下方法。
public void contextInitialized(ServletContextEvent event) {
try {
initEurekaEnvironment();
initEurekaServerContext();
......
} catch (Throwable e) {
......
}
}
我們重點看一下contextInitialized()
,該方法的源碼如下:
protected void initEurekaEnvironment() throws Exception {
.....
String dataCenter = ConfigurationManager.getConfigInstance().getString(EUREKA_DATACENTER);
......
}
2.ConfigurationManager的單例模式
重點分析一下ConfigurationManager.getConfigInstance()
,源碼如下:
public static AbstractConfiguration getConfigInstance() {
if (instance == null) {
synchronized (ConfigurationManager.class) {
if (instance == null) {
instance = getConfigInstance(Boolean.getBoolean(DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG));
}
}
}
return instance;
}
我們注意到,這裏是一個單例模式
實現的配置管理器,說一下槽點:代碼的實現沒問題,優點是:考慮到了多線程的場景,代碼有DoubleCheck。缺點是:代碼實現嵌套略深,如果我來實現,我的作法可能會是下面的方式
,改動後的實現方式:
public static AbstractConfiguration getConfigInstance() {
if (instance != null ) {
return instance;
}
synchronized (ConfigurationManager.class) {
if (instance != null) {
return instance;
}
instance = getConfigInstance(Boolean.getBoolean(DynamicPropertyFactory.DISABLE_DEFAULT_CONFIG));
}
return instance;
}
3.總結
- 重點分析了
initEurekaEnvironment()
- 學到了
ConfigurationManager
單例方式實現的優缺點
- 優點:Double Check
- 缺點:代碼實現嵌套略深
- 重構了
ConfigurationManager
單例實現的方式