eureka(二) eureka原理剖析

eureka原理

客戶端是如何注冊到注冊中心的

?在eureka的client與server通訊過程中祭埂,client需要把自己的信息發(fā)送到server牌芋,那么client具體是通過什么方式發(fā)送的,又發(fā)送了些什么東西呢侣诺。

?通過eureka的啟動日志可以看到這么一段信息,上面記錄了作為client的時候向服務(wù)發(fā)送注冊信息的注冊狀態(tài)裆泳。那么我們可以通過這段信息查找到DiscoveryClient類打上斷點來看下客戶端是如何注冊的弛姜。

eureka注冊信息

?通過斷點我們可以看到該方法的調(diào)用鏈,在這里面我們可以清晰的看到飒货,在最初始還是一段spring的容器的初始化魄衅,然后通過DefaultLifecycleProcessor來初始化實現(xiàn)了SmartLifecycle接口的EurekaServiceRegistry類,在注冊前置操作完畢之后通過通知listener方式初始化一個定時任務(wù)線程池來重復(fù)執(zhí)行DiscoveryClient的register記錄狀態(tài)的變更塘辅。

eureka注冊調(diào)用鏈

?我們現(xiàn)在可以根據(jù)下面的方法邏輯來看下client是如何向服務(wù)器發(fā)送注冊信息的晃虫,并且可以知道具體發(fā)送了一些什么東西。

發(fā)送服務(wù)信息

?通過DiscoveryClient中的register方法我們可以清楚的看到客戶端向服務(wù)端發(fā)送的實例信息扣墩,我們可以看一下在運行時的時候客戶端中有些什么信息哲银。

客戶端發(fā)送實例信息

?由上圖我們可以看出發(fā)送的信息主要有服務(wù)的名稱、IP呻惕、實例名稱及端口信息荆责。具體是通過什么方式發(fā)送的,我們可以通過對象的名稱看出來是通過http的方式發(fā)送蟆融。

注冊中心又是如何接收客戶端的注冊請求

?在我們弄清楚客戶端發(fā)送的注冊信息之后草巡,我們可以繼續(xù)看下注冊中心又是如何接收從客戶端發(fā)送過來的

服務(wù)端接收信息

?通過該日志信息我們可以查到AbstractInstanceRegistry類中有個register輸出了這條日志。那么同樣的方式我們通過斷點來查看調(diào)用鏈。

服務(wù)端接收信息調(diào)用鏈

?通過調(diào)用鏈我們可以清晰的看到客戶端發(fā)送注冊信息到注冊中心山憨,在ApplicationResource#addInstance
對發(fā)送過來信息必要參數(shù)進(jìn)行驗證之后查乒,最終調(diào)用到AbstractInstanceRegistry#register中進(jìn)行信息注冊。該請求接收的方式主要是通過NIO的方式來接收郁竟。

注冊中心是如何存儲注冊信息的

?在我們接收到注冊信息之后我們需要對注冊信息進(jìn)行存儲玛迄,在注冊中心中是通過一個ConcurrentHashMap來存儲的。在第一次注冊的時候會判斷map是否存在如果不存在的話則會創(chuàng)建一個key為String棚亩、value為Lease的ConcurrentHashMap集合對象蓖议,并將注冊信息存儲到該Map中,在之后的注冊信息中則刷新該對象中的信息讥蟆。具體操作邏輯可看下圖:

注冊信息接收存儲

注冊中心的高可用機(jī)制

?在微服務(wù)體系中勒虾,注冊中心是一個非常重要的服務(wù),如果注冊中心宕機(jī)了瘸彤,那么就會造成服務(wù)之間的調(diào)用無法拿到當(dāng)時時間點有效的服務(wù)器地址修然,這樣就會造成我們各個服務(wù)的調(diào)用失敗,為了保證注冊中心的高可用质况,eureka的注冊機(jī)制中提供了注冊中心的相互注冊愕宋。在這種情況下如果有一臺eureka宕機(jī)了,我們可以通過控臺來看觀察eureka的狀態(tài)结榄,及時通知相關(guān)人員來修復(fù)中贝。

