Consul架構


Consul架構

微服務 consul使用

 

 

前言

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

consul特性

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

  • 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廣播協議(謠言協議),進行節點之間的數據交互,最終大家達到一致。

consul概念

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

 

consul安裝及測試安裝

linux下安裝

(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)驗證是否安裝成功$ consul

window下安裝

(1)進入consul官網找到自己開發平台對應的安裝包下載https://www.consul.io/downloads.html
(2)下載完后,解壓,得到一個可執行文件consul
(3)將這個文件移動到全局變量環境中

(4)啟動consul命令:

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常用命令解讀

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集群

節點或五個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.55、10.0.xx.203、10.0.xx.204、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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
    "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。

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

 
分類:  Microservices


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM