Introduction to Consul

Consul簡介

歡迎來到Consul介紹指南!本指南是開始瞭解Consul的最佳場所。它涵蓋了Consul是什麼,可以解決什麼問題,和現有的軟件有那些差異,以及如何開始使用它。
如果您熟悉Consul的基礎知識,訪問該文檔瞭解更詳細的可用功能參考。

Consul是什麼?

Consul有多個組件,但是整體來看,它是你基礎設施中用於發現和配置服務的一個工具。它提供如下幾個關鍵功能:

  • 服務發現: Consul的客戶端可以提供一個服務,例如api或者mysql,其它客戶端可以使用Consul去發現這個服務的提供者(即該consul-client)。使用DNS或者HTTP,應用程序可以輕鬆找到所依賴的服務。
  • 健康檢查: Consul客戶端可以提供一些健康檢查,這些健康檢查可以關聯到一個指定的服務(Web服務是否返回200 OK),也可以關聯到本地節點(內存使用率是否在90%以下)。操作員可以使用此信息來監視集羣健康狀況,並由服務發現組件路由用來遠離不健康的主機。
  • 鍵值存儲: 應用程序可以使用Consul的分層鍵/值存儲,用於一些目的, 包括動態配置、特徵標記、協作、leader選舉等等。通過一個簡單的HTTP API可以很容易的使用這個組件。
  • 多數據中心: Consul對多數據中心有非常好的支持,這意味着Consul用戶不必擔心由於創建更多抽象層而產生的多個區域。

Consul旨在對DevOps社區和應用程序開發人員友好,使其成爲現代的、可伸縮基礎設施的完美選擇。

Consul的基礎架構

Consul是一個分佈式、高可用的系統。本節將介紹基礎知識,故意省略了一些不需要的細節,這樣您可以快速的理解Consul是怎樣工作的。對於更多細節,請參閱深入的架構概述

向Consul提供服務的每個節點都會運行一個Agent。發現其他服務或獲取/設置鍵值數據不需要運行AgentAgent負責對節點和節點本身的服務進行健康檢查。

Agent與一個或多個Consul Server進行通信,Consul Server會進行數據的存儲,多個Server之間會進行復制。Server們會選舉一個Leader。雖然一個Server也可以完成Consul的功能,但是爲了避免單節點失敗導致的數據丟失,建議使用3-5個Server;並且推薦每個數據中心都有一個Consul的集羣。

需要發現其他服務或節點的基礎架構組件可以查詢到任何Consul Server或任何Consul Agent。Agent會自動向Server轉發查詢。

每個數據中心運行一個Consul Server的集羣。當作出一個跨數據中心的服務發現或配置請求時,本地的Consul Server直接轉發請求到遠程數據中心並返回結果。

下一步

比較Consul和其它軟件,以評估它如何融合到您現有的基礎設施。

然後繼續入門指南,讓Consul運行起來。

Consul與其它軟件對比

Consul解決的問題有多個,但是每一個單個的問題都已經被許多不同的系統解決。雖然沒有一個單個的系統提供Consul的所有功能,但是有其它選擇來解決其中的部分問題。

這一節我們將比較Consul和其它軟件選擇。在大多數情況下,Consul和其它系統並不是互斥的。

CONSUL VS. ZOOKEEPER, DOOZERD, ETCD

參考閱讀

CONSUL VS. CHEF, PUPPET, ETC.

參考閱讀

CONSUL VS. NAGIOS, SENSU.

參考閱讀

CONSUL VS. SKYDNS.

參考閱讀

CONSUL VS. SMARTSTACK.

參考閱讀

CONSUL VS. SERF.

參考閱讀

CONSUL VS. CUSTOM SOLUTIONS.

參考閱讀

快速開始

安裝Consul

Consul必須首先安裝在您的機器上。Consul爲所有支持的平臺和架構分發一個二進制包
本頁面將不介紹如何從源代碼編譯Consul,但是從源代碼編譯中可以看到那些想要確保他們將信任的源編譯爲最終二進制文件的文檔。

開始安裝

要安裝Consul,首先找到適合你的操作系統的,並下載它。Consul被打包成一個zip文檔。

