在第六篇中倘核,我們已經(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 服務,如下圖所示:
其他節(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)圖:
官方文檔地址
https://github.com/Netflix/eureka/wiki/Eureka-at-a-glance
6 更多 Eureka Server/Client 的配置
更多 Eureka Server/Client 的配置請參考官方源碼
EurekaServerConfigBean 類
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