go-micro+gin+consul微服務(wù)實戰(zhàn)之服務(wù)注冊與發(fā)現(xiàn)

在構(gòu)建微服務(wù)時窒篱,使用服務(wù)發(fā)現(xiàn)可以減少配置的復(fù)雜性,本文以go-micro為微服務(wù)框架配并,使用consul作為服務(wù)發(fā)現(xiàn)服務(wù)高镐,使用gin開發(fā)golang服務(wù)嫉髓。

使用gin 的原因是gin能夠很好的和go-micro進行集成邑闲。

本文主要介紹服務(wù)注冊和發(fā)現(xiàn)的實現(xiàn)

關(guān)于如何搭建consul服務(wù)可以移步:http://www.reibang.com/p/271d490929a5

本文默認以搭建好了consul服務(wù)苫耸,服務(wù)的地址是:192.168.109.131:8500
如果你搭建好了自己的consul服務(wù)儡陨,可以在瀏覽器內(nèi)輸入192.168.109.131:8500(地址根據(jù)自己的consul服務(wù)做調(diào)整),會看到如下界面:


圖片.png

這里我的consul服務(wù)啟用了 3個節(jié)點褐筛。

填坑

在開始寫代碼前渔扎,先給大家避一避坑信轿,目前go-micro已經(jīng)更新到v2版本财忽,此版本去除了對consul 的支持,但支持etcd即彪、mdns作為服務(wù)發(fā)現(xiàn)隶校,但是老版本的go-micro仍支持consul,但是有些地方做了調(diào)整绰疤。

首先舞终,需要go 1.13的支持敛劝,所以小伙伴們需要升級下golang

然后,在獲取go-micro庫時蛾方,不能使用這個指令了 go get -u github.com/micro/go-micro
      改為:go get -u github.com/micro/go-micro/v2
原來go-micro consul的支持已經(jīng)遷移到了go-plugins里面
我們的代碼里在導(dǎo)入consul庫時,也變?yōu)榱耍?"github.com/micro/go-plugins/registry/consul"
這個在下面的代碼里可以看到

然后,沒有安裝gin的同學(xué)唆垃,需要使用如下指令獲取下:
go get -u github.com/gin-gonic/gin

這些小編折騰了很久才搞明白辕万,這里先給大家提醒下,避免走我的老路

開擼

服務(wù)注冊

我們預(yù)設(shè)兩個server醉途,userserver和orderserver
下面開始上代碼:
userserver程序結(jié)果如下:

圖片.png

有兩個文件router.go和main.go
main.go代碼如下
main.go實現(xiàn)初始化路由隘擎,服務(wù)注冊

package main

import (
    "github.com/micro/go-micro/registry"http://注意這些地址變了
    "github.com/micro/go-micro/web"http://注意這些地址變了
    "github.com/micro/go-plugins/registry/consul"http://注意這些地址變了
    "userserver/routers"
)

var consulReg registry.Registry

func  init()  {
    //新建一個consul注冊的地址凉夯,也就是我們consul服務(wù)啟動的機器ip+端口
    consulReg = consul.NewRegistry(
        registry.Addrs("192.168.109.131:8500"),
    )
}

func main() {
    //初始化路由
    ginRouter := routers.InitRouters()

    //注冊服務(wù)
    microService:= web.NewService(
        web.Name("userserver"),
        //web.RegisterTTL(time.Second*30),//設(shè)置注冊服務(wù)的過期時間
        //web.RegisterInterval(time.Second*20),//設(shè)置間隔多久再次注冊服務(wù)
        web.Address(":18001"),
        web.Handler(ginRouter),
        web.Registry(consulReg),
        )

    microService.Run()
}

router.go代碼如下
router.go主要用來定義程序的api接口,使用gin開發(fā)

package routers

import "github.com/gin-gonic/gin"

func InitRouters() *gin.Engine {
    ginRouter := gin.Default()
    ginRouter.POST("/users/", func(context *gin.Context) {
        context.String(200, "get userinfos")
    })

    return ginRouter
}

注冊的代碼就寫好了震桶,啟動userserver蹲姐,我們在consul服務(wù)界面人柿,可以看到如下效果:


圖片.png

說明我們注冊成功了

服務(wù)發(fā)現(xiàn)

服務(wù)發(fā)現(xiàn)凫岖,就是從consul中獲取到我們注冊進去的服務(wù),這樣在調(diào)用別的服務(wù)時扎阶,就不用從配置文件獲取婶芭,直接查詢consul即可。

orderserver我們除了實現(xiàn)服務(wù)注冊外惰赋,也實現(xiàn)服務(wù)發(fā)現(xiàn)的功能
orderserver代碼結(jié)構(gòu)如下:


圖片.png

上代碼
main.go代碼如下

package main

import (
    "bytes"
    "fmt"
    "github.com/micro/go-micro/client/selector"
    "github.com/micro/go-micro/registry"
    "github.com/micro/go-micro/web"
    "github.com/micro/go-plugins/registry/consul"
    "net/http"
    "orderserver/routers"
    "time"
)

var consulReg registry.Registry

func init(){
    //新建一個consul注冊的地址赁濒,也就是我們consul服務(wù)啟動的機器ip+端口
    consulReg = consul.NewRegistry(
        registry.Addrs("192.168.109.131:8500"),
    )
}

