服務網關,Eureka與Zookeeper

    服務註冊中心,給客戶端提供可供調用的服務列表,客戶端在進行遠程服務調用時,根據服務列表然後選擇服務提供方的服務地址進行服務調用。服務註冊中心在分佈式系統中大量應用,是分佈式系統中不可或缺的組件,例如rocketmq的name server,hdfs中的namenode,dubbo中的zk註冊中心,spring cloud中的服務註冊中心eureka。

    在spring cloud中,除了可以使用eureka作爲註冊中心外,還可以通過配置的方式使用zookeeper作爲註冊中心。既然這樣,我們該如何選擇註冊中心的實現呢?

   著名的CAP理論指出,一個分佈式系統不可能同時滿足C(一致性)、A(可用性)和P(分區容錯性)。由於分區容錯性在是分佈式系統中必須要保證的,因此我們只能在A和C之間進行權衡。在此Zookeeper保證的是CP, 而Eureka則是AP。

Zookeeper保證CP

    當向註冊中心查詢服務列表時,我們可以容忍註冊中心返回的是幾分鐘以前的註冊信息,但不能接受服務直接down掉不可用。也就是說,服務註冊功能對可用性的要求要高於一致性。但是zk會出現這樣一種情況,當master節點因爲網絡故障與其他節點失去聯繫時,剩餘節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集羣都是不可用的,這就導致在選舉期間註冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集羣失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的註冊長期不可用是不能容忍的。

Eureka保證AP

    Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩餘的節點依然可以提供註冊和查詢服務。而Eureka的客戶端在向某個Eureka註冊或如果發現連接失敗,則會自動切換至其它節點,只要有一臺Eureka還在,就能保證註冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鐘內超過85%的節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,此時會出現以下幾種情況: 
    1. Eureka不再從註冊列表中移除因爲長時間沒收到心跳而應該過期的服務 
    2. Eureka仍然能夠接受新服務的註冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用) 
    3. 當網絡穩定時,當前實例新的註冊信息會被同步到其它節點中

 因此, Eureka可以很好的應對因網絡故障導致部分節點失去聯繫的情況,而不會像zookeeper那樣使整個註冊服務癱瘓。

 更深入的探討

下面轉發一篇更深入探討zookeeper與eureka作爲註冊中心區別的問題,文章轉發自

http://dockone.io/article/78 ,該文翻譯了國外的一篇文章。

 

     服務網關是微服務架構的重要部分,是我們必須要去做的原因:

  • 不僅僅實現了路由功能來屏蔽諸多服務細節,更實現了服務級別、均衡負載的路由。
  • 實現了接口權限校驗與微服務業務邏輯的解耦。通過服務網關中的過濾器,在各生命週期中去校驗請求的內容,將原本在對外服務層做的校驗前移,保證了微服務的無狀態性,同時降低了微服務的測試難度,讓服務本身更集中關注業務邏輯的處理。
  • 實現了斷路器,不會因爲具體微服務的故障而導致服務網關的阻塞,依然可以對外服務。

       我們使用Spring Cloud Netflix中的Eureka實現了服務註冊中心以及服務註冊與發現;而服務間通過Ribbon或Feign實現服務的消費以及均衡負載;通過Spring Cloud Config實現了應用多環境的外部化配置以及版本管理。爲了使得服務集羣更爲健壯,使用Hystrix的融斷機制來避免在微服務架構中個別服務出現異常時引起的故障蔓延。

       服務網關是微服務架構中一個不可或缺的部分。通過服務網關統一向外系統提供REST API的過程中,除了具備服務路由、均衡負載功能之外,它還具備了權限控制等功能。Spring Cloud Netflix中的Zuul就擔任了這樣的一個角色,爲微服務架構提供了前門保護的作用,同時將權限控制這些較重的非業務邏輯內容遷移到服務路由層面,使得服務集羣主體能夠具備更高的可複用性和可測試性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章