Consul 是什么?
Consul 官方站點:https://www.consul.io/
首先,官方介紹是:Consul 是一種服務網格的解決方案,在 Consul 中,提供了服務發現、配置、分段等控制管理平台,Consul 中的每項功能都可以單獨使用,也可以一起使用來構建完整的服務網格;在 Consul 內部,有一個簡單的代理服務,所以在安裝 Consul 后,馬上就可以開始使用 Consul ;當然,Consul 也支持集成第三方代理,比如 Envoy。
以上,是官方的介紹,我第一次看的時候也是非常的懵逼,因為這里面涉及了太多的專業詞匯,下面就說說自己的理解。
Consul 是一個服務組件,在用戶下載 Consul 的安裝包后,可以立即運行它,或者通過其它托管程序運行它,Consul 只有一個程序包,無需另行安裝;當運行 Consul 的時候,需要為其指定一些必須的參數,以供 Consul 在運行時使用;
比如參數 -data-dir 表示指定 Consul 存放數據的目錄。
服務注冊
Consul 內部偵聽 8500 端口,提供給 Consul 的客戶端注冊服務,比如張三開發了一個購物車程序,該購物車程序包含了“加入購物車”、“清空購物車” 兩個接口,張三在開發購物車程序的時候,使用了 Consul 的客戶端包組件,在程序運行起來以后,購物車程序就自動的連接到 Consul 的 8500 端口,注冊了一個服務,該服務被命名為“購物車程序”,此時,Consul 並不知道 “購物車程序”有多少個接口,Consul 只知道 “購物車程序”的服務地址、端口。
服務發現
在“購物車程序”注冊到 Consul 后,Consul 也僅僅知道有這么一個服務注冊進來了,並且還配置了健康檢查, Consul 會定時的去連接 “購物車程序”,確保其還處於可提供服務的狀態,任何人(程序)都可以通過 Consul 的外部地址訪問 Consul 內部的已注冊的服務列表,從而獲得真實的服務地址,然后調用該真實地址,獲得結果。
集群
Consul 是一個分布式的解決方案,可以部署多個 Consul 實例,確保數據中心的持續穩定,在 Consul 集群中,內部采用投票的方式選舉出 leader,然后才開始運行整個集群,只有正確選舉出 leader 后,集群才開始工作,當一個服務注冊到 Consul 后,集群將該服務進行同步,確保 Consul 集群內的每個節點都存儲了該服務的信息;然后,Consul 集群將對該服務進行健康檢查和投票,超過半數通過,即認為該服務為正常(或者異常);一旦被投票認定為異常的服務,該服務將不會被外部發現(不可訪問),在此過程中,Consul 將持續的對該異常的服務進行檢查,一旦服務恢復,Consul 即刻將其加入正常服務。
服務器和客戶端
Consul 支持兩種運行的方式,即 server 和 client 模式,當一個 Consul 節點以 server 模式運行的時候,就表示該 Consul 節點會存儲服務和配置等相關信息,並且參與到健康檢查、leader 選舉等服務器事務中,與之相反的是,client 模式不會存儲服務信息。
數據中心
每個 Consul 節點都需要加入一個命名的數據中心(DataCenter),一個節點上,可以運行多個數據中心,數據中心的作用在於應用隔離,相當於服務分組
鍵值存儲
在 Consul 內部,提供了簡單的數據存儲,也就是 key/value 系統,kv 系統非常強大,它的作用包括允許節點動態修改配置、執行 leader 選舉、服務發現、集成健康檢查、或者其它你想要存儲到 Consul 中的內容
Consul 的架構
好了,現在可以來看一下官方的這張架構圖了
上圖有兩個數據中心,這兩個數據中心內部的數據是不會同步的,他們是獨立運行的,包括其內部的健康檢查、leader 選舉等等都是獨立的,結合上面的介紹,應該可以很容易的讀懂這張圖。
Consul 能做什么?
通過上面的介紹,我們了解到了 Consul 其實就是一個分布式的服務管理平台,Consul 本身不具備網關的能力,所以,在一般的業務系統中,如果要應用 Consul ,通常的做法是在 Consul 的 server 節點上安裝一個 nginx,在 Consul 的服務注冊完成后,生成 nginx 的配置文件並重新加載它;此時,Consul 看上去好像是通過 nginx 具有了網關的能力,實際上,他們直接毫無關系;Consul 生成的 nginx 配置文件和我們手寫的 nginx 配置文件沒有太多的不同,都是一樣的,其實就是把手寫 nginx 這種體力活給自動化了。
如果不想這么麻煩的話怎么辦呢?這就引入了服務網關的概念,以 .NETCore 為例子,目前比較火熱的就是 ocelot+consul 的搭配,通過在服務中嵌入 ocelot 和 consul 的客戶端,自動的完成服務注冊到(Consul)和服務發現(ocelot讀取Consul中的服務);當用戶訪問某個 url 的時候,ocelot 將會根據路由將用戶請求轉發到從 Consul 拉取到的真正的服務中;對於 ocelot ,篇幅較長,這里不作展開。
結束語
開篇純理論了,下一篇再上點實戰的干活,就當學習記錄吧