下載Consul完畢後,解壓壓縮包。Consul作爲一個名爲consul的二進制文件運行。包中的任何其他文件都可以安全刪除,Consul仍然可以使用。

最後一步是確保Consul二進制文件在PATH上可用。
有關在Linux和Mac上設置PATH的說明,請參閱此頁面。在Windows上設置PATH的說明,請參閱此頁面

在Unix系統,~/bin/usr/local/bin是常見的安裝目錄,這取決於你想限制安裝只對單一用戶還是面向整個系統。在Windows系統,你可以把它放在任何你想放的地方,只要這個位置在%PATH%變量中。

驗證安裝

安裝Consul完畢之後,驗證安裝工作可以通過打開一個新的終端會話來檢查Consul是否可用。通過執行consul命令你應該可以看到類似於下面這樣的幫助輸出:

$ consul
usage: consul [--version] [--help] <command> [<args>]

Available commands are:
    agent          Runs a Consul agent
    event          Fire a new event

# ...

如果您看到無法找到consul的錯誤,則您的PATH環境變量未正確設置。請返回並確保您的PATH變量包含安裝Consul的目錄。

運行Consul Agent

Consul安裝完畢之後,Agent必須運行。Agent可以運行在Server或者Client模式。每一個數據中心至少要有一個Server,不過一個集羣推薦要有3-5個Server。非常不鼓勵單個服務器部署,因爲在故障情況下數據丟失是不可避免的。

所有其它的Agent運行在Client模式,一個Client是一個非常輕量級的進程,用來註冊服務,運行健康檢查,以及轉發查詢到Server。Agent必須運行在集羣中的每一個節點。

有關啓動數據中心的更多詳細信息,請參閱本指南

啓動Agent

最簡單地,我們先以開發模式來啓動Consul Agent。這個模式對於快速容易的創建一個單一節點的Consul環境很有用。不過,不要打算在生產環境這樣使用,因爲它不會持久化任何狀態。

-$ consul agent -dev
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
           Version: 'v0.7.0'
         Node name: 'Armons-MacBook-Air'
        Datacenter: 'dc1'
            Server: true (bootstrap: false)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

    2016/09/15 10:21:10 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:127.0.0.1:8300 Address:127.0.0.1:8300}]
    2016/09/15 10:21:10 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
    2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air 127.0.0.1
    2016/09/15 10:21:10 [INFO] serf: EventMemberJoin: Armons-MacBook-Air.dc1 127.0.0.1
    2016/09/15 10:21:10 [INFO] consul: Adding LAN server Armons-MacBook-Air (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2016/09/15 10:21:10 [INFO] consul: Adding WAN server Armons-MacBook-Air.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)
    2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (180.708µs) from=127.0.0.1:52369
    2016/09/15 10:21:13 [DEBUG] http: Request GET /v1/agent/services (15.548µs) from=127.0.0.1:52369
    2016/09/15 10:21:17 [WARN] raft: Heartbeat timeout from "" reached, starting election
    2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
    2016/09/15 10:21:17 [DEBUG] raft: Votes needed: 1
    2016/09/15 10:21:17 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 1
    2016/09/15 10:21:17 [INFO] raft: Election won. Tally: 1
    2016/09/15 10:21:17 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
    2016/09/15 10:21:17 [INFO] consul: cluster leadership acquired
    2016/09/15 10:21:17 [DEBUG] consul: reset tombstone GC to index 3
    2016/09/15 10:21:17 [INFO] consul: New leader elected: Armons-MacBook-Air
    2016/09/15 10:21:17 [INFO] consul: member 'Armons-MacBook-Air' joined, marking health alive
    2016/09/15 10:21:17 [INFO] agent: Synced service 'consul'

您可以看到,Consul Agent已經啓動並輸出了一些日誌數據。從日誌數據中,您可以看到我們的Agent正在以服務器模式運行,並且聲明爲集羣中的Leader身份。此外,本地成員已被標記爲集羣的一個健康成員。

提示OS X用戶:Consul使用你的主機名作爲默認的節點名稱,如果你的主機名是有周期的(比如DHCP自動分配主機名),使用Consul對這個節點的DNS查詢將不能工作。爲了避免這個問題,請使用-node參數明確的設置你的節點的名稱。

