基於Golang的微服務——Consul

winyh發表於2019-07-12

這系列文章很基礎,主要給想嘗試後端技術棧的前端看的,後端大佬別看了,很可能浪費你的時間。

雖然我更擅長寫前端相關的知識點總結文章,但是也阻止不了我對後端技術的嚮往啊,後端相關的文章質量不會高,主要目的是為了記錄自己的學習歷程,也是希望把自己的短板和缺點暴露出來,跟小夥伴們一起成長。

初衷

學習Go很大一個原因是因為想嘗試寫微服務,於是在探索Go構建微服務的道路上越走越遠,甚至有些求快和焦躁了,但是在成長就行。

Consul 是什麼?

首先奉上中文文件Consul.

Consul由多個模組組成,是一個為基礎設施提供服務發現和服務配置的工具。當用微服務架構時,傳統的單體應用全部拆分為了細粒度的功能模組,這些模組就是微服務,他們可以擁有自己獨立的資料庫,遵循單一職責原則,可以獨立部署。減少系統之間的耦合。那這麼多的微服務之間怎麼相互呼叫和發現呢?就可以藉助consul來集中註冊管理來。

  • 服務發現: Consul的客戶端可用提供一個服務,比如 api 或者mysql ,另外一些客戶端可用使用Consul去發現(依賴的是Http / DNS)一個指定服務的提供者。
  • 健康檢查: 避免將流量傳送到不健康的主機。
  • Key/Value儲存 可以理解為簡易的資料庫,可以完成動態配置,功能標記,協調,領袖選舉等功能。
  • 多資料中心 可以將專案部署擴充到多個資料中心。

執行原理

每個服務節點(這個節點可以理解為一個伺服器或者一個容器)都執行了一個Consul agent。這個agent是負責對節點自身和節點上的服務進行健康檢查的。consul 可以用兩種模式執行 server 和 client ,其中 server模式是以叢集的方式執行的,最少建議 3-5臺伺服器/容器。每個資料中心(可以是多個伺服器節點 / 容器的集合)至少必須擁有一臺server。

consul agent -dev
consul members
複製程式碼

可以啟動 consul,然後檢視當前叢集的成員

也可以通過Http 和 DNS 的方式查詢叢集資訊

curl localhost:8500/v1/catalog/nodes

dig @127.0.0.1 -p 8600 Armons-MacBook-Air.node.consul
複製程式碼

服務註冊

服務註冊有兩種方式:

  • 服務定義檔案
  • 呼叫HTTP API註冊

為Consul配置建立一個目錄.Consul會載入配置資料夾裡的所有配置檔案。

sudo mkdir /etc/consul.d 

// 寫入配置
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
    >/etc/consul.d/web.json
    
// Consul服務重啟
consul agent -dev -config-dir /etc/consul.d
複製程式碼

.d 字尾意思是這個路徑包含了一組配置檔案.

服務查詢

一旦agent啟動並且服務同步了.我們可以通過DNS或者HTTP的API來查詢服務. 在DNS API中,服務的DNS名字是 NAME.service.consul NAME是服務的名稱

對於我們上面註冊的Web服務.它的域名是 web.service.consul

dig @127.0.0.1 -p 8600 web.service.consul
// 會返回一個A記錄返回了一個可用的服務所在的節點的IP地址

dig @127.0.0.1 -p 8600 web.service.consul SRV
//接收包含 地址,服務節點和埠的 SRV記錄

curl http://localhost:8500/v1/catalog/service/web
// 通過 Http API 方式查詢
複製程式碼

更新服務

服務定義可以通過配置檔案併傳送SIGHUP給agent來進行更新.這樣你可以讓你在不關閉服務或者保持服務請求可用的情況下進行更新. 另外 HTTP API可以用來動態的新增,移除和修改服務.

擴充叢集

將Consul 擴充成面向生成環境,擁有多個成員的服務發現架構。 當一個agent啟動時。他是孤立的,通過與存在的叢集成員溝通來發現其他成員。 Consul agent可以加入任何agent而不只是出於server模式的agent

  • 每個叢集中的節點都必須要一個唯一的名字.Consul預設會使用機器的hostname.我們 可以使用-node手動覆蓋他.

  • 我們也可以使用-bind指定一個繫結的地址讓Consul在這個地址上進行監聽,這個地址必須可以被其他叢集成員訪問到

consul agent -server -bootstrap-expect 1  -data-dir /tmp/consul -node=hdp2 -bind=10.0.0.52  -config-dir /etc/consul.d
複製程式碼

引數介紹:

  • -server : 告訴consul agent節點將扮演叢集的唯一server
  • -bootstrap-expect : 提示Consul我們期待加入的server節點的數量
  • -config-dir : 指定服務和健康檢查定義檔案存放的路徑
  • -node : 覆蓋預設的節點名稱
  • -bind : 繫結一個固定地址
  • -data-dir : 為agent儲存狀態提供了一個資料目錄
consul join 10.0.0.53
// 當前agent加入 10.0.0.53 agent
複製程式碼

節點查詢

就像查詢服務一樣.Consul有一個API用來查詢節點自己.你可以通過DNS和HTTP的API來進行.

DNS API中節點名稱結構為 NAME.node.consul或者NAME.node.DATACENTER.consul.如果資料中心名字省略,Consul只會查詢本地資料中心.

dig @127.0.0.1 -p 8600 hdp3.node.consul
複製程式碼

退出叢集

離開叢集,你可以Ctrl-C優雅的退出,也可以直接Kill掉agent程式.優雅的退出可以讓節點轉變為離開狀態.否則節點將被標記為失敗.

定義檢查

和服務類似,一個檢查可以通過檢查定義或HTTP API請求來註冊. 我們將使用和檢查定義來註冊檢查.和服務類似,因為這是建立檢查最常用的方式.

echo '{"check": {"name": "ping",
  "script": "ping -c1 163.com >/dev/null", "interval": "30s"}}' \
  >/etc/consul.d/ping.json

// 健康檢查的 HTTP API 方式
curl http://localhost:8500/v1/health/state/critical
複製程式碼

重啟agent或者傳送SIGHUP訊號,就可以看到日誌輸出。

啟動web介面

consul agent -ui

http://localhost:8500/ui 
複製程式碼

未完待續。。。 好像很久沒更新之前寫的前端文章了。。。我的錯

相關文章