【一起學原始碼-微服務】Nexflix Eureka 原始碼四:EurekaServer啟動之完成上下文構建及EurekaServer總結

一枝花算不算浪漫發表於2020-04-02

申明

本文章首發自本人公眾號:壹枝花算不算浪漫,如若轉載請標明來源!

感興趣的小夥伴可關注個人公眾號:壹枝花算不算浪漫

22.jpg

前言

上篇文章已經介紹了 Eureka Server上下文建立相關的Eureka Client邏輯,這一部分還是比較複雜的。接下來就講解下Eureka Server上下文初始化最後的部分,然後加上整個Eureka Server啟動的總結。

如若轉載 請標明來源:一枝花算不算浪漫

initEurekaServerContext

EurekaBootStrap.initEurekaServerContext

protected void initEurekaServerContext() throws Exception {
	// 省略之前內容

    // 3、處理註冊相關的事情  下面是拆解單詞加深理解:
	// PeerAware:可以識別eureka server叢集的。多個同樣的東西組成一個叢集,peers:叢集,peer就是叢集中的一個例項
	// InstanceRegistry:例項註冊,服務例項註冊。登錄檔,這個裡面放了所有的主車道這個eureka server上的服務例項,就是一個服務例項的登錄檔。
	// PeerAwareInstanceRegistry:可以感知eureka server叢集的服務例項登錄檔,eureka client(作為服務例項)過來註冊的登錄檔,而且這個登錄檔是可以感知到eureka
	// server叢集的,假如有一個eureka server叢集的話,這裡包含了其他eureka server中的服務例項登錄檔資訊的。
    PeerAwareInstanceRegistry registry;
    if (isAws(applicationInfoManager.getInfo())) {
        registry = new AwsInstanceRegistry(
                eurekaServerConfig,
                eurekaClient.getEurekaClientConfig(),
                serverCodecs,
                eurekaClient
        );
        awsBinder = new AwsBinderDelegate(eurekaServerConfig, eurekaClient.getEurekaClientConfig(), registry, applicationInfoManager);
        awsBinder.start();
    } else {
    	// 建立PeerAwareInstanceRegistry。最近取消的例項,最近註冊的例項都會儲存到registry中
        registry = new PeerAwareInstanceRegistryImpl(
                eurekaServerConfig,
                eurekaClient.getEurekaClientConfig(),
                serverCodecs,
                eurekaClient
        );
    }

    // 4、處理peer節點相關的事情
	// peerEurekaNodes 代表了eureka server叢集,peers大概來說是多個相同的例項組成的一個叢集,peer就是peers中的一個例項
	// PeerEurekaNodes,代表的是eureka server叢集
    PeerEurekaNodes peerEurekaNodes = getPeerEurekaNodes(
            registry,
            eurekaServerConfig,
            eurekaClient.getEurekaClientConfig(),
            serverCodecs,
            applicationInfoManager
    );

    // 5、完成eureka-server上下文(context)的構建及初始化
    serverContext = new DefaultEurekaServerContext(
            eurekaServerConfig,
            serverCodecs,
            registry,
            peerEurekaNodes,
            applicationInfoManager
    );

    // 將上下文資訊放到holder中
    EurekaServerContextHolder.initialize(serverContext);

    // 將eureka server叢集啟動起來。裡面會更新eureka server叢集的資訊,讓當前的eureka server感知到所有的其他eureka server
	// 然後搞一個定時排程任務,就是一個後臺執行緒,每隔一段時間,更新eureka server叢集的資訊
	// registry.init: 基於eureka server叢集的資訊,來初始化登錄檔,將eureka server叢集中所有的eureka
	// server的登錄檔資訊抓取過來,放到自己本地的登錄檔中。都是跟eureka server叢集中之間的登錄檔資訊互換有關聯的
    serverContext.initialize();
    logger.info("Initialized server context");

    // Copy registry from neighboring eureka node
	// 6、處理一些善後的事情,從相鄰的eureka節點拷貝註冊資訊
	// registry.syncUp(): 從相鄰的一個eureka server節點拷貝登錄檔資訊,如果拷貝失敗,就找下一個
    int registryCount = registry.syncUp();
    registry.openForTraffic(applicationInfoManager, registryCount);

    // Register all monitoring statistics.
	// 7、註冊所有的監控統計項
    EurekaMonitors.registerAllStats();
}
複製程式碼

這裡備註比較多,基本上是每個方法 實現的目的,並沒有進一步跟蹤細節問題,還是之前講到的,看原始碼還是要抓大放小,我們儘量先把主流程搞清楚,然後再去一步步攻克細節。

EurekaServer啟動流程總結

到這裡 eureka server啟動的相關程式碼就看完了,下面有一張流程圖來總結一下的:

01_EurekaServer啟動流程圖.png

相關文章