這個系列開始研究 Eureka,在此以前,先來談談負載均衡器。html
本質上,Eureka 就是一個負載均衡器,可能有的人會說,它是一個服務註冊中心,用來註冊服務的,這種說法不能說錯,只是有點片面。nginx
在這篇博客裏,我將盡量按部就班、圖文並茂地回答下面的幾個問題。至於 Eureka 的使用、配置、源碼分析、集羣配置等等,這些後續博客再補充。git
那麼,先從一個例子開始。github
假設我有一個網上商城的項目,在項目初期,它是一個傳統的單體應用,沒有集羣,沒有微服務。顯然,這個時候我不須要考慮所謂的負載均衡。算法
隨着應用的推廣,個人用戶愈來愈多,當達到流量高峯時,服務器常常會扛不住。這樣下去可不行,因而,我試着加了兩臺機器。如今,有了三臺服務器,我不就能處理原來三倍的流量了嗎?數據庫
想法是挺好的,但這須要一個前提:要讓請求平攤到多臺服務器上面,即實現簡單的負載均衡。後端
那麼,要怎麼作才能將請求平攤到三臺服務器呢?我嘗試在 DNS 服務器加上兩臺新服務器的地址,不出所料,真的能夠這麼作。由於 DNS 會基於輪循負載算法返回地址,只要用戶拿到每一個地址的機會是均衡的,請求到我服務器也會是均衡的。因而,個人目的間接達到了。瀏覽器
上面的方案看起來挺好的,我本身不須要增長多餘的機器,就輕易實現了負載均衡。可是,我仍是遇到了問題。緩存
有一天,用戶訪問商城服務出現大量報錯,緣由是第三臺服務器的服務忽然掛掉了,可是 1/3 的請求仍是落到這一臺。由於一時排查不出問題的根源,並且重啓沒多久又會立刻掛掉,我試着把這臺服務器的地址從 DNS 上剔除出來。然而,另外一個問題出現了,DNS 的更新並無生效,我剔除了故障機器的地址,請求仍是會落到這一臺······安全
經歷了這一回,我總算明白,單純使用 DNS 作負載均衡仍是不靠譜。一個合格的負載均衡器至少要作到:當部分服務出現故障時,自動將其屏蔽,當服務恢復後,再將屏蔽放開。顯然,DNS 不能很好地知足。通過研究,我發現了 nginx、SLB、ALB 等等負載均衡器,它們均可以作到這一點。最後,我選擇了 SLB 做爲負載均衡器。
SLB 配置上要比傳統的 nginx 簡單不少,只要配置好監聽就行。SLB 會檢查後端服務器的健康狀態,當後端某臺服務器出現異常時,SLB 會自動將它隔離。 除此以外,它還有不少其餘功能,這裏就再也不擴展了。
有人可能會問,既然要用負載均衡器,爲何不用 Eureka?其實,還真的不能用,緣由後面會說到。我但願可以說明一點,一個工具再怎麼優秀,它也有不適用的場合。
這裏涉及到兩個名詞,有必要解釋一下:
仍是接着上面的例子。
個人商城業務變得愈來愈複雜,用戶規模也愈來愈大,傳統單體應用的缺點開始暴露出來:開發維護難以及數據庫瓶頸。因而,我重構了整個項目,作法比較簡單。顯然,我開始搞微服務了。
可是,無論我怎麼拆分,後端服務都不能作到徹底獨立,例如,處理訂單業務時須要查詢客戶信息,促銷活動有時也須要查詢客戶信息。這個時候,每一個服務都須要開放出對應的 mid-tier services 供其餘後端服務調用,另外,爲了安全以及方便管理,這部分的服務須要和 edge services 區分開(不在同一個應用)。
這個時候,我須要一個針對 mid-tier services 的負載均衡器。
理所固然地,我首先想到的仍是 SLB。我能夠再加一臺 SLB,用於後端服務器請求 mid-tier services。固然,mid-tier services 之間也能夠相互調用,只是圖中很差表示出來。
後來,我發現了一個更好的方案,那就是 Eureka。和 SLB 不一樣,Eureka 是專門針對 mid-tier services 的負載均衡器。它主要包含三個部分:
固然,這三個部分均可以進行橫向的擴展。
下圖只畫出了訂單服務調用客戶服務的示例,其餘的是同樣的。
經過 Eureka 的結構能夠知道,它並不適合做爲 edge services 的負載均衡器,Eureka Client 須要具有和 Eureka Server 進行通訊的能力,而終端用戶並不具有這一點。
Eureka 做爲一個專門針對 mid-tier services 的負載均衡器,相比 SLB 等,仍是存在不少優勢。
以上基本講完負載均衡器的內容,做爲開篇,它讓咱們思考:一個工具的本質是什麼?爲何咱們要用它?不用它行不行?
最後,感謝閱讀。
本文爲原創文章,轉載請附上原文出處連接:https://www.cnblogs.com/ZhangZiSheng001/p/14313051.html