?那么具體在eureka中如何實現(xiàn)高可用呢,我們只需要在server端的配置上加上其他server端的注冊地址臼朗,將該服務(wù)器的信息發(fā)送到其他server端邻寿,這樣eureka就形成了一個集群。

eureka高可用方式

?既然我們已經(jīng)知道是通過這條配置來形成集群的那么我們可以在日志中查找一下依溯,是否有類似的信息老厌。通過下圖的日志打印,我們可以找到有這么一個方法PeerEurekaNodes#start打印出了節(jié)點信息黎炉,那么我們同樣通過斷點的方式來查看一下調(diào)用鏈及運行邏輯枝秤。

eureka集群日志

?通過調(diào)用鏈我們我們查找到這樣的一段邏輯,從字面上的意思是初始化eureka節(jié)點慷嗜。在eureka的啟動方法中我們可以看到他啟動了一個單線程定時任務(wù)來做eureka集群節(jié)點更新淀弹,至于任務(wù)執(zhí)行使用的參數(shù)信息這個在后面講配置的時候會說到。

初始化節(jié)點調(diào)用
eureka啟動

?通過源碼的追蹤我們知道在第一次更新節(jié)點信息的時候創(chuàng)建用于server通訊的JerseyReplicationClient
庆械。在創(chuàng)建的時候會根據(jù)配置的屬性信息選擇是否需要使用ssl薇溃,并且將這個通訊客戶端封裝成一個PeerEurekaNode對象用來指代eureka的遠(yuǎn)程server服務(wù)。

創(chuàng)建eureka節(jié)點

缭乘。
?在PeerEurekaNode創(chuàng)建的時候創(chuàng)建數(shù)據(jù)同步任務(wù)處理器ReplicationTaskProcessor沐序、創(chuàng)建批量任務(wù)調(diào)度器batchingDispatcher及創(chuàng)建單任務(wù)調(diào)度器nonBatchingDispatcher。

eureka階段創(chuàng)建具體流程

Eureka集群信息同步機(jī)制

?現(xiàn)在我們知道在注冊中心集群的各個節(jié)點中會存儲PeerEurekaNode對象,我們可以通過這些對象來同步各個節(jié)點的信息策幼,那么在這些集群節(jié)點信息之間又同步了些什么信息呢邑时。我們可以在PeerAwareInstanceRegistryImpl#register中看到在注冊之后有個replicateToPeers方法來同步節(jié)點信息,在這個方法中我們就看到了PeerEurekaNode對象特姐。

eureka信息同步

?在該方法中我們可以看到他通過一個isReplication參數(shù)來表示實例是否為復(fù)制的實例晶丘,通過這樣的方式來防止循環(huán)傳播。如果不是復(fù)制的實例并且存在eureka集群的話則會同步應(yīng)用名稱唐含、id浅浮、實例信息。

注冊中心剔除服務(wù)的機(jī)制什么

?在eureka中如果有些服務(wù)發(fā)生了錯誤捷枯,未正常在注冊中心中注銷滚秩,如果有服務(wù)調(diào)用到了這些服務(wù)就會導(dǎo)致業(yè)務(wù)無法進(jìn)行,這時該怎么辦铜靶。eureka為我們提供了服務(wù)剔除機(jī)制叔遂,主要用于剔除這些異常未正常調(diào)用cannel的服務(wù)他炊,主要通過EvictionTask中的evict方法來實現(xiàn)争剿。

注冊中心服務(wù)剔除

?上圖就是evict的具體代碼,我們來詳細(xì)說下這里主要做了些什么操作:

  1. 首先他會判斷是否開啟了自我保護(hù)機(jī)制痊末,該機(jī)制在配置文件中配置蚕苇。
  2. 如果最后[更新時間 + lease的存活時間 + 補償時間 < 當(dāng)前時間]就加入到過期列表,補償時間的計算如下圖凿叠,計算方式[當(dāng)前時間點 - task最近一次執(zhí)行的時間點 - 清除間隔涩笤,小于0則取0]。