集羣成員

如果您在另一個終端運行consul members,您可以看到Consul集羣的成員。我們將在下一節中介紹如何加入集羣,但現在集羣中只應該看到一個成員(你自己):

$ consul members
Node                Address            Status  Type    Build     Protocol  DC
Armons-MacBook-Air  172.20.20.11:8301  alive   server  0.6.1dev  2         dc1

輸出只有我們自己的節點,它正在運行的地址,它的健康狀態,它的集羣角色,以及一些版本信息。此外元數據可以通過提供的-detailed參數來查看。

memebrs命令的輸出基於流言協議,是最終一致的。因此,在某個時間點,您的本地Agent所看到的世界視圖可能與服務器上的狀態不完全匹配。要獲得一個強一致性的世界視圖,使用HTTP API,它會轉發請求到Consul Server:

$ curl localhost:8500/v1/catalog/nodes
[{"Node":"Armons-MacBook-Air","Address":"127.0.0.1","TaggedAddresses":{"lan":"127.0.0.1","wan":"127.0.0.1"},"CreateIndex":4,"ModifyIndex":110}]

除了HTTP API,DNS接口也可以用來查詢節點。你需要確保你的DNS查詢指向Consul Agent的DNS服務器,它默認運行在8600端口。DNS條目的格式(例如“Armons-MacBook-Air.node.consul”)將在後邊進行詳細介紹。

$ dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul
...

;; QUESTION SECTION:
;Armons-MacBook-Air.node.consul.    IN  A

;; ANSWER SECTION:
Armons-MacBook-Air.node.consul. 0 IN    A   127.0.0.1

停止Agent

你可以使用Ctrl-C(中斷信號)來優雅的中止Agent的運行。在中斷Agent以後,你可以看到它離開了集羣並且已關閉。

通過優雅地離開,Consul通知其它的集羣成員這個節點離開了。如果你強制殺死Agent進程,集羣中的其它成員會檢測到節點失敗了。當一個成員離開,它的服務和檢查將會從登記目錄中移除。當一個成員失敗,它的健康狀態會簡單的標記爲critical,但是它不會被從登記目錄中移除。Consul將會自動重新連接失敗的節點,允許它從一定的網絡狀態下恢復回來,而離開的節點將不會再進行聯繫。

此外,如果Agent作爲Server運行,優雅地離開是很重要的,可以避免因影響一致性協議導致的可能的可用性中斷。對於怎樣安全的添加和移除Server,請看指引章節瞭解詳細情況。

註冊服務

在上一步中,我們運行了我們的第一個代理,看到了羣集成員,並查詢了該節點。在本指南中,我們將註冊我們的第一個服務並查詢該服務。

定義服務

可以通過提供服務定義或通過對HTTP API進行適當的調用來註冊服務。

服務定義是註冊服務的最常見方式,我們將在這一步使用這個方法。我們將基於上一步中介紹的Agent配置中來構建它。

首先,爲Consul配置創建一個目錄,Consul會從此目錄中加載所有的配置文件。在Unix系統中一個通用的目錄命名約定類似於這樣:/etc/consul.d(後綴.d表明這個目錄包含一組配置文件)。

$ sudo mkdir /etc/consul.d

下一步,我們將編寫一個服務定義配置文件。我們假設有一個叫做“web”的服務運行在80端口。此外,我們會給這個服務一個標籤,我們可以使用它作爲查詢服務的附加方式:

$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
    | sudo tee /etc/consul.d/web.json

現在,重啓Agent,並提供配置目錄:

$ consul agent -dev -config-dir=/etc/consul.d
==> Starting Consul agent...
...
    [INFO] agent: Synced service 'web'
...

你會注意到輸出中Agent已經**Synced**Web服務。這意味着Agent已經從配置文件中加載了服務定義,並且已經成功的註冊到服務條目。

如果你想註冊多個服務,你可以在Consul配置目錄中創建多個服務定義文件。

查詢服務

一旦Agent啓動並且服務被同步,我們就可以使用DNS或者HTTP API的方式來查詢服務。

