-
拉取鏡像
sudo docker pull consul
-
啟動節點1(server模式)
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 consul agent -server -bind=172.17.0.2 -bootstrap-expect=3 -node=node1
-node:節點的名稱
-bind:綁定的一個地址,用於節點之間通信的地址,可以是內外網,必須是可以訪問到的地址
-server:這個就是表示這個節點是個SERVER
-bootstrap-expect:這個就是表示期望提供的SERVER節點數目,數目一達到,它就會被激活,然后就是LEADER了
- 啟動節點2-3(server模式)
cat /proc/sys/kernel/random/uuid 每次都可以獲取到唯一ID
sudo docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server -bind=172.17.0.3 -join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid) -node=node2
sudo docker run -p 8500:8500 -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node3 consul agent -server -bind=172.17.0.5 -join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid) -node=node3 -client=172.17.0.5
-join:這個表示啟動的時候,要加入到哪個集群內,這里就是說要加入到節點1的集群
-node-id:這個貌似版本8才加入的,這里用這個來指定唯一的節點ID,可以查看這個issue
-client:這個表示注冊或者查詢等一系列客戶端對它操作的IP,如果不指定這個IP,默認是127.0.0.1。
-
啟動節點4(client模式)
docker run -d -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name=node4 consul agent -bind=172.17.0.6 -retry-join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid) -node=node4
除了沒有-server,其它都是一樣的,沒有這個就說明這個節點是CLIENT -
查看下集群的狀態
sudo docker exec -t node1 consul members
4個節點都列出來了。Status表示它們的狀態,都是alive。Type表示它們的類型,三個SERVER一個CLIENT,和我們之前啟動的一樣。DC表示數據中心,都是dc1。 -
節點異常,consul的處理
LEADER 掛了
leader掛了,consul會重新選取出新的leader,只要超過一半的SERVER還活着,集群是可以正常工作的。node1是leader,所以把這個容器停了。
docker stop node1
看看其他節點的日志(node2):
sudo docker logs node2
日志打印,心跳檢查node1的ip超時,接着開始選舉。node2被選舉為新的leader。我們查看下現在的leader:
curl http://10.0.4.17:8500/v1/status/leader
返回內容:
"172.17.0.3:8300"
, 172.17.0.3 就是 node2節點的IP
- 注冊個服務
(1)服務參數解析
{
"ID": "goodServiceId", //服務id
"Name": "goodService", //服務名
"Tags": [ //服務的tag,自定義,可以根據這個tag來區分同一個服務名的服務
"primary",
"v1"
],
"Address": "127.0.0.1",//服務注冊到consul的IP,服務發現,發現的就是這個IP
"Port": 7000, //服務注冊consul的PORT,發現的就是這個PORT
"EnableTagOverride": false,
"Check": { //健康檢查部分
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.google.com", //指定健康檢查的URL,調用后只要返回20X,consul都認為是健康的
"Interval": "10s" //健康檢查間隔時間,每隔10s,調用一次上面的URL
}
}
(2)注冊服務
curl http://10.0.4.17:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
"ID": "centerServiceId",
"Name": "centerService",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": 6000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com",
"Interval": "10s"
}
}'
響應:
HTTP/1.1 200 OK
Vary: Accept-Encoding
X-Consul-Default-Acl-Policy: allow
Date: Tue, 15 Feb 2022 06:42:25 GMT
Content-Length: 0
- 發現個服務
剛剛注冊了名為userService的服務,我們現在發現(查詢)下這個服務
curl http://10.0.4.17:8500/v1/catalog/service/userService
響應:
-
瀏覽器查看單個服務:
http://mayanan.cn:8500/v1/catalog/service/userService
-
瀏覽器查看所有服務
http://mayanan.cn:8500/v1/agent/services
內容有了吧,這個就是我們剛剛注冊的服務的信息,就可以獲取到
服務的名稱是“userService”
服務地址是“127.0.0.1”
服務的端口是“8000”
- 存儲個k/v
設置一個值到user/config/connections 內容為5
sudo docker exec -t node1 consul kv put user/config/connections 5
-
獲取特定的值
sudo docker exec -t node1 consul kv get -detailed user/config/connections
返回:
-
刪除個k/v
sudo docker exec -t node1 consul kv delete user/config/connections