SpringCloud.Eureka.源碼分析.002.EurekaServer-之初始化Eureka環境源代碼分析

上篇文章中,我們對於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單例實現的方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章