1. Consul是什麼?
Consul是一個分佈式、高可用的系統,是一個爲了解決在生產環境中服務註冊,服務發現,服務配置的一個工具,它有多個組件,提供如下幾個關鍵功能:
- 服務發現: Consul的某些客戶端可以提供一個服務,例如api或者mysql,其它客戶端可以使用Consul去發現這個服務的提供者。使用DNS或者HTTP,應用可以很容易的找到他們所依賴的服務。
- 健康檢查: Consul客戶端可以提供一些健康檢查,這些健康檢查可以關聯到一個指定的服務(服務是否返回200 OK),也可以關聯到本地節點(內存使用率是否在90%以下)。這些信息可以被一個操作員用來監控集羣的健康狀態,被服務發現組件路由時用來遠離不健康的主機。
- 鍵值存儲: 應用可以使用Consul提供的分層鍵值存儲用於一些目的,包括動態配置、特徵標記、協作、leader選舉等等。通過一個簡單的HTTP API可以很容易的使用這個組件。
- 多數據中心: Consul對多數據中心有非常好的支持,這意味着Consul用戶不必擔心由於創建更多抽象層而產生的多個區域。
2. 爲什麼要用它?
現在企業應用都向微服務化方向發展,當把我們的系統功能拆分成一個一個的微服務後,存在以下問題
· 需要配置N個服務的網絡位置,加大配置的複雜性
· 服務的網絡位置變化,都需要改變每個調用者的配置
· 集羣的情況下,難以做負載(反向代理的方式除外)
(借用網上的一個圖來描述一下)
那我們該如何處理呢? 這個時候我們就可以通過使用 服務發現 機制系統,來幫助我們來管理這些繁雜的配置。
服務A-N把當前自己的網絡位置註冊到服務發現模塊(這裏註冊的意思就是告訴),服務發現就以K-V的方式記錄下,K一般是服務名,V就是IP:PORT。服務發現模塊定時的輪詢查看這些服務能不能訪問的了(這就是健康檢查)。客戶端在調用服務A-N的時候,就跑去服務發現模塊問下它們的網絡位置,然後再調用它們的服務。這樣的方式是不是就可以解決上面的問題了呢?客戶端完全不需要記錄這些服務網絡位置,客戶端和服務端完全解耦!
3. 搭建docker-consul環境。
3.1從docker-hub上搜索拉取鏡像
docker search consul
docker pull consul
3.2 啓動鏡像
dockerrun -d --name consulserver1 --net=host -e'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' consul agent-server -bind=10.10.10.79 -bootstrap-expect=1 -client0.0.0.0 –ui
–net=host docker參數, 使得docker容器越過了netnamespace的隔離,免去手動指定端口映射的步驟
-server consul支持以server或client的模式運行, server是服務發現模塊的核心, client主要用於轉發請求
-advertise 將本機私有IP傳遞到consul
-bootstrap-expect 指定consul將等待幾個節點連通,成爲一個完整的集羣
-retry-join 指定要加入的consul節點地址,失敗會重試, 可多次指定不同的地址
-client consul綁定在哪個client地址上,這個地址提供HTTP、DNS、RPC等服務,默認是127.0.0.1
-bind 該地址用來在集羣內部的通訊,集羣內的所有節點到地址都必須是可達的,默認是0.0.0.0
-allow_stale 設置爲true, 表明可以從consul集羣的任一server節點獲取dns信息, false則表明每次請求都會經過consul server leader
--name DOCKER容器的名稱
-client 0.0.0.0 表示任何地址可以訪問。
-ui 提供圖形化的界面。
3.3 驗證服務
IE,輸入:http://ip:8500後會出現下去的界面既表示成功。