最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

安裝Consul

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

這里提供一個(gè)通過(guò)docker快速安裝Consul的方式,當(dāng)然前提是你得安裝了docker。

執(zhí)行命令:

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

這會(huì)在docker容器中啟動(dòng)一個(gè)最新版本的Consul服務(wù),并將相關(guān)端口開(kāi)放給主機(jī)。

安裝Consul插件

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

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

服務(wù)端使用Consul

服務(wù)注冊(cè)

為了使用Consul做服務(wù)注冊(cè),需要為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)
	}
}

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

這里并沒(méi)有指定Consul的連接地址,因?yàn)榘凑胀扑]的Consul部署方式,服務(wù)所在機(jī)器或者容器中應(yīng)該部署一個(gè)Consul的客戶端,程序可以直接通過(guò) 127.0.0.1:8500 訪問(wèn)到它。如果要顯示指定,可以在NewRegistry時(shí)設(shè)置:

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

注冊(cè)過(guò)程

通過(guò)一張圖來(lái)看一下,go-micro注冊(cè)服務(wù)到Consul時(shí)都做了什么。

服務(wù)注冊(cè)關(guān)鍵是實(shí)現(xiàn)兩個(gè)動(dòng)作:

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

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

健康檢查

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

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)于這三個(gè)設(shè)置,這里簡(jiǎn)單介紹下:

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

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

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

另外需要注意不要使用service.Init(),因?yàn)檫@里邊會(huì)覆蓋 RegisterInterval 和 RegisterTTL 的設(shè)置,除非你不關(guān)心這兩個(gè)參數(shù)。關(guān)于這個(gè)問(wè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)

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

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

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

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

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

除了隨機(jī)策略,go-micro還提供了一個(gè)輪詢策略,這時(shí)候需要自己創(chuàng)建一個(gè)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的時(shí)候,我們把Registry設(shè)置了進(jìn)去,然后再把創(chuàng)建的Selector設(shè)置到Service中。其實(shí)還有另一種方式,把設(shè)置Registry放到設(shè)置Selector后邊,同樣可以把Registry注冊(cè)到Selector中,但是這樣比較隱晦,還需要注意設(shè)置順序,我不推薦。不過(guò)如果在Selector之外需要使用Registry的時(shí)候,還是需要使用micro.Registry(registry)進(jìn)行注冊(cè),這個(gè)例子中并沒(méi)有相關(guān)場(chǎng)景。

效果展示

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

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

演示代碼已上傳到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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 提升Go語(yǔ)言開(kāi)發(fā)效率的小技巧實(shí)例(GO語(yǔ)言語(yǔ)法糖)匯總

    提升Go語(yǔ)言開(kāi)發(fā)效率的小技巧實(shí)例(GO語(yǔ)言語(yǔ)法糖)匯總

    這篇文章主要介紹了提升Go語(yǔ)言開(kāi)發(fā)效率的小技巧匯總,也就是Go語(yǔ)言的語(yǔ)法糖,掌握好這些可以提高我們的開(kāi)發(fā)效率,需要的朋友可以參考下
    2022-11-11
  • 一篇文章說(shuō)清楚?go?get?使用私有庫(kù)的方法

    一篇文章說(shuō)清楚?go?get?使用私有庫(kù)的方法

    這篇文章主要介紹了go?get?如何使用私有庫(kù),本文會(huì)明確指出Git?、golang的配置項(xiàng),附送TortoiseGit?+?Git混合配置,需要的朋友可以參考下
    2022-09-09
  • Go實(shí)現(xiàn)文件上傳和下載

    Go實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了Go實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Go語(yǔ)言開(kāi)發(fā)k8s之ConfigMap操作解析

    Go語(yǔ)言開(kāi)發(fā)k8s之ConfigMap操作解析

    這篇文章主要為大家介紹了Go語(yǔ)言開(kāi)發(fā)k8s之ConfigMap操作示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 深入理解Go語(yǔ)言中接口的使用

    深入理解Go語(yǔ)言中接口的使用

    在現(xiàn)代編程語(yǔ)言中,接口是不可或缺的一個(gè)重要特性,這篇文章將為大家詳細(xì)介紹Go語(yǔ)言中的接口,從而能夠更好得使用Go語(yǔ)言,需要的可以參考一下
    2023-06-06
  • Golang?template?包基本原理分析

    Golang?template?包基本原理分析

    這篇文章主要為大家介紹了Golang?template?包基本原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 一文帶你掌握Golang中的類型斷言

    一文帶你掌握Golang中的類型斷言

    類型斷言是?Golang?中的一個(gè)非常重要的特性,使用類型斷言可以判斷一個(gè)接口的實(shí)際類型是否是預(yù)期的類型,以便進(jìn)行對(duì)應(yīng)的處理,下面就跟隨小編一起深入了解一下Golang中的類型斷言吧
    2024-01-01
  • Go語(yǔ)言字符串拼接方式與性能比較分析

    Go語(yǔ)言字符串拼接方式與性能比較分析

    這篇文章主要為大家介紹了Go語(yǔ)言字符串拼接方式與性能比較示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Mac上Go環(huán)境和VS Code的正確安裝與配置方法

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

    Go語(yǔ)言是一個(gè)新興的語(yǔ)言。下面介紹一下如何在Mac系統(tǒng)下安裝和使用這個(gè)語(yǔ)言,Go語(yǔ)言提供了mac下安裝包,可直接下載安裝包點(diǎn)擊安裝
    2018-03-03
  • 使用Golang生成壓縮文件的詳細(xì)教程

    使用Golang生成壓縮文件的詳細(xì)教程

    與其他語(yǔ)言一樣,內(nèi)置標(biāo)準(zhǔn)庫(kù)默認(rèn)支持文件壓縮功能,本文介紹Golang如何創(chuàng)建壓縮文件,增加一個(gè)或多個(gè)文件生成壓縮文件,也可以在壓縮文件中創(chuàng)建文件夾,用于對(duì)文件進(jìn)行分類管理,Golang標(biāo)準(zhǔn)庫(kù) archive/zip提供了創(chuàng)建和讀取壓縮文件功能,需要的朋友可以參考下
    2024-01-01

最新評(píng)論

罗平县| 修水县| 额济纳旗| 龙门县| 明溪县| 象州县| 塔城市| 鄱阳县| 逊克县| 库尔勒市| 卢湾区| 永仁县| 安平县| 高清| 宜兴市| 峨眉山市| 云龙县| 沙湾县| 噶尔县| 新干县| 西青区| 洛南县| 同德县| 习水县| 阳城县| 遂平县| 崇义县| 迭部县| 黎川县| 东光县| 商南县| 蒙阴县| 西和县| 郑州市| 天长市| 香格里拉县| 达日县| 唐河县| 南投市| 雷州市| 建德市|