天天看點

go-micro V2 從零開始(五)內建etcd注冊中心前言具體步驟總結支援一下

本文相關代碼: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

,即可很直覺的看到目前已注冊的服務情況了:

go-micro V2 從零開始(五)內建etcd注冊中心前言具體步驟總結支援一下

總結

這一章我們用很少的代碼和很簡單的參數将之前的編寫的服務,切換到了etcd注冊中心。這種種基于統一接口的簡潔和友善也是我非常青睐

go-micro

設計的一點。

下一節我們将用同樣簡單的方式将消息中間件切換為第三方的nats。

支援一下

原創不易,買杯咖啡,謝謝:p

go-micro V2 從零開始(五)內建etcd注冊中心前言具體步驟總結支援一下