版本:netfix-eureka v1.7.2
正如我們所知道的汹胃,eureka是一個基于tomcat啟動的容器,那么啟動入口到底在哪呢犀填?
從github下載eureka源碼包决侈,通過gredle構(gòu)建在idea中,其中有個子工程叫做 eureka-server尖昏;在這個子工程發(fā)現(xiàn)有個web.xml,在這個xml文件中构资,我們看到有一個監(jiān)聽器和幾個過濾器抽诉,我們可以猜想,核心入口在那個叫做EurekaBootStrap監(jiān)聽器中吐绵。
果然迹淌,在EurekaBootStrap的contextInitialized()方法中看到很重要的線索;
在initEurekaEnvironment()方法中己单,基于單例模式唉窃,雙重檢索初始化了一個配置管理類,然后將dataCenter和environment這兩個參數(shù)進(jìn)行設(shè)置纹笼,如果不進(jìn)行配置纹份,默認(rèn)dataCenter=default,environment=test
接著看看initEurekaServerContext()方法廷痘,初始化了DefaultEurekaServerConfig類蔓涧,并在無參構(gòu)造方法中執(zhí)行了init()方法削咆,說白了這個init()方法里面做的事情就讀取eureka-server.properties文件
第一次進(jìn)入,eurekaClient肯定為null蠢笋,一般我們的環(huán)境不是cloud,所以會初始化MyDataCenterInstanceConfig類鳞陨,在MyDataCenterInstanceConfig無參構(gòu)造中什么也沒有昨寞,別急,看它的父類PropertiesInstanceConfig無參構(gòu)造厦滤,主要做的就是讀取eureka-client.properties文件援岩,還初始化了DiscoveryClient類,能用來發(fā)現(xiàn)服務(wù)的客戶端類掏导,這個類很重要享怀、很重要、很重要趟咆,但是這節(jié)并不重點分析它添瓷;這是怎么一回事?對服務(wù)端初始化去讀取eureka-server.properties文件就可以了值纱,為什么還需要去讀取eureka-client.properties并初始化客戶端鳞贷??虐唠?
不難理解搀愧,其實eureka服務(wù)端啟動并初始化的時候,它本身也是eureka客戶端疆偿,當(dāng)處在集群環(huán)境下咱筛,它也可以將自己作為eureka客戶端向其他eureka服務(wù)端進(jìn)行注冊。
接著往下走杆故,判斷是不是Aws相關(guān)迅箩,不用考慮,肯定是這個原生netfix eureka和Amazon等一些第三方有耦合反番,做的定制化處理邏輯沙热;因此會進(jìn)入else邏輯,實例化了PeerAwareInstanceRegistryImpl類罢缸,這個類可就有不少東西了篙贸,其實服務(wù)注冊的數(shù)據(jù)結(jié)構(gòu)就是一個map,這個map就在它的父類AbstractInstanceRegistry中
繼續(xù)往下看枫疆,又搞了一個什么叫做PeerEurekaNodes類爵川,這也太難了,這又是干什么息楔?直接說結(jié)果寝贡,這個類是eureka server集群節(jié)點信息扒披,一個PeerEurekaNodes就是一個eureka server集群
然后又初始化了DefaultEurekaServerContext,并進(jìn)行初始化圃泡,主要是為了在eureka server啟動后碟案,可以通過這個上下文獲取需要的信息
從其他eureka節(jié)點獲取注冊表的數(shù)量,進(jìn)行同步颇蜡,這里涉及拉取服務(wù)注冊表和服務(wù)續(xù)約(心跳)相關(guān)价说,本節(jié)先跳過
最后進(jìn)行監(jiān)控統(tǒng)計信息,沒什么好說的~
總結(jié):一定要帶著目的去看主線流程的源碼风秤,很多細(xì)節(jié)鳖目,在第一次去看的時候,我們是無法理解缤弦,看不懂的领迈,比如eureka server啟動的時候初始化DiscoveryClient,需要它做什么呢碍沐?后面我們再回過頭去揣摩這些細(xì)節(jié)部分狸捅,現(xiàn)在我們的目的很明確,就是想知道eureka server啟動累提,做了哪些主要的工作