上篇文章中,我们对于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
单例实现的方式