DNS API

首先使用DNS接口來查詢我們的服務。對於DNS接口,服務的DNS名稱是NAME.service.consul。默認情況下,所有的DNS名稱都在consul命名空間下,當然這也是可配置的。子域名service告訴Consul我們正在查詢服務,然後NAME是服務的名字。

對於我們註冊的服務,這些約定和設置產出一個完全合格的域名:web.service.consul。

$ dig @127.0.0.1 -p 8600 web.service.consul
...

;; QUESTION SECTION:
;web.service.consul.        IN  A

;; ANSWER SECTION:
web.service.consul. 0   IN  A   172.20.20.11

正如你看到的,一個A記錄返回,帶着服務可用節點的IP地址。A記錄只能保存IP地址。

您還可以使用DNS API將整個地址/端口對作爲SRV記錄檢索:

$ dig @127.0.0.1 -p 8600 web.service.consul SRV
...

;; QUESTION SECTION:
;web.service.consul.        IN  SRV

;; ANSWER SECTION:
web.service.consul. 0   IN  SRV 1 1 80 Armons-MacBook-Air.node.dc1.consul.

;; ADDITIONAL SECTION:
Armons-MacBook-Air.node.dc1.consul. 0 IN A  172.20.20.11

SVR記錄告訴我們web服務運行在80端口,並且存在於節點Armons-MacBook-Air.node.dc1.consul.之上。一個附加的部分被DNS返回,包含這個節點的A記錄。

最後,我們還可以在使用DNS接口時通過標籤來過濾服務。基於標籤的服務查詢格式是:TAG.NAME.service.consul。在下邊的例子中,我們請求Consul提供具有”rails”標籤的所有Web服務。我們會得到一個成功的響應,因爲我們已經使用這個標籤註冊了我們的服務:

$ dig @127.0.0.1 -p 8600 rails.web.service.consul
...

;; QUESTION SECTION:
;rails.web.service.consul.      IN  A

;; ANSWER SECTION:
rails.web.service.consul.   0   IN  A   172.20.20.11

HTTP API

除了API API之外,還可以使用HTTP API來查詢服務:

$ curl http://localhost:8500/v1/catalog/service/web
[{"Node":"Armons-MacBook-Air","Address":"172.20.20.11","ServiceID":"web", \
    "ServiceName":"web","ServiceTags":["rails"],"ServicePort":80}]

接口catelog返回指定服務的所有宿主節點。但是你通常只想要獲取到通過健康檢查的健康實例。這也正是DNS正在做的事情。下邊將只查詢健康的實例:

$ curl 'http://localhost:8500/v1/health/service/web?passing'
[{"Node":"Armons-MacBook-Air","Address":"172.20.20.11","Service":{ \
    "ID":"web", "Service":"web", "Tags":["rails"],"Port":80}, "Checks": ...}]

更新服務

可以通過更改配置文件,然後發送一個SIGHUP給Agent,來更新服務定義。這樣可以更新服務,而無需停機或服務查詢不可用。

此外,Http接口還可以動態的添加、移除和修改服務。

Consul集羣

我們已經啓動了第一個Agent,並且在這個Agent上註冊和查詢了一個服務。這已經顯示出使用Consul是相當的容易,但是還沒有展現出這如何擴展爲一個可伸縮的、生產級的服務發現基礎設施。在這一步,我們將使用多個成員創建第一個真正的集羣。

當一個Consul Agent啓動後,它沒有任何其它節點的知識:它是一個孤立的集羣。想了解其它的集羣成員,Agent必須加入一個已經存在的集羣。要加入已經存在的集羣,它只需要知道一個已經存在的成員。Agent加入後,它將通過流言協議和這個成員進行交流,並很快的發現集羣中的其它成員。Consul Agent可以加入任何一個其它的Agent,不只是Server模式的Agent。

啓動Agent

爲了模擬一個更真實的集羣,我們將通過Vagrant啓動一個有兩個節點的集羣。我們使用的Vagrantfile可以在Consul源碼庫的示例章節找到。

我們首先啓動我們的兩個節點:

$ vagrant up

一旦系統可用了,我們可以SSH進入他們,以開始對我們的集羣進行配置。我們首先登錄到第一個節點:

