微服務架構(gòu)實戰(zhàn)學習(八):Eureka 總結(jié)及注意事項

在第六篇中倘核,我們已經(jīng)有過將 Eureka Client 注冊到本地 Eureka Server 服務上的介紹浪读,但當時的本地 Eureka Server 服務是個單節(jié)點服務纷纫,在第七篇中我們實現(xiàn)了 Eureka Server 高可用方案后 Client 又該如何注冊呢牲尺?

其實很簡單宪卿,只需要將 Client 注冊到集群中的每一個節(jié)點即可。

一望众、Eureka Client 高可用

1.1 Eureka Client 配置

以第六篇中我們創(chuàng)建的 Eureka Client 為例匪补。當時,我們注冊到單節(jié)點的 Eureka Server 的配置文件如下所示:

spring:
  application:
    name: client-test

server:
  port: 8080

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8000/eureka/

而我們只需要將 eureka.client.service-url.defaultZone 的值由一個節(jié)點改為多個節(jié)點即可烂翰,如下配置:

spring:
  application:
    name: client-test

server:
  port: 8080

eureka:
  client:
    service-url:
      defaultZone: http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/

注:http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/ 是我們在第七講中實現(xiàn)的一個 Eureka 高可集群方案夯缺。

1.2 實現(xiàn) client 高可用

前面我們實現(xiàn)了 Eureka Server 的高可用,即建立一個集群來實現(xiàn) Server 服務的交叉注冊甘耿,并且我們將客戶端服務分別注冊到集群上的每一個節(jié)點踊兜,這樣即使某一個 Server 服務掛掉了,仍然能夠保證我們能夠獲取到我們的 Client 服務信息佳恬。

這似乎看起來已經(jīng)是一個完美的解決方案了呀捏境,還要做什么 client 的高可用呢于游?

難道你沒發(fā)現(xiàn)一個問題,如果我們的 client 服務它自己掛了呢垫言?就算我們的 Server 服務是正常的贰剥,那么我們不是也訪問不了我們的 Client 端的服務了嗎,那這個問題如何解決呢筷频?

其實非常簡單蚌成,我們只需要把我們的 client 服務的程序多運行幾個便解決了這個問題,啟動方法大致有兩種:
(1) 我們可以在同一臺服務器上啟動多個 Client 程序監(jiān)聽不同的端口截驮,只需要該服務器與 Server 集群的服務器網(wǎng)絡連通笑陈。
(2) 也可以在不同服務器上啟動多個 Client 程序監(jiān)聽 "不同/相同" 的端口际度,同樣需要該服務器與 Server 集群的服務器網(wǎng)絡連通葵袭。

如:
我在 localhost 上運行一個 localhost:8080 的 Client 并注冊到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/
在 localhost 上運行一個 localhost:8081 的 Client 并注冊到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/乖菱,
在 192.168.174.135 (不同于 Eureka Server 集群另一臺虛擬機) 運行一個 192.168.174.135:8080 的 Client 并注冊到 http://hadoop1:8000/eureka/,http://hadoop2:8000/eureka/,http://hadoop3:8000/eureka/坡锡。

程序打包及運行此處省略,可參考第六篇中介紹的方法操作窒所。
運行正常后鹉勒,我們可以從 Eureka Server 集群的各節(jié)點中查看到已經(jīng)注冊的 Eureka Client 服務,如下圖所示:


192.168.174.200 Eureka Server UI

192.168.174.201 Eureka Server UI

其他節(jié)點信息基本相同吵取,不再列出禽额。

至此,我們的 Eureka 的 Server 和 Client 的高可用便完整的實現(xiàn)了皮官。

二脯倒、Eureka 總結(jié)及注意事項

2.1 Eureka 注意事項

1 偽高可用

在我們將 Client 服務注冊到我們的 Server 集群上時,也許有人會發(fā)現(xiàn)捺氢,如果我們的注冊地址只填寫 Server 集群上的一個節(jié)點藻丢,我們也能在三個節(jié)點的 UI 界面上都看到這個 Client 服務。如下示例:

Client -> application.yml

eureka:
  client:
    service-url:
      defaultZone: http://hadoop1:8000/eureka/

這是不是說我們前面講的在 Client 的配置文件中配置 Eureka Server 集群的每一個節(jié)點是多余的操作呢摄乒?其實不然悠反,我們只配置了注冊到 hadoop1 節(jié)點的 Eureka Server 服務,那么 Client 服務就只是在 hadoop1 節(jié)點上進行了注冊馍佑,而在 hadoop2/hadoop3 節(jié)點上也能看見 Client 服務的信息則是因為 Server 之間有互相同步數(shù)據(jù)的功能斋否。因此,我們只是在 hadoop2/hadoop3 節(jié)點看到了 hadoop1 上的數(shù)據(jù)而已拭荤,實則并沒有真正注冊在 hadoop2/hadoop3 節(jié)點如叼。

如果 hadoop1 節(jié)點的 Eureka Server 不幸掛掉了的話,那么 hadoop2/hadoop3 節(jié)點上的 Client 服務也就看不到了穷劈。

這就是一個偽高可用的坑笼恰。

1 Eureka Server 自己本身也是一個 Client踊沸,它也需要向 其他的 Eureka Server 注冊

