微服務 consul使用

 

前言html

常見的註冊中心有zookeeper 、eureka、consul、etcd。
從生態發展、便利性、語言無關性等角度來綜合考量,選擇consul,多數據中心支持,支持k-v能力,可擴展爲配置中心。
github地址:https://github.com/hashicorp/consul
consul官網:https://learn.hashicorp.com/consulnode

consul特性

consul是分佈式的、高可用、橫向擴展的。consul提供的一些關鍵特性:linux

  • service discovery:consul經過DNS或者HTTP接口使服務註冊和服務發現變的很容易,一些外部服務,例如saas提供的也能夠同樣註冊。
  • health checking:健康檢測使consul能夠快速的告警在集羣中的操做。和服務發現的集成,能夠防止服務轉發到故障的服務上面。
  • key/value storage:一個用來存儲動態配置的系統。提供簡單的HTTP接口,能夠在任何地方操做。
  • multi-datacenter:無需複雜的配置,便可支持任意數量的區域。

 

Consul架構

Consul的微服務通常都是集羣,集羣由一個個的Consul節點組成,在這些Consul節點裏面,分爲兩種角色,Server 以及 Client。
consul節點在啓動時能夠定義自身角色,client、server兩種。
client節點只負責轉發外部請求,全部註冊到當前節點的服務會被轉發到server節點,向server節點進行鍵值對的讀/寫,自己是不持久化這些信息,是無狀態的;
server節點的職責是使用raft協議保證數據一致性,響應客戶端的請求,維護集羣狀態,與其餘數據中心交互,另外全部的信息持久化到本地,這樣遇到故障,信息是能夠被保留的。
節點之間經過gossip廣播協議(謠言協議),進行節點之間的數據交互,最終你們達到一致。nginx

consul概念git

  • Agent: Consul集羣中長時間運行的守護進程,以consul agent 命令開始啓動. 在客戶端和服務端模式下均可以運行,能夠運行DNS或者HTTP接口, 它的主要做用是運行時檢查和保持服務同步。
  • Client: 客戶端, 無狀態, 以一個極小的消耗將接口請求轉發給局域網內的服務端集羣.
  • Server: 服務端, 保存配置信息, 高可用集羣, 在局域網內與本地客戶端通信, 經過廣域網與其餘數據中心通信. 每一個數據中心的 server 數量推薦爲 3 個或是 5 個.
  • Datacenter: 數據中心,多數據中心聯合工做保證數據存儲安全快捷
  • Consensus: 一致性協議使用的是Raft Protocol
  • RPC: 遠程程序通訊
  • Gossip: 基於 Serf 實現的 gossip 協議,負責成員、失敗探測、事件廣播等。經過 UDP 實現各個節點之間的消息。分爲 LAN 上的和 WAN 上的兩種情形。

 

consul安裝及測試安裝

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

  • 節點名稱:這是代理的惟一名稱。默認狀況下,這是機器的主機名,但您可使用該-node標誌對其進行自定義 。 
  • 數據中心:這是配置代理運行的數據中心。每一個節點都必須設置其它向數據中心報告。-datacenter 標誌可用於設置數據中心。對於單DC配置,代理將默認爲「dc1」。 
  • 服務器:這代表代理是以服務器仍是客戶端模式運行。Server: false (bootstrap: false),表示不是以服務器模式運行,事實上-dev是開發服務器模式。 
  • 客戶端地址:這是用於代理的客戶端接口的地址。這包括HTTP和DNS接口的端口。默認狀況下,它只綁定到localhost。 
  • 羣集地址:這是用於集羣中的Consul代理之間通訊的地址和端口集。並不是全部集羣中的Consul代理都必須使用相同的端口,但該地址必須可供全部其餘節點訪問。
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已經失效
consul agent經常使用命令解讀

 

Consul集羣

節點或五個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
最經常使用的命令和接口api

 

refer:

https://cloud.tencent.com/developer/article/1033169

https://www.cnblogs.com/yjmyzz/p/replace-eureka-with-consul.html

相關文章
相關標籤/搜索