$ vagrant ssh n1

在前面的例子中,我們使用-dev標誌來快速設置開發服務器。但是,這不足以在集羣環境中使用。從現在起我們將不再使用-dev參數,取而代之的是下邊列出的集羣參數。

集羣中的每個節點必須要有一個唯一的名字。默認情況下,Consul使用機器的主機名,但是我們可以通過使用-node命令行選項來手動的設置它。

我們將指定一個綁定地址:這是Consul的監聽地址,它必須可以被集羣中的其它所有節點訪問。雖然綁定地址不是絕對必要的,但最好總是提供一個。Consul將默認嘗試在系統上的所有IPv4接口上偵聽,但如果找到多個專用IP,則拋出錯誤無法啓動。生產服務器通常有多個接口,所以指定一個綁定地址可以確保你沒有綁定Consul到一個錯誤的接口。

第一個節點將作爲我們在該集羣中的唯一服務器,並且我們將使用server開關來標識它。

-bootstrap-expect參數告訴Consul Server預定將要加入的其它服務節點的數量。這個參數的目的是延遲複製日誌的啓動直到預期數量的Server節點已經成功加入。你可以在bootstrapping指南瞭解更多關於這個的內容。

最後,我們添加一個config-dir參數,標識可以在哪裏找到服務和檢查的定義。

這些設置集合起來將產生一個consul agent命令,像這樣:

vagrant@n1:~$ consul agent -server -bootstrap-expect=1 \
    -data-dir=/tmp/consul -node=agent-one -bind=172.20.20.10 \
    -config-dir=/etc/consul.d
...

現在,使用另一個終端,我們可以連接到第二個節點:

$ vagrant ssh n2

這次,我們設置綁定地址切換到匹配第二個節點的IP(Vagrantfile指定的),並且這個節點名字agent-two。因爲這個節點將不是一個Consul Server,所以我們不需要提供server開關

這些設置集合起來將產生一個consul agent命令,像這樣:

vagrant@n2:~$ consul agent -data-dir=/tmp/consul -node=agent-two \
    -bind=172.20.20.11 -config-dir=/etc/consul.d
...

在這個節點,你已經有兩個Consul Agent在運行:一個Server和一個Client。這兩個Agent仍舊相互不知,只是他們各自單節點集羣的一部分。你可以通過在每個Agent上運行consul members命令來進行驗證,並注意到對每個Agent只有一個成員可見。

加入集羣

現在,我們將告訴第一個Agent來加入第二個Agent,通過在一個新的終端運行如下的命令:

$ vagrant ssh n1
...
vagrant@n1:~$ consul join 172.20.20.11
Successfully joined cluster by contacting 1 nodes.

你應該在每個Agent日誌中看到一些日誌輸出,如果你細心閱讀,你將會看到他們收到join的一些信息。如果你在每個Agent運行consul members命令,你將會看到所有節點現在是互知的了:

vagrant@n2:~$ consul members
Node       Address            Status  Type    Build  Protocol
agent-two  172.20.20.11:8301  alive   client  0.5.0  2
agent-one  172.20.20.10:8301  alive   server  0.5.0  2

記住:要加入一個集羣,Consul agent只需要知道一個已經存在的成員。加入集羣后,這個Agent將和其它節點聊天來傳播完整的成員信息。

啓動時自動加入集羣

理想情況下,無論何時在數據中心內建立新節點,它都應自動加入Consul集羣而無需人爲干預。Consul通過啓用自動發現AWS或Google Cloud中的實例並使用給定的標記鍵/值來實現自動加入。要使用集成,請將retry_join_ec2retry_join_gce嵌套對象添加到您的Consul配置文件中,這將允許新節點加入羣集而無需任何硬編碼配置。或者,您可以在啓動時使用-join標誌start_join設置加入其他已知consul agents的硬編碼地址。

查詢節點

就像查詢服務,Consul有一個API來查詢節點。你可以通過DNS或者HTTP API來幹這件事。

對於DNS API,名稱的結構是NAME.node.consulNAME.node.DATACENTER.consul。如果省略datacenter,Consul只會搜索本地數據中心。

