一. 專案背景
隨著微服務的興起,大量介面服務化。當新的微服務加入或微服務的資訊發生變更時,服務方如何通知周邊系統、使用方如何知道這些變更呢?
這時就需要服務的註冊配置和發現功能。
服務註冊配置——儲存的資訊至少包括正在執行的服務的主機和埠資訊
服務發現——允許其他使用者可以發現在服務註冊配置階段儲存的資訊
二. Confd簡介
Confd是一個輕量級的配置管理工具。Confd通過讀取後端儲存的配置資訊來動態更新對應的配置檔案,對應的後端儲存可以是etcd、consul、vault、environment variables、redis、zookeeper、dynamodb、stackengine、rancher等,其中etcd的v3版本對應的儲存後端為etcdv3。目前常用的儲存是etcd。
三. etcd簡介
etcd是CoreOS團隊於2013年6月發起的開源專案,它的目標是構建一個高可用的分散式鍵值(key-value)資料庫。etcd內部採用raft協議作為一致性演算法,etcd基於Go語言實現。
etcd作為服務發現系統,有以下的特點:
簡單:安裝配置簡單,而且提供了HTTP API進行互動,使用也很簡單
安全:支援SSL證照驗證
快速:根據官方提供的benchmark資料,單例項支援每秒2k+讀操作
可靠:採用raft演算法,實現分散式系統資料的可用性和一致性
etcd專案地址:https://github.com/coreos/etcd/
四. etcd+conf+nginx 架構圖
五. 環境安裝(自己需要啟動etcd與nginx)
1.etcd
brew install etcd
2.nginx
brew install nginx
3.confd
請先在下載地址下載confd-0.16.0-darwin-amd64檔案 並新增執行許可權
六. 使用教程
編輯confd配置檔案
mkdir -p /etc/confd/{conf.d,templates}
touch /etc/confd/conf.d/myconfig.toml
編輯myconfig.toml檔案
[template]
//模板檔案
src = "nginx.tmpl"
//生成nginx的配置目錄檔案
dest = "/usr/local/nginx/conf/conf.d/upstream.conf"
//監控KEY的改變,改變會自動重新生成nginx配置並重啟
keys = [
"/portal",
"/portal-upstream",
"/openapi",
"/openapi-upstream",
"/gateway",
"/gateway-upstream",
]
owner = "root"//當前使用者
mode = "0644"
check_cmd = "nginx -t"//執行命令
reload_cmd = "nginx -s reload"//執行命令
配置用於生成upstream的模板檔案
upstream {{getv "/portal"}} {
{{range getvs "/portal-upstream/*"}}
server {{.}};
{{end}}
}
upstream {{getv "/openapi"}} {
{{range getvs "/openapi-upstream/*"}}
server {{.}};
{{end}}
}
upstream {{getv "/gateway"}} {
{{range getvs "/gateway-upstream/*"}}
server {{.}};
{{end}}
}
修改nginx的配置檔案
include /usr/local/nginx/conf/conf.d/*.conf
增加etcd資料
etcdctl set /portal portal
etcdctl set /portal-upstream/portal01 192.168.81.11:30400
etcdctl set /openapi openapi
etcdctl set /openapi-upstream/openapi01 192.168.81.11:30600
etcdctl set /gateway gateway
etcdctl set /gateway-upstream/gateway01 192.168.81.11:30000
啟動confd監控etcd
confd支援兩種執行方式,即daemon和onetime。在守護程式模式下,confd輪詢後端以進行更改,並在必要時更新目標配置檔案。
confd -onetime -backend etcd -node http://127.0.0.1:2379
檢視nginx是否生成配置檔案
cat /usr/local/nginx/conf/conf.d/upstream.conf
upstream portal {
server 192.168.81.11:30400
}
upstream openapi {
server 192.168.81.11:30600
}
upstream gateway {
server 192.168.81.11:30000
}