欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理解析

 更新時間:2022年04月25日 10:04:26   作者:波斯馬  
這篇文章主要介紹了go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理,這里提供一個通過docker快速安裝Consul的方式,當然前提是你得安裝了docker,需要的朋友可以參考下

go-micro v4默認使用mdns做服務(wù)發(fā)現(xiàn)。不過也支持采用其它的服務(wù)發(fā)現(xiàn)中間件,因為多年來一直使用Consul做服務(wù)發(fā)現(xiàn),為了方便和其它服務(wù)集成,所以還是選擇了Consul。這篇文章將介紹go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法。關(guān)于Consul的使用方式請參考我的另一篇文章:搭建Consul服務(wù)發(fā)現(xiàn)與服務(wù)網(wǎng)格

安裝Consul

如果你已經(jīng)安裝Consul,或者對Consul很熟悉了,按照自己的方式處理Consul就行了。

這里提供一個通過docker快速安裝Consul的方式,當然前提是你得安裝了docker。

執(zhí)行命令:

docker run --name consul1 -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302  -d consul:latest

這會在docker容器中啟動一個最新版本的Consul服務(wù),并將相關(guān)端口開放給主機。

安裝Consul插件

使用Consul作為服務(wù)注冊和服務(wù)發(fā)現(xiàn),需要先安裝go-micro的consul插件:

go get github.com/go-micro/plugins/v4/registry/consul

服務(wù)端使用Consul

服務(wù)注冊

為了使用Consul做服務(wù)注冊,需要為go-micro server顯式的指定Consul Registry。直接看代碼吧:

