什么是Eureka?
Eureka是一個基于REST的服務,主要用在AWS云環境作為服務發現,負載均衡和失敗轉移。我們叫這個服務,Eureka服務。 Eureka也有一個JAVA客戶端組件, Eureka Client,幫助與服務端更簡單的交互。 客戶端也有一個內置的負載均衡做簡單的round-robin均衡。 在Netflix, 很多更高級的負載均衡器包裝了Eureka來提供基于很多其他因子,如流量,資源利用率,錯誤情況等權重的負載均衡。
為什么需要Eureka?
在AWS云,由于其天生的屬性,服務器來來去去。不像傳統的負載均衡是與已知的IP地址和機器名工作,在AWS,負載均衡需要更多更復雜的注冊,解注冊服務。由于AWS還沒有提供一個中間層負載均衡,Eureka填補了這個中間層負載均衡的巨大空缺。
Eureka與AWS ELB有什么不同?
AWS Elastic Load Banancer是一個暴露給終端用戶網絡流量的服務邊緣負載均衡方案。Eureka是作為中間層負載均衡的補充。理論上你可以把中間層服務放在AWS ELB之后, 如果在EC2模型中你把他們直接暴露給外部世界但失去了所有AWS安全組的好處。
AWS ELB也是一個傳統的代理類型的負載均衡方案然而Erueka是不同的,負載均衡發生在實例/服務器/主機級別。客戶端實例知道所有關于他們需要與哪臺服務器通信的信息。基于你看的角度這可能會是好處也是壞處。如果你尋找的是AWS提供的基于用戶session粘滯的負載均衡,Eureka沒有一個開箱即用的方案。在Netflix,我們更需要我們的服務是無狀態的(無粘滯)。這是一個更好的擴展模型并且Eureka很適合做這個。
另一個與代理模式負載均衡和用Eureka的負載均衡的不同是你的應用在負載均衡停機時更有彈性,這是由于所有可用服務器的信息都緩存在客戶端。這確實需要一點內存,但買到了更好的彈性。
Eureka與Route 53有什么不同?
Route 53是一個域名服務,同樣的Eureka可以提供同樣的中間層服務,但相似點到此為止了。 Route 53是一個DNS服務,甚至可以在非AWS數據中心都可以提供你的DNS記錄。Route 53也可以在AWS區域之間基于路由做延遲控制。Eureka與內部DNS是同義詞并且跟外部世界的DNS服務沒有任何關系。廣義上Eureka也是一個區域隔離的服務,他不知道其他AWS區域的服務器。它主要的目的就是保存一個區域內的信息作為負載均衡用途。
你可以將你的之后跟漸層服務注冊在Route 53上并用AWS安全組來保護你的公網服務器,但這樣你的中間層服務器仍然暴露在外部。他同樣會有傳統基于DNS負載均衡方案的缺點,流量仍然可能會被路由到服務器已經不健康或者已經不存在的地方(AWS的云服務里任何時候服務器都可能消失)。
Netflix是怎么使用Eureka的?
在Netflix,Eureka除了作為一個中間層負載均衡的關鍵部分,還作為以下的原因。
- 作為與Netflix Asgard一起的紅黑部署 - Asgard一個讓云部署更方便的開源服務。Eureka會與Asgard交互,讓應用在新/老版本部署切換,讓故障處理更快速和無縫 - 尤其是當啟動100個實例部署時要花費很長時間的時候。
- 當我們的cassandra需要維護時摘掉實例。
- 為我們的memcached緩存服務提供識別環上實例列表功能。
- 由于各種各樣的原因提供保存其他應用特有原信息的服務。
什么時候使用Eureka?
你運行在AWS云上并且你有很多不像注冊在AWS ELB上或暴露給外部的中間層服務。你想找一個簡單的round-robin的負載均衡方案或者想要寫一個基于Eureka包裝過的符合你要求的負載均衡器。你不需要session粘滯和將session數據保存在一個像memcache的外部緩存。更重要的是,如果你的架構風格適合一個基于客戶端的負載均衡模型,Eureka相當適合這個場景。
應用客戶端和應用服務端怎么通信?
通信技術可以試試任何你喜歡的。Eureka幫你找到你需要通信的服務信息但沒有引入任何通信協議或方法的限制。比如,你可以用Eureka獲得目標機器地址并使用thrift,http(s)或其他RPC機制的協議。
高層架構
以上架構解釋了Eureka是怎樣在Netflix部署的并也是你會運行的狀態。在每個區域(region)都會有一個eureka集群,它只知道關于這個區域內的實例信息。每個zone都至少也有一個eureka服務器來處理zone級別容災。
服務注冊在Eureka上并且每30秒發送心跳來續命。如果一個客戶端在幾次內沒有刷新心跳,它會在90秒后被移出服務器注冊信息。注冊信息和刷新信息會在整個eureka集群的節點進行復制。任何zone的客戶端都可看到注冊信息(每30秒發生)去定位他們的服務(可能會在任何zone)并做遠程調用。
非Java服務和客戶端
對于非Java的服務,你可以用其他語言實現eureka的客戶端部分。基于REST的服務也暴露給了所有操作給Eureka客戶端。非Java客戶端也可以使用REST服務來查詢其他服務的信息。
可配置
使用Eureka你可以在集群中隨意添加刪除節點。你可以調各種內部配置,從超時到線程池。Eureka使用archaius并且如果你又一個配置源的實現那么可以動態調整很多東西。
彈性
在AWS云,很難不去思考構建彈性伸縮。Eureka使我們經驗的結晶,在客戶端和服務端都內置了彈性能力。
Eureka客戶端設計成可以處理一個或多個Eureka服務端的失敗場景。由于Eureka客戶端有注冊信息的緩存,他們可以很從容的處理失敗,就算是所有的eureka服務器都掛了也可以。
Eureka服務器對于其他eureka節點掛了也有足夠的彈性。就算是服務端和客戶端產生了網絡分區,服務器也有內置的彈性策略來防止大面積的停機。
多區域(Region)
在多個AWS區域部署Eureka是一個很簡單的工作。多個區域的Eureka集群之間并不通信。
監控
Eureka用servo來追蹤服務端和客戶端的信息,包括性能,監控和報警。數據保存在JMX中并暴露給Amazon Cloud Watch。
原文:
文章來自微信平臺「麥芽面包」
微信公眾號「darkjune_think」轉載請注明。
如果覺得有趣,微信掃一掃關注公眾號。
文章列表