舉個例子,在“agent-one”,我們可以查詢節點“agent-two”的地址:

vagrant@n1:~$ dig @127.0.0.1 -p 8600 agent-two.node.consul
...

;; QUESTION SECTION:
;agent-two.node.consul. IN  A

;; ANSWER SECTION:
agent-two.node.consul.  0 IN    A   172.20.20.11

除了服務查找之外,查找節點的能力對於系統管理任務來說非常有用。例如,知道該節點的地址進行SSH登入將像標記該節點作爲Consul集羣的一部分並查詢它一樣容易。

離開集羣

要離開集羣,你既可以優雅地退出一個Agent(使用Ctrl-C),也可以強制殺死一個Agent。優雅地離開允許節點轉變爲離開狀態;否則,其他節點會將其檢測爲失敗狀態。這兩點不同的詳細介紹在這裏

健康檢查

我們現在已經看到運行Consul、添加節點和服務,以及查詢這些節點和服務是如此的簡單。這一章,我們將通過爲節點和服務添加健康檢查來繼續我們的旅程。健康檢查對於服務發現是一個關鍵的組件,它可以防止使用不健康的服務。

這一步建立在之前創建的Consul集羣上。因此,你應該有一個包含兩個節點的集羣在運行。

定義健康檢查

和服務類似,一個檢查可以通過提供一個檢查定義來註冊,還可以通過調用適當的HTTP API來註冊。

我們將使用檢查定義的方法,就像服務,定義的方法是設置檢查的最常用方式。

在第二個節點的Consul配置目錄中創建兩個定義文件:

vagrant@n2:~$ echo '{"check": {"name": "ping",
  "script": "ping -c1 google.com >/dev/null", "interval": "30s"}}' \
  >/etc/consul.d/ping.json

vagrant@n2:~$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80,
  "check": {"script": "curl localhost >/dev/null 2>&1", "interval": "10s"}}}' \
  >/etc/consul.d/web.json

第一個定義添加了一個名字爲“ping”的主機級別的檢查。這個檢查每隔30秒運行一次,調用ping -c1 google.com。在基於腳本的健康狀況檢查中,檢查使用和啓動Consul進程相同的用戶進行運行。如果這個命令返回一個非零退出代碼,這個節點將被標記爲不健康的。對於基於腳本的健康檢查,這是約定。

第二個命令修改名爲”web”的服務,添加一個檢查,每10秒鐘通過curl發送請求,以驗證Web服務器是否可訪問。與主機級運行狀況檢查一樣,如果腳本以非零退出代碼退出,則該服務將被標記爲不健康。

現在,重啓第二個Agent或者發送一個SIGHUP信號。你應該可以看到如下的日誌行:

==> Starting Consul agent...
...
    [INFO] agent: Synced service 'web'
    [INFO] agent: Synced check 'service:web'
    [INFO] agent: Synced check 'ping'
    [WARN] Check 'service:web' is now critical

前幾行表明Agent已經同步了新的定義。最後一行表明我們添加的web服務是critical狀態。這是因爲我們實際沒有運行Web服務,所以curl測試是失敗的。

檢查健康狀態

現在我們添加了一些簡單的檢查,我們可以使用HTTP API來檢查它們。首先,我們可以使用此命令查找任何失敗的檢查(注意,這可以在任一節點上運行):

vagrant@n1:~$ curl http://localhost:8500/v1/health/state/critical
[{"Node":"agent-two","CheckID":"service:web","Name":"Service 'web' check","Status":"critical","Notes":"","ServiceID":"web","ServiceName":"web"}]

我們可以看到只有一個檢查,我們的web服務檢查處於critical狀態。

此外,我們可以嘗試使用DNS查詢Web服務。Consul將不會返回任何結果,因爲服務是不健康的:

dig @127.0.0.1 -p 8600 web.service.consul
...

;; QUESTION SECTION:
;web.service.consul.        IN  A

在這個章節,你已經瞭解到添加健康檢查是如何的容易。檢查定義可以通過更改配置文件和對Agent發送SIGUP來進行更新。此外,HTTP API可以動態的用來添加、移除,以及修改檢查。該API還允許一個“死人開關”,一個基於TTL的檢查。TTL檢查可以使Consul更緊密的集成到一個應用,使業務邏輯評估成爲檢查狀態評定的一部分。

