前言html
常見的註冊中心有zookeeper 、eureka、consul、etcd。
從生態發展、便利性、語言無關性等角度來綜合考量,選擇consul,多數據中心支持,支持k-v能力,可擴展爲配置中心。
github地址:https://github.com/hashicorp/consul
consul官網:https://learn.hashicorp.com/consulnode
consul是分佈式的、高可用、橫向擴展的。consul提供的一些關鍵特性:linux
Consul的微服務通常都是集羣,集羣由一個個的Consul節點組成,在這些Consul節點裏面,分爲兩種角色,Server 以及 Client。
consul節點在啓動時能夠定義自身角色,client、server兩種。
client節點只負責轉發外部請求,全部註冊到當前節點的服務會被轉發到server節點,向server節點進行鍵值對的讀/寫,自己是不持久化這些信息,是無狀態的;
server節點的職責是使用raft協議保證數據一致性,響應客戶端的請求,維護集羣狀態,與其餘數據中心交互,另外全部的信息持久化到本地,這樣遇到故障,信息是能夠被保留的。
節點之間經過gossip廣播協議(謠言協議),進行節點之間的數據交互,最終你們達到一致。nginx
consul概念git
linux下安裝github
(1)進入consul官網找到本身開發平臺對應的安裝包下載https://www.consul.io/downloads.html
或者wget https://releases.hashicorp.com/consul/1.5.1/consul_1.5.1_linux_amd64.zip
(2)下載完後,解壓,獲得一個可執行文件consul
(3)將這個文件移動到全局變量環境中
$ sudo mv consul /usr/local/bin/
(4)驗證是否安裝成功$ consulweb
window下安裝算法
(1)進入consul官網找到本身開發平臺對應的安裝包下載https://www.consul.io/downloads.html
(2)下載完後,解壓,獲得一個可執行文件consul
(3)將這個文件移動到全局變量環境中json
(4)啓動consul命令:bootstrap
consul agent -dev -ui -node=cy-dev:該模式不能用於生產環境,由於該模式下不會持久化任何狀態,該啓動模式僅僅是爲了快速便捷的啓動單節點consul,-node結點名爲cy,-ui能夠用界面訪問,默認能訪問。 測試地址http://localhost:8500
consul agent經常使用命令解讀 1.修改默認端口 使用-http-port命令行參數,例如修改爲8080端口 consul agent -dev -http-port 8080 2.公網可訪問 使用-client 0.0.0.0 consul agent -dev -http-port 8080 -client 0.0.0.0 3.查看集羣節點信息 consul members Node Address Status Type Build Protocol DC Segment n3 127.0.0.0:8301 alive server 1.1.0 2 dc1 <all> node:節點名 Address:節點地址 Status:alive表示節點健康 Type:server運行狀態是server狀態 DC:dc1表示該節點屬於DataCenter1 4.-data-dir 做用:指定agent儲存狀態的數據目錄,這是全部agent都必須的,對server尤爲重要,由於他們必須持久化集羣的狀態 5.-config-dir 做用:指定service的配置文件和檢查定義所在的位置。目錄必需爲consul.d,文件內容都是json格式的數據。配置詳解見官方 6.-config-file 做用:指定一個要裝載的配置文件 7.-dev 做用:開發服務器模式,雖然是server模式,但不用於生產環境,由於不會有任何持久化操做,即不會有任何數據寫入到磁盤 8.-bootstrap-expect 做用: 參數代表該服務運行時最低開始進行選舉的節點數,當設置爲1時,則意味容許節點爲一個時也進行選舉;當設置爲3時,則等到3臺節點同時運行consul並加入到server才能參與選舉,選舉完集羣纔可以正常工做。 通常建議服務器結點3-5個。 9.-node 做用:指定節點在集羣中的名稱,該名稱在集羣中必須是惟一的(默認這是機器的主機名),直接採用機器的IP 10.-bind 做用:指明節點的IP地址,通常是0.0.0.0或者雲服務器內網地址,不能寫阿里雲外網地址。這是Consul偵聽的地址,它必須能夠被集羣中的全部其餘節點訪問。雖然綁定地址不是絕對必要的,但最好提供一個。 11.-server 做用:指定節點爲server,每一個數據中心(DC)的server數推薦3-5個。 12.-client 做用:指定節點爲client,指定客戶端接口的綁定地址,包括:HTTP、DNS、RPC 默認是127.0.0.1,只容許迴環接口訪問 13.-datacenter 做用:指定機器加入到哪個數據中心中。老版本叫-dc,-dc已經失效
節點或五個server節點組一個集羣,爲何是單數,由於集羣須要選舉一個leader來保證數據一致性。票數要超過半數以上才能選舉爲leader。
基本的命令爲:
consul agent -server -bind=10.0.xx.55 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1
-server 表示是以服務端身份啓動 -bind 表示綁定到哪一個ip(有些服務器會綁定多塊網卡,能夠經過bind參數強制指定綁定的ip) -client 指定客戶端訪問的ip(consul有豐富的api接口,這裏的客戶端指瀏覽器或調用方),0.0.0.0表示不限客戶端ip -bootstrap-expect=3 表示server集羣最低節點數爲3,低於這個值將工做不正常(注:相似zookeeper同樣,一般集羣數爲奇數,方便選舉,consul採用的是raft算法) -data-dir 表示指定數據的存放目錄(該目錄必須存在) -node 表示節點在web ui中顯示的名稱 -config-dir 配置文件目錄,裏面全部以.json結尾的文件都會被加載
啓動成功後,終端窗口不要關閉,能夠在瀏覽器裏,訪問下,相似 http://10.0.xx.55:8500/,正常的話,應該會看到一行文字:Consul Agent。
爲了防止終端關閉後,consul退出,能夠在剛纔命令上,加點東西,將其轉入後臺運行。相似:
nohup xxx > /dev/null 2>&1 &
如今咱們使用四臺機器建立集羣:
10.0.xx.5五、10.0.xx.20三、10.0.xx.20四、10.0.xx.205
1.啓動server端
nohup consul agent -server -bind=10.0.xx.55 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server1 > /dev/null 2>&1 & nohup consul agent -server -bind=10.0.xx.203 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server2 > /dev/null 2>&1 & nohup consul agent -server -bind=10.0.xx.204 -client=0.0.0.0 -bootstrap-expect=3 -data-dir=/data/application/consul_data/ -config-dir /etc/consul.d -node=server3 > /dev/null 2>&1 &
注意更改bind參數的ip,以及node參數裏的節點名稱
2.啓動client端
幾乎徹底同樣,只是把-server 去掉,在10.0.xx.205上運行:
nohup consul agent -client=0.0.0.0 -data-dir=/data/application/consul_data/ -node=client1 -config-dir /etc/consul.d -ui > /dev/null 2>&1 &
3.組建cluster
如今咱們有了3個server node + 1個client node,可是這4個節點都是相互獨立的,能夠在任一節點上運行:
consul members
能夠看到,只有自身節點的信息。
要讓本身加入集羣,能夠運行如下命令(假設:其它3個節點,都加入10.0.xx.205)
consul join 10.0.xx.205
成功後,會輸出:
Successfully joined cluster by contacting 1 nodes.
其它2個節點(指:10.0.xx.205以外的節點)上相似上述操做,都加入集羣中,完成後,能夠再次驗證
能夠看到4臺節點的信息都有了。
tips: 若是反過來,要將1個節點從集羣中撤掉,能夠在該節點上運行consul leave 便可。
搭建好conusl集羣后,用戶或者程序就能到consul中去查詢或者註冊服務。
能夠經過提供服務定義文件或者調用HTTP API來註冊一個服務。
1.服務定義文件
在10.0.xx.205的/etc/consul.d/目錄下建立一個web.json文件,內容以下:
{ "ID": "nginx1", "Name": "nginx", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 80, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": 「12h", "HTTP": "http://localhost:5000/health", "Interval": "1s" } }
2.調用HTTP API
postman(或其它rest api工具、curl都行),向 http://10.0.xx.205:8500/v1/agent/service/register ,發送如下json,http method指定爲PUT, Content-Type指定爲application/json
{ "ID": "nginx1", "Name": "nginx", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 80, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": 「12h", "HTTP": "http://localhost:5000/health", "Interval": "1s" } }
簡單羅列了一下最經常使用的命令和接口api。 1. consul以client和server形式啓動 server: nohup /consul/consul agent -ui -config-dir=/consul/config 1>/consul/consul.log 2>&1 & 在/consul/config文件中可指定bind_addr爲192.168.0.100, server屬性爲true client: nohup /consul/consul agent -ui -config-dir=/consul/config -join=192.168.0.100 > /consul/consul.log 2>&1 & 2. 列出服務: curl http://localhost:8500/v1/agent/members 3. 添加服務 curl --request PUT --data @test.json http://localhost:8500/v1/agent/service/register test.json文件內容: { "ID": "nginx1", "Name": "nginx", "Tags": [ "primary", "v1" ], "Address": "127.0.0.1", "Port": 80, "EnableTagOverride": false, "Check": { "DeregisterCriticalServiceAfter": 「12h", "HTTP": "http://localhost:5000/health", "Interval": "1s" } } HTTP + Interval 是其中一種健康檢查方式,這一檢查默認每30秒向特定url發送一個http get請求,返回碼是2XX則表示檢查經過,返回429則警告請求數太多,其餘則表示失敗。 4. 刪除服務: curl --request PUT http://localhost:8500/v1/agent/service/deregister/nginx1 5. 訪問發現服務:dns查詢 dig安裝 yum install bind-utils dns發現服務: dig @127.0.0.1 -p 8600 servicename.service.consul DNS查詢系統經過健康檢查信息防止路由到不健康的節點,當查詢完成時,任何在檢查中失敗的節點都會在結果中被忽略,爲了簡單的負載均衡,每次返回的節點集也是隨機的 6. checks健康檢查 curl http://localhost:8500/v1/agent/checks 設置此check的狀態爲passing: curl http://localhost:8500/v1/agent/check/pass/nginx1 7. 配置查看 curl http://localhost:8500/v1/kv/commons/test/config?raw
refer:
https://cloud.tencent.com/developer/article/1033169
https://www.cnblogs.com/yjmyzz/p/replace-eureka-with-consul.html