使用Consul解決了哪些問題:
- 是否在為不同環境來維護不同專案配置而發愁
- 是否有因為配置的更改,導致程式碼還要進行修改、釋出,因為客流量大了還要規避開高峰期等到半夜來發布
- 微服務架構下,應用的分解,業務系統與服務系統之間的呼叫管理
以上只是列舉的筆者曾經遇到的幾點問題,當然問題還不止於這些,下面介紹的Consul可以有效解決這些問題,當然還有一些其它的優點,讓我們一起期待下文的Consul的講解。
Consul的四大核心特性:
服務發現:
可以方便的實現服務註冊,通過DNS或者HTTP應用程式可以很容易的找到他所依賴的服務.Key/Value儲存:
使用Key/Value進行資料儲存。多資料中心:
Consul支援開箱即用的多資料中心。這意味著使用者不需要擔心建立額外的抽象層讓業務擴充套件到多個區域健康檢查:
可以對指定服務進行健康檢查例如,Response Status是否為200,避免將流量轉發到不健康的服務上。
Consul架構
圖片來自官網 Consul Architecture
上圖很好的展示了Consul對於多資料中心的支援,另外在兩個資料中心之間只有Service層可以相互通訊。
Consul是一個分散式高可用的系統,一個發現和配置服務的工具。客戶端可以利用它提供的API註冊和發現服務,及監控檢測功能實現服務的高可用,深入的架構描述具體細節,可以參考官網Consul Architecture,下面開始進入實戰操作部分。
安裝部署
本處主要以linux來講解,其他操作平臺見官網Download Consul
下載 wget https://releases.hashicorp.com/consul/1.4.0/consul_1.4.0_linux_amd64.zip
解壓 unzip consul_1.4.0_linux_amd64.zip
得到目錄consul
複製 consul
到你的系統的任何一個地方,如果你想使用命令列直接訪問,確保複製的目錄在你的PATH裡 cp consul /usr/local/bin/
驗證consul是否安裝成功,出現以下視窗則安裝成功
[root@iZbp1isjfk2rw8fpnxx8wgZ ~]# consul
Usage: consul [--version] [--help] <command> [<args>]
Available commands are:
acl Interact with Consul's ACLs
agent Runs a Consul agent
catalog Interact with the catalog
connect Interact with Consul Connect
debug Records a debugging archive for operators
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators.
intention Interact with Connect service intentions
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
kv Interact with the key-value store
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
operator Provides cluster-level tools for Consul operators
reload Triggers the agent to reload configuration files
rtt Estimates network round trip time between nodes
services Interact with services
snapshot Saves, restores and inspects snapshots of Consul server state
validate Validate config files/directories
version Prints the Consul version
watch Watch for changes in Consul
複製程式碼
Consul Agent
執行consul agent -dev
,啟動開發模式,這個模式會快速啟動一個單節點的Consul。注意,這個模式不能資料持久化,因此,不能用於生產環境
啟動命令簡介:
-server
:定義agent執行在server模式,每個資料中心的Server建議在3~5個避免失敗情況下資料的丟失-client
:定義agent執行在client模式-bootstrap-expect
:在一個datacenter中期望提供的server節點數目,當該值提供的時候,consul一直等到達到指定sever數目的時候才會引導整個叢集-bind
:節點的ip地址一般是0.0.0.0
或雲服務內網地址,用於被叢集中的其他節點所訪問-node
:指定節點在叢集中的唯一名稱,預設為機器的hostname-config-dir
:配置檔案目錄,裡面所有以.json結尾的檔案都會被載入- 更多可選引數參考Consul Command-line Options
Start Agent
[root@iZbp1isjfk2rw8fpnxx8wgZ ~]# consul agent -dev
==> Starting Consul agent...
==> Consul agent running!
Version: 'v1.4.0'
Node ID: '9e05f4d6-56c1-e57c-c726-15d9ab1c0dd5'
Node name: 'iZbp1isjfk2rw8fpnxx8wgZ'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false
==> Log data will now stream in as it occurs:
複製程式碼
看下 consul agent 輸出的幾個重要資訊:
Node name:
代理的唯一名稱,預設是機器的hostname,可以通過-node
標誌自定義,例如:consul agent -dev -node myNode
Datacenter:
資料中心,Consul支援多個資料中心,為了有效的工作,每個節點必須被配置且上報到資料中心,-datacenter
標誌用來設定資料中心,對於單一的DC配置,這個代理預設為dc1
Server:
表示代理是以伺服器還是客戶端的模式來執行。Client Addr:
用於代理的客戶端介面地址。Cluster Addr:
用於叢集中的Consul代理之間通訊的地址和埠集,改地址必須可供其它節點訪問。
檢視叢集成員
開啟一個新終端執行consul members
,可以看到叢集的成員。
- Node:節點名稱
- Address:節點地址
- Status:alive表示節點為健康狀態
- Type:節點的執行模式(Server)
Stop Agent
Agent兩種停止方式:gracefully
或forcefully
gracefully
方式停止,則是傳送中斷訊號到Agent程式兩種方法:Ctrl+C
、kill -INT consul_pid
服務註冊
Consul服務搭建好之後,通過提供服務定義
或HTTP API
註冊一個服務,通用的模式是通過提供服務定義的方式,下文還會介紹怎麼應用Consul進行健康檢查
提供服務定義方式服務註冊
建立目錄/etc/consul.d
(.d 字尾意思是這個路徑包含了一組配置檔案),Consul會載入該目錄下的所有檔案。
例如我現在有個測試服務test01埠為3010
sudo mkdir /etc/consul.d/test01.json
{
"service":{
"name":"test01",
"tags":[
"",
""
],
"address":"127.0.0.1",
"port":3010,
"enable_tag_override": false,
"check":{
"deregisterCriticalServiceAfter":"90m",
"http":"http://127.0.0.1:3010/health",
"interval":"10s"
}
}
}
複製程式碼
服務定義配置檔案含義:
name:
服務名tags:
服務的tag,自定義,可以根據這個tag來區分同一個服務名的服務address:
服務註冊到consul的IP,服務發現,發現的就是這個IPport:
服務註冊consul的PORT,發現的就是這個PORTenable_tag_override:
標籤是否允許覆蓋check:
健康檢查部分deregisterCriticalServiceAfter
http:
指定健康檢查的URL,呼叫後只要返回20X,consul都認為是健康的interval:
健康檢查間隔時間,每隔10s,呼叫一次上面的URL
重啟Agent設定配置目錄
consul agent -dev -config-dir /etc/consul.d
複製程式碼
看以下執行結果:
啟動之後控制檯輸出了Synced service "test01"
,意思是Agent從配置檔案中載入了服務定義,且成功註冊到服務目錄,另外右邊的服務test01也收到了健康檢查介面呼叫
採用HTTP API服務註冊
呼叫/v1/agent/service/register
介面進行註冊,請求Method為PUT方式
請求Body值為服務定義
中的service值,看一下示例:
curl -X PUT \
http://127.0.0.1:8301/v1/agent/service/register \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-H 'postman-token: 6b672c02-350f-3d1c-7793-1a0d9e800fc9' \
-d '{
"id": "test01",
"name":"test01",
"tags":[
"",
""
],
"address":"127.0.0.1",
"port":3010,
"check":{
"deregisterCriticalServiceAfter":"90m",
"http":"http://127.0.0.1:3010/health",
"interval":"10s"
}
}'
複製程式碼
本篇為微服務架構中基於Consul實現的服務註冊系列文章,目錄如下:
作者:五月君
連結:www.imooc.com/article/275…
來源:慕課網
Github: Node.js技術棧