Consul是一個提供整套服務網絡解決方案的中間件,除了核心的服務注冊/發(fā)現(xiàn)以外骨田,還提供很多其它的用途耿导,包含對Service Mesh模式的支持,以及鍵值對存儲等等态贤。我們這里僅對Consul的服務注冊/發(fā)現(xiàn)功能進行介紹舱呻。
Consul的基本架構
Consul啟動的每一個實例都叫做agent,agent根據運行的模式又分為兩種類型:
server:用于保存整個 Consul集群的狀態(tài)抵卫。包括其它 Consul servers和 clients 的信息狮荔,可用的服務列表,以及服務的調用地址等等介粘;官方推薦每一個數(shù)據中心運行3~5個(奇數(shù)個)server實例。server可以跨數(shù)據中心進行通信(通過WAN Gossip)晚树,從而支持多個數(shù)據中心姻采。
client: 一個client只是本地的一個輕量級進程。負責本地節(jié)點上所有服務的健康檢查爵憎,服務查詢和注冊(查詢和注冊的請求會被代理到server節(jié)點完成)慨亲。client存在的意義主要是為了減輕server節(jié)點與每個服務進行網絡通訊(比如定時健康檢查)的壓力,可以看做是server節(jié)點的代理宝鼓。官方推薦數(shù)據中心中每一個運行服務的節(jié)點都需要跑一個client實例刑棵。
總結:部署環(huán)境最低限度需要一個server實例才能完成基本功能(可以不需要client),生產環(huán)境推薦多server(避免單點)+每個節(jié)點一個client(提高性能)的模式。
下面這張圖很好的展示了server,client,service間的交互:
同一個局域網(數(shù)據中心)中的所有Consul實例都會加入到一個共同的Gossip pool (LAN Gossip)愚铡,這樣所有節(jié)點無需配置額外的服務器地址就能自動感知其它節(jié)點的存在蛉签,并實現(xiàn)故障檢測,事件通知等功能沥寥。
Consul的安裝和配置
Consul的安裝非常簡單碍舍,先到 官網 下載對應環(huán)境的安裝文件,得到zip格式的壓縮包邑雅,到對應的安裝目錄解壓即可片橡。以下是Consul啟動agent節(jié)點時的主要啟動參數(shù):
- -dev 以開發(fā)者模式啟動一個server節(jié)點,自動成為leader淮野,狀態(tài)存儲于內存中捧书,不能用于生產環(huán)境
- -server 以server模式啟動,沒加此參數(shù)的話默認是client模式
- -ui 啟動consul的監(jiān)控配置web界面
- -bootstrap-expect = 1 表示等待多少個節(jié)點再啟動骤星,配置成一個等同于以bootstrap模式啟動经瓷,自動當選為leader;必須是以server模式才可以設置
- -bootstrap 以bootstrap模式啟動妈踊,與-bootstrap-expect=1 效果相同了嚎,允許節(jié)點自我選舉為leader
- -bind = 192.168.1.101 Consul集群間的通訊的IP地址,集群中的所有節(jié)點需要能夠訪問該地址
- -client = 127.0.0.1 默認是127.0.0.1,接收客戶端訪問的IP地址歪泳,包括HTTP,DNS請求萝勤;
- -data-dir = /data/consul Consul節(jié)點存儲狀態(tài)的文件目錄,每個agent節(jié)點都需要配置(除了-dev模式啟動的)
- -config-file = /etc/consul/config.json 配置文件的位置呐伞,默認會讀取".json" 或 ".hcl"格式的文件
-
-log-file = /var/log/ 日志文件的位置
更多參數(shù)的說明可以參考 這里
現(xiàn)在來啟動一個單節(jié)點的server agent:
nohup ./consul agent -server
-bootstrap-expect=1
-data-dir=/home/cloud/consul-home/data
-log-file=/home/consul-home/logs/
-node=server-220
-bind=192.168.1.220
-client=0.0.0.0 -ui > /home/cloud/consul-home/consul.log 2>&1 &
啟動成功后敌卓,訪問http://localhost:8050 就可以看到Consul的控制臺界面:
我們可以利用Consul的http接口來手動注冊一個服務測試一下:
curl -X PUT -d '{
"ID": "my-test-service",
"Name": "my-test-service",
"Address": "192.168.1.220",
"Port": 8080
}' http://127.0.0.1:8500/v1/agent/service/register
更多接口的使用說明請查看這里 這里,然后控制臺就能查詢到剛才注冊的服務了: