微服務中的服務發現

什麼是服務發現

在介紹服務發現之前,先來介紹一下什麼是微服務,所謂的微服務其實就是將一套軟件拆分爲多個服務,每個服務專注於一個功能點,然後將業務流程拆分爲幾個不同的服務之間的組合,從而實現高內聚低耦合的效果。

在微服務體系結構中,所謂的服務發現就是用戶可以通過服務的名字,在註冊中心找到可以提供正常服務的實例的網絡地址(即ip地址和端口號)。這種根據服務名字發現服務的可用地址的機制就叫做服務發現。

爲什麼需要服務發現

現代網絡程序中主要分爲前端和後端兩部分,當前端的程序訪問後端的時候,必須要知道後端服務的網絡地址(即IP地址或者端口號)。以前每一個服務都被固定的部署到某一臺機器上,所以說每個服務的端口號和IP地址都是固定的,可以通過配置文件進行修改。但是,在微服務體系中,由於服務的實例有可能發送失敗重啓、自動擴容、升級等情況,導致這些服務實例對應的網絡地址是在動態變化的。如何精準、準確地使前端能夠發現後端是一個難以解決的問題。

服務發現的好處

使用服務發現機制最大的好處是使用方可以不用硬編碼的網絡地址,只需服務的名字(有時甚至連名字都不用)就能使用服務。在現代的體系架構中,單個服務實例的啓動和銷燬很常見,所以應該做到:無需瞭解整個架構的部署拓撲,就能找到這個實例。

解決方案

zookeeper

Zookeeper是一個集中式的服務。該服務能夠維護服務配置信息。命名空間,提供分佈式的同步,以及提供組化服務。Zookeeper是由Java語言實現,實現了強一致性(CP),而且是使用Zab協議在ensemble集羣之間協調服務信息的變化。

Zookeeper在ensemble集羣中執行3個。5個或者7個成員。衆多client端爲了能夠訪問ensemble。須要使用綁定特定的語言。

這樣的訪問形式被顯性的嵌入到了client的應用實例以及服務中。

服務註冊的實現主要是通過命令空間(namespace)下的ephemeral nodes。ephemeral nodes僅僅有在client建立連接後才存在。當client所在節點啓動之後,該client端會使用一個後臺進程獲取client的位置信息,並完畢自身的註冊。假設該client失效或者失去連接的時候。該ephemeral node就從樹中消息。

服務發現是通過列舉以及查看詳細服務的命名空間來完成的。Client端收到眼下全部註冊服務的信息,不管一個服務是否不可用或者系統新加入了一個同類的服務。Client端同一時候也須要自行處理全部的負載均衡工作,以及服務的失效工作。

Zookeeper的API用起來可能並沒有那麼方便。由於語言的綁定之間可能會造成一些細小的差異。假設使用的是基於JVM的語言的話,Curator Service Discovery Extension可能會對你有幫助。

因爲Zookeeper是一個CP強一致性的系統,因此當網絡分區(Partition)出故障的時候,你的部分系統可能將出出現不能註冊的情況。也可能出現不能找到已存在的註冊信息,即使它們可能在Partition出現期間仍然正常工作。特殊的是。在不論什麼一個non-quorum端,不論什麼讀寫都會返回一個錯誤信息。

etcd

Etcd是一個高可用的K-V存儲系統,主要應用於共享配置、服務發現等場景。

Etcd能夠說是被Zookeeper和Doozer催生而出。整個系統使用Go語言實現,使用Raft算法來實現選舉一致。同一時候又具有一個基於HTTP+JSON的API。

Etcd,和Doozer和Zookeeper相似,通常在集羣中執行3,5或者7個節點。client端能夠使用一種特定的語言進行綁定。同一時候也能夠通過使用HTTP客戶端自行實現一種。

服務註冊環節主要依賴於使用一個key TTL來確保key的可用性。該key TTL會和服務端的心跳捆綁在一起。假設一個服務在更新key的TTL時失敗了,那麼Etcd會對它進行超時處理。假設一個服務變爲不可用狀態,client會須要處理這種連接失效。然後嘗試另連接一個服務實例。

服務發現環節設計到羅列在一個文件夾下的全部key值。隨後等待在該文件夾上的全部變動信息。

因爲API接口是基於HTTP的,所以client應用會的Etcd集羣保持一個long-polling的連接。

因爲Etcd使用Raft一致性協議,故它應該是一個強一致性系統。Raft須要一個leader被選舉,然後全部的client請求會被該leader所處理。然而,Etcd似乎也支持從non-leaders中進行讀取信息,使用的方式是在讀情況下提高可用性的未公開的一致性參數。在網絡分區故障期間,寫操作還是會被leader處理,並且相同會出現失效的情況。

consul

Consul是強一致性的數據存儲,使用gossip形成動態集羣。它提供分級鍵/值存儲方式,不僅可以存儲數據,而且可以用於註冊器件事各種任務,從發送數據改變通知到運行健康檢查和自定義命令,具體如何取決於它們的輸出。

與Zookeeper和etcd不一樣,Consul內嵌實現了服務發現系統,所以這樣就不需要構建自己的系統或使用第三方系統。這一發現系統除了上述提到的特性之外,還包括節點健康檢查和運行在其上的服務。

Zookeeper和etcd只提供原始的鍵/值隊存儲,要求應用程序開發人員構建他們自己的系統提供服務發現功能。而Consul提供了一個內置的服務發現的框架。客戶只需要註冊服務並通過DNS或HTTP接口執行服務發現。其他兩個工具需要一個親手製作的解決方案或藉助於第三方工具。

Consul爲多種數據中心提供了開箱即用的原生支持,其中的gossip系統不僅可以工作在同一集羣內部的各個節點,而且還可以跨數據中心工作。

Consul還有另一個不錯的區別於其他工具的功能,它不僅可以用來發現已部署的服務以及其駐留的節點信息,還通過HTTP請求、TTLs(time-to-live)和自定義命令提供了易於擴展的健康檢查特性。

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