簡介
為什么要用consul,這里就不詳細介紹了,本文重點是Consul的搭建和使用過程。
Consul搭建
參考文獻:http://tonybai.com/2015/07/06/implement-distributed-services-registery-and-discovery-by-consul/
- 下載consul和consul UI
官方地址:https://www.consul.io/,就一個consul執行文件
2. 在consul執行文件的目錄下打開命令
3. 創建server方式
consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -node=n1 -bind=你的ip -dc=dc1
相關配置信息說明
a. –server指定創建服務端
b. –boostrap-expect 關於服務leader投票等相關的level設定
c. –data-dir相關信息的文件路徑,不指定的話,就在consul目錄下生成
d. –node節點名稱
e. –bind綁定的你服務器的IP
f. –dc數據中心名稱
更多的配置信息說明,請參考官方內容,地址:https://www.consul.io/docs/agent/options.html
4. 創建client方式
如上,只是刪掉了-server
consul agent -data-dir /tmp/consul -node=n3 -bind=你的ip -dc=dc1
5. 以配置文件形式創建
命令后面加 -config-file=./conf
consul agent -data-dir /tmp/consul -node=n3 -bind=你的ip -dc=dc1 -config-file=./conf
./conf目錄下包含json格式的配置信息,將配置的設置都存放在該文件下,可以注冊服務和healthCheck等等
{ "log_level": "TRACE", "encrypt": "7TnJPB4lKtjEcCWWjN6jSA==", "service": { "name": "web3", "tags": ["master"], "address": "127.0.0.1", "port": 58807, "checks": [ { "http": "http://127.0.0.1:60143/healthcheck", "interval": "10s" } ] } }
6. 搭建服務集群(服務器之間關聯)
Consul join 其中一個服務器的ip,如: consul join 10.5.133.144
7. 配置web ui的方式
Web ui是consul提供的可視化的服務web界面,可以對key/value和服務、節點進行操作
a. 將下載好的web ui文件內容(包含一個html和一個static文件件)拷貝到consul所在目錄下dist(自己創建)文件夾下
ps. 在原來創建server或者client的時候,需要設置-ui-dir ./dist
如: consul agent -data-dir /tmp/consul -node=n3 -bind=你的ip -dc=dc1 -config-file=./conf -ui-dir ./dist
b. 打開127.0.0.1:8500 就可以打開界面了。
8. 常見的consul 命令
Consul members 查看服務集群的所有服務器
Consul info 查看當前服務器的狀況
Consul leave 退出當前服務集群
服務注冊
- 通過Consul的服務注冊HTTP API,由服務自身在啟動后調用API注冊自己(可以自定義服務客戶端,調用api進行操作)
- 通過在配置文件中定義服務的方式進行注冊
{ "service": { "name": "web3", "tags": ["master"], "address": "127.0.0.1", "port": 10000, "checks": [ { "http": "http://localhost:10000/health", "interval": "10s" } ] } }
以上注冊了一個服務名稱為web3地址127.0.0.1端口10000,同時還注冊了一個healthcheck。
服務發現
- 通過HTTP API查看存在哪些服務(自定義服務發現客戶端)
- 通過consul agent內置的DNS服務(如果是windows系統可以下載dig工具,發現dns服務,ps. Windows系統不建議作為server)
可以根據服務check的實時狀態動態調整available服務節點列表
dig @127.0.0.1 -p 8600 web3.service.consul SRV
服務發現HTTP API
http://www.codeweblog.com/%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0%E7%B3%BB%E7%BB%9Fconsul-http-api/
api 提供增刪改查nodes、services、checks、configuration。
以下consul 的http api,距離,查看所有服務,打開地址如下:127.0.0.1:8500/v1/agent/services,就可以查看所有服務的信息
如上圖,找到了一個名為"web3"的服務。
- api包含以下幾部分內容
kv - Key/Value存儲
agent - Agent控制
catalog - 管理nodes和services
health - 管理健康監測
session - Session操作
acl - ACL創建和管理
event - 用戶Events
status - Consul系統狀態
2. agent的api
和本地agent交互,用於服務注冊和檢查注冊
/v1/agent/checks : 返回本地agent注冊的所有檢查(包括配置文件和HTTP接口)
/v1/agent/services : 返回本地agent注冊的所有 服務
/v1/agent/members : 返回agent在集群的gossip pool中看到的成員
/v1/agent/self : 返回本地agent的配置和成員信息
/v1/agent/join/<address> : 觸發本地agent加入node
/v1/agent/force-leave/<node>>: 強制刪除node
/v1/agent/check/register : 在本地agent增加一個檢查項,使用PUT方法傳輸一個json格式的數據
/v1/agent/check/deregister/<checkID> : 注銷一個本地agent的檢查項
/v1/agent/check/pass/<checkID> : 設置一個本地檢查項的狀態為passing
/v1/agent/check/warn/<checkID> : 設置一個本地檢查項的狀態為warning
/v1/agent/check/fail/<checkID> : 設置一個本地檢查項的狀態為critical
/v1/agent/service/register : 在本地agent增加一個新的服務項,使用PUT方法傳輸一個json格式的數據
/v1/agent/service/deregister/<serviceID> : 注銷一個本地agent的服務項
3. catalog 的api
注冊、注銷nodes、services、checks
/v1/catalog/register : Registers a new node, service, or check
/v1/catalog/deregister : Deregisters a node, service, or check
/v1/catalog/datacenters : Lists known datacenters
/v1/catalog/nodes : Lists nodes in a given DC
/v1/catalog/services : Lists services in a given DC
/v1/catalog/service/<service> : Lists the nodes in a given service
/v1/catalog/node/<node> : Lists the services provided by a node
4. health
查詢相關的健康信息
/v1/health/node/<node>: 返回node所定義的檢查,可用參數?dc=
/v1/health/checks/<service>: 返回和服務相關聯的檢查,可用參數?dc=
/v1/health/service/<service>: 返回給定datacenter中給定node中service
/v1/health/state/<state>: 返回給定datacenter中指定狀態的服務,state可以是"any", "unknown", "passing", "warning", or "critical",可用參數?dc=
- session
增刪改查session信息
/v1/session/create: Creates a new session
/v1/session/destroy/<session>: Destroys a given session
/v1/session/info/<session>: Queries a given session
/v1/session/node/<node>: Lists sessions belonging to a node
/v1/session/list: Lists all the active sessions
5. acl
增刪改查acl信息
/v1/acl/create: Creates a new token with policy
/v1/acl/update: Update the policy of a token
/v1/acl/destroy/<id>: Destroys a given token
/v1/acl/info/<id>: Queries the policy of a given token
/v1/acl/clone/<id>: Creates a new token by cloning an existing token
/v1/acl/list: Lists all the active tokens
6. event
觸發event和查詢已有event
/v1/event/fire/<name>: 觸發一個新的event,用戶event需要name和其他可選的參數,使用PUT方法
/v1/event/list: 返回agent知道的events
7. status
consul 集群的信息
/v1/status/leader : 返回當前集群的Raft leader
/v1/status/peers : 返回當前集群中同事
服務發現客戶端
從nuget上下載consul包,里面包含consul的所有操作。
源碼地址:https://github.com/PlayFab/consuldotnet/。
舉例通過key獲取value
1. 在UI添加一個key/value的內容(也可以在程序中添加)
2. 獲取value代碼如下
static void Main(string[] args) { Console.WriteLine(HelloConsul().GetAwaiter().GetResult()); Console.ReadLine(); } public static async Task<string> HelloConsul() { using (var client = new ConsulClient()) { var getPair = await client.KV.Get("hello1"); return Encoding.UTF8.GetString(getPair.Response.Value, 0, getPair.Response.Value.Length); } }
3. 結果如下:
更多服務發現客戶端的內容,后續補上。