本文相關代碼:gitee
文章目錄
- 前言
- 具體步驟
-
- 一、etcd
-
- 1.1 簡介
- 1.2 啟動etcd
- 二、配置注冊中心
-
- 2.1 代碼中配置
-
- 2.1.1 服務注冊
- 2.1.2 服務發現
- 2.2 指令行參數
- 2.3 環境變量
- 三、服務管理
- 總結
- 支援一下
前言
接下來幾章,重點介紹go-micro幾個常用功能的內建。
首先內建的是服務的注冊與發現,go-micro架構為服務注冊發現提供了标準的接口
Registry
。隻要實作這個接口就可以定制自己的服務注冊和發現。不過官方已經為主流注冊中心提供了官方的接口實作,大多數時候我們不需要從頭寫起。
在老版本的go-micro中預設使用
consul
作為注冊中心,網上你能搜到的教程大多也是如何注冊到
consul
,但在v2版中,官方已經不推薦使用
consul
。
目前最新版的
go-micro
預設使用
mDNS
提供零配置的發現系統,他内置于大多數系統。是以之前我們的程式完全不用做任何配置,也不用搭建任何環境,就具備服務注冊和發現能力。
而在生産環境,官方則推薦使用
etcd
組成更具彈性的叢集方案,這也是我們這一章的主要内容。
具體步驟
一、etcd
1.1 簡介
etcd是CoreOS團隊于2013年6月發起的開源項目,它的目标是建構一個高可用的分布式鍵值(key-value)資料庫。etcd内部采用raft協定作為一緻性算法,etcd基于Go語言實作。
etcd作為服務發現系統,有以下的特點:
- 簡單:安裝配置簡單,而且提供了HTTP API進行互動,使用也很簡單
- 安全:支援SSL證書驗證
- 快速:根據官方提供的benchmark資料,單執行個體支援每秒2k+讀操作
- 可靠:采用raft算法,實作分布式系統資料的可用性和一緻性
etcd項目位址:https://github.com/coreos/etcd/
本教程重點在于示範go-micro中etcd注冊中心的內建,對于etcd的詳細配置和叢集部署請根據官方文檔指引另行學習。
1.2 啟動etcd
因為是go語言編寫,你完全可以從GitHub擷取整個項目并編譯出可執行檔案:github
也可以直接從Github上下載下傳他的最新版可執行檔案:etcd v3.4.13
如果你打算在Linux或mac環境下使用docker管理他,也可以根據官方指引編寫
dockerfile
因為隻是簡單示範,考慮到github的下載下傳速度,這裡我們選擇docker鏡像啟動,整個指令都來自于官方文檔(官方預設的位址
gcr.io/etcd-development/etcd
不知道為什麼我的docker hub鏡像倉庫裡沒有,這裡使用了官方提供的備用位址
quay.io/coreos/etcd
):
rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
docker run \
-p 2379:2379 \
-p 2380:2380 \
--mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
--name etcd-gcr-v3.4.13 \
-d \
quay.io/coreos/etcd:v3.4.13 \
/usr/local/bin/etcd \
--name s1 \
--data-dir /etcd-data \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://0.0.0.0:2380 \
--initial-cluster s1=http://0.0.0.0:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
二、配置注冊中心
go-micro
中配置注冊中心非常簡單,我們修改極少的代碼自定義注冊方式和位址。
對于已經打包的程式(如我們上一章使用的
micro
網關),也可在指令行參數或環境變量中随時切換這些配置。
下面分别對這三種方式做展示:
2.1 代碼中配置
同為go-micro微服務,在标準的接口下,生産者和消費者的配置方式沒有什麼本質差別.
不過為了清晰,下面我們分别展示服務方注冊服務和消費者服務發現的代碼實作。
2.1.1 服務注冊
以
task-srv
服務為例,編輯
go-todolist/task-srv/main.go
在初始化服務的地方加入注冊中心配置:
...
service := micro.NewService(
micro.Name("go.micro.service.task"),
micro.Version("latest"),
// 配置etcd為注冊中心,配置etcd路徑,預設端口是2379
micro.Registry(etcd.NewRegistry(
// 位址是我本地etcd伺服器位址,不要照抄
registry.Addrs("172.18.0.58:2379"),
)),
)
...
這裡我們隻是簡單的配置了etcd服務的位址,你可以進入源碼檢視
etcd.NewRegistry
支援的配置項,他非常簡單:
type Options struct {
// 位址清單
Addrs []string
// 逾時時間
Timeout time.Duration
// 與注冊中心的安全通信
Secure bool
// tls加密通信配置
TLSConfig *tls.Config
// Other options for implementations of the interface
// can be stored in a context
Context context.Context
}
然後正常啟動程式,在日志中會發現已經注冊到etcd:
> go run main.go
2020-09-25 09:16:53 file=[email protected]/service.go:200 level=info Starting [service] go.micro.service.task
2020-09-25 09:16:54 file=grpc/grpc.go:864 level=info Server [grpc] Listening on [::]:50480
2020-09-25 09:16:54 file=grpc/grpc.go:697 level=info Registry [etcd] Registering node: go.micro.service.task-7055f608-28f5-4a3c-945d-be1cbfb6bc9f
2.1.2 服務發現
以測試代碼
task-cli.go
為例:
...
server := micro.NewService(
micro.Name("go.micro.client.task"),
// 配置etcd為注冊中心,配置etcd路徑,預設端口是2379
micro.Registry(etcd.NewRegistry(
// 位址是我本地etcd伺服器位址,不要照抄
registry.Addrs("172.18.0.58:2379"),
)),
)
server.Init()
...
2.2 指令行參數
在啟動指令中增加如下參數:
-
--registry=etcd
-
--registry_address=172.18.0.58:2379
以
micro
網關為例,修改之前的啟動指令:
注意: 注冊中心配置是
micro
的參數而不是
micro api
指令的參數,必須寫在
api
指令之前!
> micro --registry=etcd --registry_address=172.18.0.58:2379 api --handler=http
2020-09-25 09:30:09 file=api/api.go:259 level=info service=api Registering API HTTP Handler at /{service:[a-zA-Z0-9]+}
2020-09-25 09:30:09 file=http/http.go:90 level=info service=api HTTP API Listening on [::]:8080
2020-09-25 09:30:09 file=[email protected]/service.go:200 level=info service=api Starting [service] go.micro.api
2020-09-25 09:30:09 file=grpc/grpc.go:864 level=info service=api Server [grpc] Listening on [::]:50623
2020-09-25 09:30:09 file=grpc/grpc.go:697 level=info service=api Registry [etcd] Registering node: go.micro.api-f82c064c-a257-45d3-8ecd-5a995db0ac14
可以看到日志中已經成功注冊到etcd。
2.3 環境變量
在環境變量中配置注冊中心:
-
- 注冊方式MICRO_REGISTRY
-
- 中心位址MICRO_REGISTRY_ADDRESS
仍然以
micro api
服務為例:
> set MICRO_REGISTRY_ADDRESS=172.18.0.58:2379
> set MICRO_REGISTRY=etcd
> micro api --handler=http
2020-09-25 09:37:26 file=http/http.go:90 level=info service=api HTTP API Listening on [::]:8080
2020-09-25 09:37:26 file=[email protected]/service.go:200 level=info service=api Starting [service] go.micro.api
2020-09-25 09:37:26 file=grpc/grpc.go:864 level=info service=api Server [grpc] Listening on [::]:50681
2020-09-25 09:37:26 file=grpc/grpc.go:697 level=info service=api Registry [etcd] Registering node: go.micro.api-9d2d816f-a8e6-456b-98db-8c547952fc6a
三、服務管理
啟動的服務不可能都依靠日志判斷是否注冊成功,我們需要一個類似
consul
控制台的工具來直覺管理服務狀态。
etcd
作為一個
key-value
資料庫本身并不服務管理功能,這裡我們又用到了
micro
工具包的一個功能:
web
啟動指令如下(注意,注冊中心相關配置和
api
一樣要放在
web
指令之前):
> micro --registry=etcd --registry_address=172.18.0.58:2379 web
2020-09-25 10:18:31 file=http/http.go:90 level=info service=web HTTP API Listening on [::]:8082
2020-09-25 10:18:31 file=[email protected]/service.go:200 level=info service=web Starting [service] go.micro.web
2020-09-25 10:18:31 file=grpc/grpc.go:864 level=info service=web Server [grpc] Listening on [::]:51187
2020-09-25 10:18:31 file=grpc/grpc.go:697 level=info service=web Registry [etcd] Registering node: go.micr
o.web-c632902c-431f-49b2-b8e4-194f09fdaa21
浏覽器打開
localhost:8082
,點選右上角的
service
,即可很直覺的看到目前已注冊的服務情況了:
總結
這一章我們用很少的代碼和很簡單的參數将之前的編寫的服務,切換到了etcd注冊中心。這種種基于統一接口的簡潔和友善也是我非常青睐
go-micro
設計的一點。
下一節我們将用同樣簡單的方式将消息中間件切換為第三方的nats。
支援一下
原創不易,買杯咖啡,謝謝:p