consul 是一個用來做服務發現的框架,具有分散式、高可用以及可橫向擴展的特性 什麼是服務發現?為什麼要實現服務發現? 舉個常見的例子: 假設有一臺 client 想要實現不同的業務,就需要調用介面去訪問後端的server 那這樣 client 就需要知道後端 server 的網路配置,通常是將 ...
consul 是一個用來做服務發現的框架,具有分散式、高可用以及可橫向擴展的特性
什麼是服務發現?為什麼要實現服務發現?
舉個常見的例子:
假設有一臺 client 想要實現不同的業務,就需要調用介面去訪問後端的server
那這樣 client 就需要知道後端 server 的網路配置,通常是將 server 的網路配置寫到 client 配置文件中
這樣就會出現幾個問題:
-
後面如果新增後端 server,就需要將新配置寫進 client 本地上,導致後期配置文件越來越多,不便於維護
-
一旦後端某一服務的網路配置發生變化,需要修改 client 的配置
-
一旦後端某一服務出現故障,需要人工剔除配置項
為此,我們需要引入一個中間件來給 client 和 server 之間解耦,client 不需要關心後端 server 的配置,當需要實現某一業務的時候,只需要去服務發現中間件上面去獲取到對應 server 的網路配置即可
初識 consul
Consul 是 HashiCorp 公司推出的開源工具,由 go 語言開發,部署起來非常容易,只需要極少的可執行程式和配置文件,非常輕量,用於實現分散式系統的服務發現與配置的解決方案
常用的服務發現框架有:zookeeper、 etcd、Consul
consul 的一些特性:
-
服務發現
-
Consul 提供了通過 DNS 或者 HTTP 介面的方式來註冊服務和發現服務
-
一些外部的服務通過 Consul 找到它所依賴的服務
-
健康檢查
-
Consul 的 Client 可以提供任意數量的健康檢查,既可以與業務相關聯(是否返回200 狀態碼)也可以與本地節點相關聯(cpu 使用率等)
-
KV 存儲
-
Consul 提供了簡單的http介面,可以實現動態配置、功能標記、領袖選舉等功能
-
安全服務通信
-
可以為服務生成和分發 TLS 證書,以便建立 TLS 連接
-
多數據中心
-
consul 集群由多個 server 和 client 組成,所有的服務都可以註冊到這些節點上
簡單部署
consul 安裝
下載後可以發現 consul 就是一個可執行的二進位文件
為了簡單起見,我們現在將以開發模式啟動 Consul 代理。這種模式對於快速簡單地啟動單節點 Consul 環境非常有用
我們現在單機簡單部署一下consul
#開發模式啟動consul agnet consul agent -dev -client=0.0.0.0
加上 -client=0.0.0.0 參數是讓我們能夠通過本地瀏覽器來訪問 consul 提供的 http 介面(即 consul 能夠對外提供服務)
註冊服務
接下來我們將簡單註冊一個服務併在 web 界面上實現健康檢查
這是官方文檔給出的一個註冊服務的配置示例:
編寫一個服務定義配置文件,假設有一個名為 web 的服務在埠 80 上運行
ctrl+c 終止掉 consul 服務,重啟 consul
-
查詢服務
一旦 consul 啟動,我們可以通過 HTTP API 方式來查詢
即使用 /v1/catalog/service/{name}
查詢
還可以,通過瀏覽器訪問 consul web界面去查看
可以看到 web 服務已經註冊上去了
自帶健康檢查功能
k-v 操作
除了提供服務發現和健康檢查之外,consul 還支持 kv 存儲
通過 kv 存儲,可以實現動態配置保存、修改等功能
舉個例子
有一臺 server 提供 web 服務,它將網路配置信息以鍵值對形式保存到 consul 上
當 client 需要去調用這個 web 服務的時候,就去 consul 上面找到相關的 key 然後獲取對應的 value
而當 server 的網路配置發生變化時,可以在 consul 上面直接修改 value
如上圖所示,key 為 webserver,value 為 ip 和 port,以 YAML 的形式保存
consul 上面的 value 有多種形式(JSON、HCL、XML、YAML)
一般我們對 kv 的操作有兩種方式:
-
通過命令行來操作(CLI API)
-
通過 consul 提供的 web 界面(HTTP API)來操作
使用 CLI API 操作 key/value
consul 命令操作 kv 文檔:
https://developer.hashicorp.com/consul/commands/kv
-
增
#語法:
consul kv put
我們想新增一個叫做 webserver 的 key,它的 value 如下:
ip=1.1.1.1
port=80
查看發現沒有 webserver 這個 key
我們添加一下
- 刪
#語法
consul kv delete
假設我們提供 web 服務的 server 發生故障了,需要在 consul 上面刪掉它的配置
- 改
假設你某一個 key 對應有多個value,如果修改 value 的話是全部修改的,不能說修改 value 中的某一個值
舉個例子,我想修改 webserver 中的 port,將其改成100
我只能全部修改,不能單獨改 port 欄位
有一種比較好的方法,就是使用 import 和 export 參數
第一步:我們先將當前的 kv 導出到本地來做備份
第二步:將新配置文件 import 上去
-
查
#語法
consul kv get
查看指定 key
查看指定 key 的詳細信息
遞歸列出所有的 key 以及對應的 value
遞歸列出所有的 key
使用HTTP API操作key/value
使用瀏覽器訪問 ip:8500 即可進入 consul web 界面
然後滑鼠點點點就行了,本文不過多介紹