Consul 是微服務網路解決方案之一, 用於管理跨網路和多雲環境服務之間的安全網路連接, 提供服務發現, 服務網格, 流量管理和自動更新. 可以單獨部署, 也可以分散式部署. Consul 內建安全通信選項, 使用 Go 語言編寫, 啟動資源消耗小, 腳本化配置, 對容器部署方式更友好 ...
目錄
- Spring Cloud開發實踐(一): 簡介和根模塊
- Spring Cloud開發實踐(二): Eureka服務和介面定義
- Spring Cloud開發實踐(三): 介面實現和下游調用
- Spring Cloud開發實踐(四): Docker部署
- Spring Cloud開發實踐(五): Consul - 服務註冊的另一個選擇
- Spring Cloud開發實踐(六): 基於Consul和Spring Cloud 2021.0的演示項目
關於 Consul
HashiCorp Consul 是微服務網路解決方案之一, 用於管理跨網路和多雲環境服務之間的安全網路連接, 提供服務發現, 服務網格, 流量管理和自動更新. 可以單獨部署, 也可以分散式部署.
Consul 的特點
- CP(強一致性),使用Raft複製狀態
- 服務可以通過任意Server註冊, 通過 Raft 仲裁
- 內建安全通信選項
- 一致性提供鎖定和集群協調
- 帶配置功能, 健康檢查, Lock, KV, ACL
- 通過 DNS 支持非 REST 節點, 允許更多類型資源連接
- 使用 Go 語言編寫, 啟動資源消耗小, 只需要50-60MB記憶體, 相對比 Nacos 預設配置512M, 啟動需要600M以上記憶體.
- 腳本化配置, 對容器部署方式更友好
安裝
下載地址 https://developer.hashicorp.com/consul/downloads, 根據自己的系統選擇對應的二進位文件, 對應 Linux AMD64 的, 文件還不小, 50MB, 解壓後只有一個可執行文件, 127MB, 將其放到 /opt/consul/ 目錄, 並將owner改為 root:root
運行 Agent
Consul 的運行形式就是 Agent, 可以運行為 server 或 client 模式. Agent 的啟動命令格式為
consul agent <options>
具體的命令參數可以通過consul agent --help
查看, 常用的參數
- -bind=
用於cluster通信的地址 - -client=
用於client訪問的地址, 包含 RPC, DNS, HTTP, HTTPS, gRPC (if configured). - -config-dir=
配置文件所在目錄, 讀取所有 .json 尾碼的文件作為配置, 可以指定多次 - -config-file=
配置文件路徑, 可以指定多次 - -data-dir=
指定agent狀態數據存儲目錄 - -dev 以開發模式啟動
- -log-file=
指定日誌文件路徑 - -log-json 使用JSON格式記錄日誌
- -log-level=
日誌級別 - -log-rotate-bytes=
日誌文件位元組數約束 - -log-rotate-duration=
日誌文件時間跨度 - -log-rotate-max-files=
日誌保留的文件數 - -node=
指定本節點名稱, 在 Cluster 內必須唯一 - -node-id=
指定Node ID, 預設為自動生成並記錄到 data-dir - -retry-join=
啟動時嘗試加入的 Agent 地址 - -server 伺服器模式
- -ui 啟用內建的靜態Web UI界面
- -ui-content-path=
UI界面地址, 預設為 /ui/
開發模式
用-dev
參數可以快速創建一個開發模式的server, 數據不保存, Node ID隨機生成, Node name使用當前的hostname, 監聽 127.0.0.1, 可以看下麵的控制台輸出, HTTP等服務使用的是127.0.0.1地址, 只能從本機訪問
$ consul agent -dev
==> Starting Consul agent...
Version: '1.15.2'
Build Date: '2023-03-30 17:51:19 +0000 UTC'
Node ID: 'ab2e7536-867a-c12f-5bd6-8a825b31af90'
Node name: 'centos7001'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, gRPC-TLS: 8503, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Gossip Encryption: false
Auto-Encrypt-TLS: false
HTTPS TLS: Verify Incoming: false, Verify Outgoing: false, Min Version: TLSv1_2
gRPC TLS: Verify Incoming: false, Min Version: TLSv1_2
Internal RPC TLS: Verify Incoming: false, Verify Outgoing: false (Verify Hostname: false), Min Version: TLSv1_2
==> Log data will now stream in as it occurs:
2023-05-17T06:31:23.337Z [DEBUG] agent.grpc.balancer: switching server: target=consul://dc1.ab2e7536-867a-c12f-5bd6-8a825b31af90/server.dc1 from=<none> to=<none>
如果在遠程伺服器上運行, 需要加上-client
參數, 指定伺服器網口IP地址, 這樣就可以從本地訪問 http://192.168.11.22:8500 的 Web控制台了
consul agent -dev -client=192.168.11.22
在另一個終端視窗中, 可以通過consul members
命令查看節點, 如果不加-http-addr
參數, 預設訪問本地127.0.0.1
$ consul members -http-addr=http://192.168.11.22:8500
Node Address Status Type Build Protocol DC Partition Segment
centos7001 127.0.0.1:8301 alive server 1.15.2 2 dc1 default <all>
通過consul leave
停止consul服務
$ consul leave -http-addr=http://192.168.11.22:8500
Graceful leave complete
單Server模式
如果不使用-dev
, 就要手工指定一些參數, 否則啟動會有錯誤
consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22
去掉了 -dev
參數, 增加了三個新參數,
- -ui 開啟 8500 埠的 web 控制台, 這個不是必須的
- -server 和 -bootstrap-expect=1 一起使用, 前者表示用server模式啟動, 後者表示只有一臺伺服器, 可以立即產生leader, 也必須指定. 如果不指定後者, consul會一直等待 leader 的產生
集群模式
集群模式下, 每個 Datacenter 必須至少有一臺 server. 建議是3或5台, 單server在宕機時會造成數據丟失. 其它 Agent 運行為 client 模式.
下麵以一臺Server, 一臺Client為例說明
在 11.22 主機上運行 Server
consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22 -bind=192.168.11.22
在 11.23 主機上運行 Client, 並 Join 到 11.22
consul agent -ui -data-dir=./data -client=192.168.11.23 -bind=192.168.11.23 -retry-join=192.168.11.22
Join 成功後, 在兩邊的控制臺上會顯示相應信息. 這時候通過consul members
可以看到兩個Node:
/opt/consul/consul members -http-addr=http://192.168.11.22:8500
Node Address Status Type Build Protocol DC Partition Segment
centos7001 192.168.11.22:8301 alive server 1.15.2 2 dc1 default <all>
54120-nc01 192.168.11.23:8301 alive client 1.6.1 2 dc1 default <default>
後臺運行
不留日誌
nohup /opt/consul/consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22 -bind=192.168.11.22 >/dev/null 2>&1 &
日誌輸出到文件
nohup /opt/consul/consul agent -ui -server -bootstrap-expect=1 -data-dir=./consul-data -client=192.168.11.22 -bind=192.168.11.22 >path/to/log/consul.log 2>&1 &
這樣consul會在後臺運行, 需要用 consul leave 退出
參考
- Eureka vs Consul https://gist.github.com/StevenACoffman/de394d6511a387ada9ab988e33be8583
- Get Started: Consul Agent https://developer.hashicorp.com/consul/docs/agent
- Consul建立集群 https://book-consul-guide.vnzmi.com/06_setup_cluster.html