func main() {
    //初始化路由
    ginRouter := routers.InitRouters()

    //注冊服務(wù)
    microService:= web.NewService(
        web.Name("orderserver"),
        //web.RegisterTTL(time.Second*30),//設(shè)置注冊服務(wù)的過期時間
        //web.RegisterInterval(time.Second*20),//設(shè)置間隔多久再次注冊服務(wù)
        web.Address(":18002"),
        web.Handler(ginRouter),
        web.Registry(consulReg),
        )

    //獲取服務(wù)地址
    hostAddress := GetServiceAddr("userserver")
    if len(hostAddress) <= 0{
        fmt.Println("hostAddress is null")
    }else{
        url := "http://"+ hostAddress + "/users"
        response, _ := http.Post(url, "application/json;charset=utf-8",bytes.NewBuffer([]byte("")))

        fmt.Println(response)
    }

    microService.Run()
}

func GetServiceAddr(serviceName string)(address string){
    var retryCount int
    for{
        servers,err :=consulReg.GetService(serviceName)
        if err !=nil {
            fmt.Println(err.Error())
        }
        var services []*registry.Service
        for _,value := range servers{
            fmt.Println(value.Name, ":", value.Version)
            services = append(services, value)
        }
        next := selector.RoundRobin(services)
        if node , err := next();err == nil{
            address = node.Address
        }
        if len(address) > 0{
            return
        }
        //重試次數(shù)++
        retryCount++
        time.Sleep(time.Second * 1)
        //重試5次為獲取返回空
        if retryCount >= 5{
            return
        }
    }
}

GetServiceAddr就是服務(wù)發(fā)現(xiàn)的代碼

首先挪拟,使用servers,err :=consulReg.GetService(serviceName)獲取注冊的服務(wù)
返回的servers是個slice

然后击你,使用next := selector.RoundRobin(services)獲取其中一個服務(wù)的信息

這里注意:
在老版本中可以直接使用selector.RoundRobin(services)丁侄,但是在v2版本中需要做個轉(zhuǎn)換處理:
var services []*registry.Service
for _,value := range servers{
    fmt.Println(value.Name, ":", value.Version)
    services = append(services, value)
}
因為使用的數(shù)據(jù)結(jié)構(gòu)不同,感興趣的可以細看下區(qū)別石景。

router.go代碼如下

package routers

import "github.com/gin-gonic/gin"

func InitRouters() *gin.Engine {
    ginRouter := gin.Default()
    ginRouter.POST("/orders/", func(context *gin.Context) {
        context.String(200, "get orderinfos")
    })

    return ginRouter
}

啟動oerderserver 我們就能獲取到userserver的地址拙吉,各位可以調(diào)試看下效果庐镐。

今天go-micro+gin+consul微服務(wù)實戰(zhàn)就介紹完了,是不是很簡單

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載怠堪,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者名眉。
  • 序言:七十年代末损拢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掏秩,更是在濱河造成了極大的恐慌荆姆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邮破,死亡現(xiàn)場離奇詭異抒和,居然都是意外死亡,警方通過查閱死者的電腦和手機摧莽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門范嘱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丑蛤,“玉大人撕阎,你說我怎么就攤上這事∶奕模” “怎么了镇匀?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵汗侵,是天一觀的道長。 經(jīng)常有香客問我发乔,道長雪猪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮官觅,結(jié)果婚禮上缰猴,老公的妹妹穿的比我還像新娘。我一直安慰自己闷堡,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布弯菊。 她就那樣靜靜地躺著踱阿,像睡著了一般软舌。 火紅的嫁衣襯著肌膚如雪才漆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天佛点,我揣著相機與錄音醇滥,去河邊找鬼。 笑死超营,一個胖子當著我的面吹牛鸳玩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播演闭,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼不跟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了米碰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤见间,失蹤者是張志新(化名)和其女友劉穎聊闯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米诉,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡菱蔬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了史侣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拴泌。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惊橱,靈堂內(nèi)的尸體忽然破棺而出蚪腐,到底是詐尸還是另有隱情,我是刑警寧澤税朴,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布回季,位于F島的核電站家制,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泡一。R本人自食惡果不足惜颤殴,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鼻忠。 院中可真熱鬧涵但,春花似錦、人聲如沸帖蔓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塑娇。三九已至澈侠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钝吮,已是汗流浹背埋涧。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工板辽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奇瘦,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓劲弦,卻偏偏與公主長得像耳标,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邑跪,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在構(gòu)建微服務(wù)時次坡,使用服務(wù)發(fā)現(xiàn)可以減少配置的復(fù)雜性,本文以go-micro為微服務(wù)框架画畅,使用etcd作為服務(wù)發(fā)現(xiàn)服務(wù)...
    鬼厲閱讀 2,843評論 0 2
  • 本文是基于上一篇【go-micro+gin+consul微服務(wù)實戰(zhàn)之服務(wù)注冊與發(fā)現(xiàn)】的砸琅,沒看過的同學(xué),請移步:ht...
    鬼厲閱讀 2,973評論 1 1
  • 久違的晴天轴踱,家長會症脂。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了淫僻。班主任說已經(jīng)安排了三個家長分享經(jīng)驗诱篷。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友雳灵。感恩相遇棕所!感恩不離不棄。 中午開了第一次的黨會悯辙,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評論 0 11
  • 可愛進取琳省,孤獨成精迎吵。努力飛翔,天堂翱翔岛啸。戰(zhàn)爭美好钓觉,孤獨進取。膽大飛翔坚踩,成就輝煌荡灾。努力進取,遙望瞬铸,和諧家園批幌。可愛游走...
    趙原野閱讀 2,730評論 1 1