深入学习consul
2019獨角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
一.背景
——隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的系統(tǒng)/網(wǎng)站走向了分布式之路,但是分布式帶給我們的復(fù)雜性是難以想象的,這就需要專門有第三方統(tǒng)一管理微服務(wù)、配置、資源等。
第三方系統(tǒng)必須要具有下面兩個特征:
1.集群部署
2.數(shù)據(jù)一致性
?
——目前業(yè)內(nèi)有很多這種產(chǎn)品:zookeeper、etcd、consul,三者各有各的特點。這里就不一一說明三者的優(yōu)缺,僅僅分析consul的優(yōu)勢
1.封裝了服務(wù)發(fā)現(xiàn)的api,開發(fā)調(diào)用非常簡單
2.提供了健康檢查功能
3.使用了raft算法保證了一致性,比復(fù)雜的paxos算法更直接,相比而言,zk采用的是paxos,二etcd采用的是raft
4.支持多數(shù)據(jù)中心,保證多機房使用。
5.支持 http?和 dns 協(xié)議接口.,zookeeper 的集成較為復(fù)雜,,etcd 只支持 http 協(xié)議
6.官方提供web管理界面, etcd 無此功能
?
二:consul的基本概念
agent
組成 consul 集群的每個成員上都要運行一個 agent,可以通過 consul agent 命令來啟動。agent 可以運行在 server 狀態(tài)或者 client 狀態(tài)。自然的,運行在 server 狀態(tài)的節(jié)點被稱為 server 節(jié)點;運行在 client 狀態(tài)的節(jié)點被稱為 client 節(jié)點。
client 節(jié)點
負(fù)責(zé)轉(zhuǎn)發(fā)所有的 RPC 到 server 節(jié)點。本身無狀態(tài),且輕量級,因此,可以部署大量的 client 節(jié)點。
server 節(jié)點
負(fù)責(zé)組成 cluster 的復(fù)雜工作(選舉、狀態(tài)維護、轉(zhuǎn)發(fā)請求到 lead),以及 consul 提供的服務(wù)(響應(yīng) RCP 請求)。考慮到容錯和收斂,一般部署 3 ~ 5 個比較合適。
?
datacenter
多機房使用的數(shù)據(jù)共享
?
基本架構(gòu)圖
?
三.安裝和啟動
consul支持Mac os ? 、Linux、Windows等常用操作系統(tǒng),下載地址:點擊下載??
consul可以配置其web ui查看當(dāng)前的服務(wù) ?key/value ? 數(shù)據(jù)節(jié)點等
web-ui下載地址:點擊下載
下載后解壓,直接運行
consul需要用agent啟動,啟動模式可以是server和client
以window單機啟動server為例:
配置config.conf文件
進入consul根目錄 ?啟動命令:consul.exe agent -config-file config.conf
啟動成功后,瀏覽器打開http://127.0.0.1:8500/ui/ 可以看到整個consul的所有信息
如果需要配置集群的話
server node1 配置信息
server node2 配置信息
啟動兩個節(jié)點 ?啟動命令:consul.exe agent -config-file config.conf
這樣就完成了集群部署
打開consul的web-ui :http://127.0.0.1:8500/
?
四.服務(wù)注冊與發(fā)現(xiàn)的兩種方式
——Consul支持兩種服務(wù)注冊的方式,一種是通過Consul的服務(wù)注冊HTTP API,由服務(wù)自身在啟動后調(diào)用API注冊自己,另外一種則是通過在配置文件中定義服務(wù)的方式進行注冊。Consul文檔中建議使用后面一種方式來做服務(wù) 配置和服務(wù)注冊。
?
1.1首先我們來了解用配置注冊服務(wù)
創(chuàng)建一個叫redis-server1.json文件
[html]?view plain?copy
再創(chuàng)建一個client節(jié)點
[html]?view plain?copy
把json文件放到conf文件夾下面,利用consul.exe agent -config-file config.conf ,client注冊一個redis服務(wù)。
json文件定義中包含服務(wù)的name、address、port等,還包含一個服務(wù)檢測的配置,這里 我們每隔10s對服務(wù)進行一次健康檢查。同理,我們可以在其它節(jié)點上也建立同樣配置文件(需重啟,并帶上 -config-dir命令行選項),服務(wù)注冊就這么簡單。
1.2使用java代碼注冊服務(wù)
首先利用maven把封裝consul的客戶端jar包導(dǎo)入
[html]?view plain?copy
注冊代碼:
[java]?view plain?copy
這樣就完成了服務(wù)注冊,并且添加了健康檢查的url,比較簡單。
?
——同樣Consul提供了兩種發(fā)現(xiàn)服務(wù)的方式,一種是通過HTTP API查看存在哪些服務(wù);另外一種是通過consul agent內(nèi)置的DNS服務(wù)來做。兩者的差別在于后者可以根據(jù)服務(wù)check的實時狀態(tài)動態(tài)調(diào)整available服務(wù)節(jié)點列表。
?
2.1.DNS發(fā)現(xiàn)服務(wù)
在配置和部署完client服務(wù)后,我們就可以通過DNS命令來查詢服務(wù)的具體信息了。consul為服務(wù)編排的內(nèi)置域名為 “NAME.service.consul",這樣我們的redis的域名為:redis.service.consul 進行查詢服務(wù)
?
2.2.java代碼發(fā)現(xiàn)服務(wù)
[java]?view plain?copy
上面用代碼實現(xiàn)了服務(wù)的發(fā)現(xiàn),其發(fā)現(xiàn)是排除了一些不健康的服務(wù),這正是consul最大的優(yōu)點,使得服務(wù)變化通知更加簡單。
這里分析下consul和zookeeper服務(wù)變更通知的區(qū)別:
zookeeper:客戶端和服務(wù)端通過建立tcp長連接進行服務(wù)變更通知,一旦服務(wù)端有服務(wù)變化,通過socket發(fā)送消息給客戶端。優(yōu)點是簡單,服務(wù)端主動推送消息到客戶端,缺點是長連接往往不穩(wěn)定,鏈路斷開,客戶端經(jīng)常收不到服務(wù)端推送的消息。
?
consul:是基于http協(xié)議,客戶端通過http api主動查詢服務(wù),如果有變更則返回服務(wù)信息,我們都知道http是一個request,一個response,而consul怎樣保證服務(wù)端一有變更馬上response到客戶端呢,這里consul解決方案是:1輪循;2阻塞查詢,通過輪循調(diào)用服務(wù)端,并且不及時返回服務(wù)信息,而是等待一定時間在返回,在規(guī)定時間內(nèi)如果有服務(wù)變更則馬上返回變更信息,這樣就客戶端就可以及時的知道服務(wù)變更。
?
?
五.consul的其它使用
——consul做為分布式框架絕不僅僅滿足服務(wù)注冊和發(fā)現(xiàn),它還可以
?
1.分布式key/value,用于做配置中心。
2.分布式session,用于解決session的問題。
3.分布式鎖,其key/value也可以用于分布式鎖的問題
4.資源中心,動態(tài)管理redis、datasource、rabbitmq等資源
轉(zhuǎn)載于:https://my.oschina.net/mickelfeng/blog/1791719
總結(jié)
以上是生活随笔為你收集整理的深入学习consul的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html读取C#参数问题
- 下一篇: Redux异步中间件