func main() {

	registry := consul.NewRegistry()
	rpcServer := server.NewServer(
		server.Name("registry-consul.service"),
		server.Address("0.0.0.0:8001"),
		server.Registry(registry),
	)
	proto.RegisterHelloHandler(rpcServer, &Hello{})
	service := micro.NewService(
		micro.Server(rpcServer),
	service.Init()
	// Run server
	if err := service.Run(); err != nil {
		log.Fatal(err)
	}
}

通過 consul.NewRegistry() 創(chuàng)建一個Consul 注冊中心,然后使用 server.NewServer 創(chuàng)建Server的時候把它設(shè)置進去;同時我們需要指定服務(wù)的名稱,這里設(shè)置的是 registry-consul.service;另外這里不使用隨機端口,指定了一個服務(wù)的監(jiān)聽地址。這樣基本就OK了。

這里并沒有指定Consul的連接地址,因為按照推薦的Consul部署方式,服務(wù)所在機器或者容器中應(yīng)該部署一個Consul的客戶端,程序可以直接通過 127.0.0.1:8500 訪問到它。如果要顯示指定,可以在NewRegistry時設(shè)置:

registry := consul.NewRegistry(
		registry.Addrs("127.0.0.1:8500"),
	)

注冊過程

通過一張圖來看一下,go-micro注冊服務(wù)到Consul時都做了什么。

服務(wù)注冊關(guān)鍵是實現(xiàn)兩個動作:

1、注冊: rpcServer啟動的時候,會調(diào)用到自身的Register方法,Register方法會調(diào)用consul插件的Register方法,然后調(diào)用到consul自身SDK提供的Agent.ServiceRegister方法,將服務(wù)注冊到Consul中。注冊的服務(wù)名稱就是NewServer時的server.Name。

2、健康上報: 即刷新TTL,服務(wù)注冊成功后,會啟動一個定時器定時調(diào)用consul插件的Register方法,這個方法內(nèi)部判斷服務(wù)注冊過,則會調(diào)用consul自身SDK提供的Agent.PassTTL方法,刷新Consul中對應(yīng)服務(wù)的TTL。

健康檢查

go-micro服務(wù)的健康狀態(tài)是通過TTL維護的,服務(wù)需要定時去刷新TTL,如果TTL超過指定的時間沒有被刷新,則服務(wù)會被認為是不健康的。默認情況下有三個設(shè)置會涉及到TTL,還是先來看代碼:

registry := consul.NewRegistry()

	regCheckFunc := func(ctx context.Context) error {
		fmt.Println(time.Now().Format("2006-01-02 15:04:05") + " do register check")
		if 1+1 == 2 {
			return nil
		}
		return errors.New("this not earth")
	}
	rpcServer := server.NewServer(
		server.Name("registry-consul.service"),
		server.Address("0.0.0.0:8001"),
		server.Registry(registry),
		server.RegisterCheck(regCheckFunc),
		server.RegisterInterval(10*time.Second),
		server.RegisterTTL(20*time.Second),
	)
	proto.RegisterHelloHandler(rpcServer, &Hello{})
	service := micro.NewService(
		micro.Server(rpcServer),
	//service.Init()
	if err := service.Run(); err != nil {
		log.Fatal(err)

關(guān)于這三個設(shè)置,這里簡單介紹下:

1、server.RegisterCheck(regCheckFunc) 服務(wù)刷新TTL之前,會調(diào)用一個函數(shù)檢查服務(wù)的狀態(tài),這個函數(shù)的返回值是error類型。默認的函數(shù)不進行任何檢查,直接返回nil,代表服務(wù)狀態(tài)正常;我們可以自己寫一個函數(shù),進行一些檢查邏輯,比如是否要下線維護。如果返回的error不是nil,go-micro會嘗試在Consul中注銷服務(wù),則調(diào)用方將不會再訪問到這個服務(wù)節(jié)點。

2、server.RegisterInterval(10*time.Second) 這個設(shè)置指定程序去刷新TLL的頻率。

3、server.RegisterTTL(20*time.Second) 這個設(shè)置指定TTL的生存周期,如果超過這個時間沒有刷新TTL,則Consul會認為服務(wù)是不健康。

另外需要注意不要使用service.Init(),因為這里邊會覆蓋 RegisterInterval 和 RegisterTTL 的設(shè)置,除非你不關(guān)心這兩個參數(shù)。關(guān)于這個問題可以參考:https://github.com/asim/go-micro/issues/2488

客戶端使用Consul

調(diào)用服務(wù)

為了使用Consul做服務(wù)發(fā)現(xiàn),需要為go-micro service顯式的指定Consul Registry。還是直接看代碼:

registry := consul.NewRegistry()

	service := micro.NewService(
		micro.Client(client.NewClient()),
		micro.Registry(registry),
	)
	service.Init()
	client := proto.NewHelloService("registry-consul.service", service.Client())
	rsp, err := client.Say(context.TODO(), &proto.SayRequest{Name: "BOSSMA"})
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(rsp)

代碼很簡單,指定consul作為服務(wù)發(fā)現(xiàn)組件后,調(diào)用服務(wù)的時候傳遞的服務(wù)名稱就會使用consul進行解析,獲取到IP、端口后,再進行實際調(diào)用。

發(fā)現(xiàn)過程

還是先來看張圖,從調(diào)用 XXXService 的方法 YYY 開始:

整個過程分為兩個大的步驟,第一步獲取要調(diào)用服務(wù)的地址,第二步通過http請求調(diào)用服務(wù)。我們重點看第一步通過Consul獲取服務(wù)這塊。

首先進入一個Selector,就是選擇器的意思。Selector首先看緩存中有沒有緩存請求服務(wù)的地址信息,如果沒有就去Consul查詢,查詢到之后再通過指定的選擇策略選出來一個地址,用于后續(xù)http請求。這里默認的選擇策略是隨機選擇,比如查詢到這個服務(wù)有三個部署節(jié)點,隨機策略會隨機返回其中某一個地址。

除了隨機策略,go-micro還提供了一個輪詢策略,這時候需要自己創(chuàng)建一個Selector:

registry := consul.NewRegistry()
	selector := selector.NewSelector(
		selector.SetStrategy(selector.RoundRobin),
		selector.Registry(registry),
	)

	service := micro.NewService(
		micro.Client(client.NewClient()),
		micro.Selector(selector),
		//micro.Registry(registry),
	)

另外從上面的示意圖中,我們可以看到Selector調(diào)用了Registry,所以這里創(chuàng)建Selector的時候,我們把Registry設(shè)置了進去,然后再把創(chuàng)建的Selector設(shè)置到Service中。其實還有另一種方式,把設(shè)置Registry放到設(shè)置Selector后邊,同樣可以把Registry注冊到Selector中,但是這樣比較隱晦,還需要注意設(shè)置順序,我不推薦。不過如果在Selector之外需要使用Registry的時候,還是需要使用micro.Registry(registry)進行注冊,這個例子中并沒有相關(guān)場景。

效果展示

先啟動服務(wù)端,然后啟動客戶端,截圖如下:

以上就是本文的主要內(nèi)容,如有錯漏歡迎反饋。

演示代碼已上傳到Github:https://github.com/bosima/go-demo/tree/main/go-micro-registry-consul

到此這篇關(guān)于go-micro使用Consul做服務(wù)發(fā)現(xiàn)的方法和原理的文章就介紹到這了,更多相關(guān)go micro Consul服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang中channel使用的一些小技巧

    Golang中channel使用的一些小技巧

    這篇文章主要介紹了Golang中channel使用的一些小技巧,本文講解了關(guān)閉2次、讀取的時候channel提前關(guān)閉了、向已經(jīng)關(guān)閉的channel寫數(shù)據(jù)等技巧及這實例代碼,需要的朋友可以參考下
    2015-07-07
  • Golang?channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù)詳解

    Golang?channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù)詳解

    這篇文章主要介紹了Golang?channel關(guān)閉后是否可以讀取剩余的數(shù)據(jù),文章通過一個測試例子給大家詳細的介紹了是否可以讀取剩余的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09
  • golang 切片截取參數(shù)方法詳解

    golang 切片截取參數(shù)方法詳解

    這篇文章主要介紹了golang 切片截取參數(shù)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Golang極簡入門教程(四):編寫第一個項目

    Golang極簡入門教程(四):編寫第一個項目

    這篇文章主要介紹了Golang極簡入門教程(四):編寫第一個項目,本文講解了workspace、包路徑、第一個可執(zhí)行命令等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 詳解在Go語言中如何實現(xiàn)枚舉類型

    詳解在Go語言中如何實現(xiàn)枚舉類型

    枚舉類型是一種常用的數(shù)據(jù)類型,用于表示一組有限的、預(yù)定義的、具名的常量值。而在?Go?語言里是沒有內(nèi)置枚舉類型的,所以本文將介紹如何實現(xiàn)?“枚舉類型”,需要的可以參考一下
    2023-04-04
  • golang jsoniter extension 處理動態(tài)字段的實現(xiàn)方法

    golang jsoniter extension 處理動態(tài)字段的實現(xiàn)方法

    這篇文章主要介紹了golang jsoniter extension 處理動態(tài)字段的實現(xiàn)方法,我們使用實例級別的 extension, 而非全局,可以針對不同業(yè)務(wù)邏輯有所區(qū)分,jsoniter 包提供了比較完善的定制能力,通過例子可以感受一下擴展性,需要的朋友可以參考下
    2023-04-04
  • golang中的select關(guān)鍵字用法總結(jié)

    golang中的select關(guān)鍵字用法總結(jié)

    這篇文章主要介紹了golang中的select關(guān)鍵字用法總結(jié),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • go mock模擬接口的實現(xiàn)

    go mock模擬接口的實現(xiàn)

    本文主要介紹了go mock模擬接口的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Go微服務(wù)項目配置文件的定義和讀取示例詳解

    Go微服務(wù)項目配置文件的定義和讀取示例詳解

    這篇文章主要為大家介紹了Go微服務(wù)項目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Mac上Go環(huán)境和VS Code的正確安裝與配置方法

    Mac上Go環(huán)境和VS Code的正確安裝與配置方法

    Go語言是一個新興的語言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個語言,Go語言提供了mac下安裝包,可直接下載安裝包點擊安裝
    2018-03-03

最新評論