Spring Cloud開發實踐(五): Consul

2023-05-18 06:00:42

目錄

關於 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 退出

參考