從構(gòu)建集群時,我們可以了解到社证,Eureka Server
這有點類似于逼龟,蘇寧是一個電商平臺,用戶可以直接從蘇寧的官網(wǎng)上買到其所售的商品追葡;淘寶也是一個電商平臺腺律,用戶也可以直接從淘寶上買到其所售的商品。然后宜肉,蘇寧在淘寶上注冊了一個店鋪匀钧。這樣你既能從蘇寧官網(wǎng)買到他所售的商品,也能從淘寶的蘇寧店鋪買到他的商品...
當然谬返,蘇寧在淘寶注冊店鋪的原因應該不會是害怕自家的官網(wǎng)宕掉了...哈哈之斯,此處思路應該是相通的,只是各自所需要達到的目的可能不同遣铝。
Eureka Server 使用相互交叉注冊的方式佑刷,能夠使得即使一個服務掛掉了,整個注冊中心仍然處于可正常運轉(zhuǎn)的狀態(tài)酿炸。

2 Eureka Server 自我保護機制

Eureka Server 的自我保護機制可以通過 eureka.server.enable-self-preservation: false 來關閉瘫絮。

自我保護機制的響應率閥值默認 85%,如果 15 min 之內(nèi)心跳失敗的比例低于該閥值填硕,會有告警麦萤,但 Eureka Server 還是會保留 Client 在注冊中心里,這是為了防止由于網(wǎng)絡原因?qū)е铝诵闹袡z測出現(xiàn)問題扁眯,給出了一定的容錯空間壮莹。

此閥值也可以通過設置 eureka.server.renewal-percent-threshold:0.50 來進行設置

2.2 Eureka 總結(jié)

1 創(chuàng)建 Eureka Server/Client

要創(chuàng)建一個 Eureka Server/Client 程序,我們只需要以下幾步
(1) 創(chuàng)建一個 spring boot 項目
(2) 添加 spring cloud netflix 依賴及 spring boot 依賴
(3) 配置項目信息
(4) 在 spring boot 的啟動類上添加 @EnableEurekaServer (Server) 注冊或者 @EnableDiscoveryClient/@EnableEurekaClient (Client)注解即可恋拍。

2 高可用

要實現(xiàn) Eureka Server 的高可用垛孔,我們只需要為 Eureka Server 服務搭建一個集群,讓其多個(至少倆)服務之間交叉注冊即可施敢。

要實現(xiàn) Eureka Client 的高可用周荐,我們只需要為 Eureka Client 程序多啟動幾個服務并且注冊到 Eureka Server 即可。

3 Eureka 服務間通訊機制

Eureka 默認使用 Jersey/Xstream/ 進行數(shù)據(jù)的序列化僵娃,使用 HTTP 協(xié)議進行 Client 與 Server 端的通信概作,但你也可以使用自己的序列化方式來進行服務間通信。官方文檔地址如下:
https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication

4 Eureka 自我保護機制

自我保護機制是跟 Eureka 的心跳機制有關的 (心跳機制就是 Client 與 Server 端每隔一段時間進行一次網(wǎng)絡通信默怨,交換服務的相關元數(shù)據(jù))讯榕。而用過網(wǎng)絡通信自然就有可能存在網(wǎng)絡上的問題,比如,Client A 本來運行是正常的愚屁,但在 Client A 與 Server A 之前的網(wǎng)絡出現(xiàn)了異常济竹,導致這兩者之間的通信中斷。這種情況下就屬于誤判了霎槐,因為 Client 本身是正常運行的送浊,于是為了防止這類情況,Eureka 做了個自我保護機制丘跌。

官方文檔地址如下:
https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

5 官方的 Eureka 高可用架構(gòu)圖

前面雖然我也畫過 Eureka 的高可用架構(gòu)圖袭景,但我只畫了 Server 部分的,完整及權(quán)威的請參數(shù)如下架構(gòu)圖:


Eureka architecture

官方文檔地址

https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance

6 更多 Eureka Server/Client 的配置

更多 Eureka Server/Client 的配置請參考官方源碼

EurekaServerConfigBean 類

https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfigBean.java

EurekaClientConfigBean 類
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java

EurekaInstanceConfigBean 類
https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaInstanceConfigBean.java

7 Eureka 相關項目代碼

Eureka Server

https://github.com/jiangzhuolin/eureka-server-simple

Eureka Client
https://github.com/jiangzhuolin/eureka-client-simple

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闭树,一起剝皮案震驚了整個濱河市耸棒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌报辱,老刑警劉巖与殃,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捏肢,居然都是意外死亡奈籽,警方通過查閱死者的電腦和手機饥侵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門鸵赫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躏升,你說我怎么就攤上這事辩棒。” “怎么了膨疏?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵一睁,是天一觀的道長。 經(jīng)常有香客問我佃却,道長者吁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任饲帅,我火速辦了婚禮复凳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘灶泵。我一直安慰自己育八,他們只是感情好,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布赦邻。 她就那樣靜靜地躺著髓棋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上按声,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天膳犹,我揣著相機與錄音,去河邊找鬼签则。 笑死镣奋,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的怀愧。 我是一名探鬼主播侨颈,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼芯义!你這毒婦竟也來了哈垢?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤扛拨,失蹤者是張志新(化名)和其女友劉穎耘分,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绑警,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡求泰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了计盒。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悯恍,地道東北人库糠。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像涮毫,于是被迫代替她去往敵國和親瞬欧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

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