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

在構(gòu)建微服務(wù)時株婴,使用服務(wù)發(fā)現(xiàn)可以減少配置的復(fù)雜性溺欧,本文以go-micro為微服務(wù)框架揖铜,使用etcd作為服務(wù)發(fā)現(xiàn)服務(wù)茴丰,使用gin開發(fā)golang服務(wù)。

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

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

關(guān)于如何搭建etcd服務(wù)可以看歷史文章

本文默認(rèn)以搭建好了etcd服務(wù)贿肩,服務(wù)的地址是:192.168.109.131:12379
如果你搭建好了自己的etcd服務(wù),可以按照上面文章的步驟做失仁,會看到如下界面:


圖片.png

這里我的etcd服務(wù)啟用了 3個節(jié)點尸曼。

開擼

服務(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-micro/registry/etcd"http://
    "userserver/routers"
)

var etcdReg registry.Registry

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

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

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

    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茬射,我們在micro的服務(wù)界面,可以看到如下效果:


圖片.png

說明我們注冊成功了

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

服務(wù)發(fā)現(xiàn)冒签,就是從etcd中獲取到我們注冊進去的服務(wù)在抛,這樣在調(diào)用別的服務(wù)時,就不用從配置文件獲取萧恕,直接查詢etcd即可刚梭。

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-micro/registry/etcd"
    "net/http"
    "orderserver/routers"
    "time"
)

var etcdReg registry.Registry

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

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

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

    //獲取服務(wù)地址
    hostAddress := GetServiceAddr("api.tutor.com.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 :=etcdReg.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)不同衅金,感興趣的可以細(xì)看下區(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+etcd微服務(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é)果婚禮上蠕蚜,老公的妹妹穿的比我還像新娘尚洽。我一直安慰自己,他們只是感情好靶累,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布腺毫。 她就那樣靜靜地躺著,像睡著了一般挣柬。 火紅的嫁衣襯著肌膚如雪潮酒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天凛忿,我揣著相機與錄音澈灼,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛叁熔,可吹牛的內(nèi)容都是我干的委乌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼荣回,長吁一口氣:“原來是場噩夢啊……” “哼遭贸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起心软,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤壕吹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后删铃,有當(dāng)?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
  • 正文 我出身青樓樱溉,卻偏偏與公主長得像挣输,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子福贞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 本文是基于上一篇【go-micro+gin+consul微服務(wù)實戰(zhàn)之服務(wù)注冊與發(fā)現(xiàn)】的撩嚼,沒看過的同學(xué),請移步:ht...
    鬼厲閱讀 2,973評論 1 1
  • 在我們使用go-micro框架時挖帘,會用到其api網(wǎng)關(guān)功能完丽。本文以etcd作為服務(wù)注冊和發(fā)現(xiàn)工具,實現(xiàn)通過api網(wǎng)關(guān)...
    鬼厲閱讀 3,831評論 0 4
  • 久違的晴天拇舀,家長會逻族。 家長大會開好到教室時,離放學(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