鍵值存儲

Consul除提供服務發現和綜合健康檢查外,還提供易於使用的鍵值存儲。這可以用於保持動態配置,協助服務協調,建立領導者選舉,以及開發人員想構建的任何其他內容。此步驟假定您至少有一名Consul Agent已經在運行。

簡單用法

爲了展示使用它是如何的簡單,我們將在鍵值存儲中處理一些Keys。有兩種方式可以與Consul KV存儲進行交互:通過HTTP API和Consul KV CLI進行交互。
以下示例顯示使用Consul KV CLI,因爲它是最容易入手的。對於更高級的集成,您可能需要使用Consul KV HTTP API

首先讓我們探索KV存儲。我們可以向Consul詢問名爲redis/config/minconns的key所對應的值:

$ consul kv get redis/config/minconns
Error! No key exists at: redis/config/minconns

如您所見,我們沒有得到任何結果,這是正確的,因爲目前KV存儲中沒有任何數據。接下來我們可以在KV存儲中”put”一些示例Keys。

$ consul kv put redis/config/minconns 1
Success! Data written to: redis/config/minconns

$ consul kv put redis/config/maxconns 25
Success! Data written to: redis/config/maxconns

$ consul kv put -flags=42 redis/config/users/admin abcd1234
Success! Data written to: redis/config/users/admin

現在我們可以查詢各個鍵的值:

$ consul kv get redis/config/minconns
1

Consul保留有關該字段的其他元數據,該元數據可使用-detailed標誌檢索:

$ consul kv get -detailed redis/config/minconns
CreateIndex      207
Flags            0
Key              redis/config/minconns
LockIndex        0
ModifyIndex      207
Session          -
Value            1

對於鍵“redis/config/users/admin”,我們設置了一個值爲42的標誌。所有鍵都支持設置一個64位整數標誌值。這不是由Consul內部使用,客戶端可以使用它來向任何KV添加有意義的元數據。

可以使用recurse選項列出KV存儲中的所有鍵。結果將以字典順序返回:

$ consul kv get -recurse
redis/config/maxconns:25
redis/config/minconns:1
redis/config/users/admin:abcd1234

要從Consul KV存儲刪除一個key,可通過發出”delete”請求來完成:

$ consul kv delete redis/config/minconns
Success! Deleted key: redis/config/minconns

也可以使用recurse選項遞歸刪除包含指定前綴的所有鍵:

$ consul kv delete -recurse redis
Success! Deleted keys with prefix: redis

要更新現有key的值,請在同一路徑上”put”新值:

$ consul kv put foo bar

$ consul kv get foo
bar

$ consul kv put foo zip

$ consul kv get foo
zip

Consul可以使用Check-And-Set操作提供原子key更新。要執行CAS操作,請指定-cas標誌:

$ consul kv put -cas -modify-index=123 foo bar
Success! Data written to: foo

$ consul kv put -cas -modify-index=123 foo bar
Error! Did not write to foo: CAS failed

在這個例子中,第一個CAS更新成功,因爲modify-index的值是123。然後第二次操作失敗,因爲modify-index的值不再是123。

這些只是API支持的幾個例子。有關完整的文檔,請參閱Consul KV HTTP APIConsul KV CLI文檔。

Web界面

Consul自帶一個漂亮的、多種功能的Web用戶界面。用戶界面可以用來瀏覽所有的服務和節點,瀏覽所有的健康檢查和他們的最新狀態,以及讀寫鍵值數據。用戶界面還自動支持多數據中心。

Consul Web UI

要設置自宿主用戶界面,啓動Consul agent時使用-ui參數。

$ consul agent -ui
...

用戶界面使用與Agent HTTP API相同的端口,在ui/路徑下。默認地址是http://localhost:8500/ui

你可以點擊這裏查看一個活生生的例子。

瞭解更多關於如何繼續Consul旅程信息, 請移步到下一步

參考鏈接: Introduction to Consul & Consul中文翻譯計劃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章