獲取補償時間
  1. 計算要剔除的注冊服務(wù)最大剔除數(shù)量盒件,計算方式為[注冊服務(wù)總數(shù)-注冊服務(wù)總數(shù)*自我保護(hù)續(xù)約百分比閥值]蹬碧,閥值來自配置文件默認(rèn)0.85。
  2. 通過洗牌算法(Knuth shuffle algorithm)算法來公平剔除服務(wù)炒刁。
  3. 服務(wù)剔除的方法如下圖恩沽,從服務(wù)容器中獲取該服務(wù)的實例,移除他翔始。將當(dāng)前服務(wù)剔除的操作時間添加到最近關(guān)閉服務(wù)隊列罗心、最近狀態(tài)更改隊列。最后清除緩存城瞎。
服務(wù)剔除實現(xiàn)

?因為自我保護(hù)機(jī)制的存在渤闷,會延遲才剔除服務(wù),所以我們需要對服務(wù)進(jìn)行降級和熔斷才能保證該服務(wù)盡量少調(diào)用或不調(diào)用脖镀。

服務(wù)消費者如何獲取服務(wù)信息

?注冊中心的作用我們清楚了飒箭,那么在服務(wù)調(diào)用的時候我們需要知道被調(diào)用服務(wù)器的信息,我們是如何在client中下載到其他服務(wù)器的信息呢。

?為了查找client的執(zhí)行痕跡弦蹂,我們需要把日志的級別修改debug漫萄,我們在client配置文件加上一條配置使日志打印出來[logging.level.root=DEBUG],加上之后我們再運行的時候就可以在注冊之后的信息看到如下圖的日志信息。

client獲取服務(wù)信息日志

?根據(jù)打印的信息我們可以在對應(yīng)的日志信息中加上斷點查看調(diào)用鏈,通過調(diào)用鏈我們可以看到具體的刷新服務(wù)信息的邏輯盈匾。通過addInstance方法將服務(wù)信息添加到ConcurrentHashMap中腾务。

client獲取服務(wù)信息調(diào)用鏈
刷新服務(wù)信息

?至于如何初始化該刷新任務(wù)我們可以通過調(diào)用鏈之一向上可以找到下圖方法,在DiscoveryClient#initScheduledTasks方法中可以看到通過配置參數(shù)來設(shè)置定時執(zhí)行任務(wù)削饵。

初始化刷新服務(wù)信息任務(wù)

eureka的作用總結(jié)

?注冊中心主要用于服務(wù)的注冊發(fā)現(xiàn)岩瘦,可以及時通過admin頁面來查看服務(wù)狀態(tài),方便運維人員及時處理異常服務(wù)器窿撬。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末启昧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劈伴,更是在濱河造成了極大的恐慌密末,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跛璧,死亡現(xiàn)場離奇詭異严里,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)追城,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門刹碾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人座柱,你說我怎么就攤上這事迷帜。” “怎么了色洞?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵戏锹,是天一觀的道長。 經(jīng)常有香客問我火诸,道長锦针,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任惭蹂,我火速辦了婚禮伞插,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盾碗。我一直安慰自己媚污,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布廷雅。 她就那樣靜靜地躺著耗美,像睡著了一般京髓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上商架,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天堰怨,我揣著相機(jī)與錄音,去河邊找鬼蛇摸。 笑死备图,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赶袄。 我是一名探鬼主播揽涮,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼饿肺!你這毒婦竟也來了蒋困?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤敬辣,失蹤者是張志新(化名)和其女友劉穎雪标,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溉跃,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡村刨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊积。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烹困。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乾吻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拟蜻,我是刑警寧澤绎签,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站酝锅,受9級特大地震影響诡必,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搔扁,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一爸舒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稿蹲,春花似錦扭勉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忠聚。三九已至,卻和暖如春唱捣,著一層夾襖步出監(jiān)牢的瞬間两蟀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工震缭, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赂毯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓拣宰,卻偏偏與公主長得像欢瞪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子徐裸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容