go-micro+gin+consul微服務(wù)實戰(zhàn)之使用http api請求

本文是基于上一篇【go-micro+gin+consul微服務(wù)實戰(zhàn)之服務(wù)注冊與發(fā)現(xiàn)】的藤韵,沒看過的同學(xué),請移步:http://www.reibang.com/p/757dc1bb3930

我們在使用微服務(wù)構(gòu)建系統(tǒng)時躲查,必然會用到http api它浅,下面介紹下,在如何使用go-micro自帶的http庫構(gòu)建http api 請求

我們還使用上一篇【go-micro+gin+consul微服務(wù)實戰(zhàn)之服務(wù)注冊與發(fā)現(xiàn)】中的orderserver和userserver作為示例镣煮。

看過上一篇的姐霍,就會注意到我們有一段代碼使用了http請求,如下:

//獲取服務(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)
   }

這里我們使用的是 golang的【net/http】包典唇,來實現(xiàn)的镊折,過程相對復(fù)雜,因為需要使用GetServiceAddr("userserver")現(xiàn)獲取到userserver的地址介衔。
在GetServiceAddr中我們使用for的方式來獲取恨胚,代碼復(fù)雜,如下:

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
        }
    }
}

下面我們使用go-micro中自帶的http包來實現(xiàn)http api請求
設(shè)計的包有

"github.com/micro/go-micro/client"
"github.com/micro/go-micro/client/selector"
"github.com/micro/go-plugins/client/http"

實現(xiàn)代碼如下:

func main() {
   //初始化路由
   ginRouter := routers.InitRouters()
   //新建一個consul注冊的地址炎咖,也就是我們consul服務(wù)啟動的機器ip+端口
   consulReg = consul.NewRegistry(
       registry.Addrs("192.168.109.131:8500"),
   )

   //注冊服務(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),
       )

   microselector := selector.NewSelector(
       selector.Registry(consulReg),//傳入consul注冊
       selector.SetStrategy(selector.RoundRobin),//指定查詢機制
   )
   microClient := microhttp.NewClient(
       client.Selector(microselector),
       client.ContentType("application/json"))
   req:=microClient.NewRequest("userserver", "/users",map[string]string{})
   var resp map[string]interface{}

   err := microClient.Call(context.Background(), req, &resp)
   if err == nil{
       fmt.Println(resp)
   }

   microService.Run()
}

核心代碼是這段

microselector := selector.NewSelector(
        selector.Registry(consulReg),//傳入consul注冊
        selector.SetStrategy(selector.RoundRobin),//指定查詢機制
    )
    microClient := microhttp.NewClient(
        client.Selector(microselector),
        client.ContentType("application/json"))
    req:=microClient.NewRequest("userserver", "/users",map[string]string{})
    var resp map[string]interface{}

    err := microClient.Call(context.Background(), req, &resp)
    if err == nil{
        fmt.Println(resp)
    }

這里需要注意赃泡,這種方式是依賴consul的,consulReg = consul.NewRegistry( registry.Addrs("192.168.109.131:8500"), )

這種實現(xiàn)共分為3步

第一步乘盼,構(gòu)建selectort升熊,通過指定selector.Registry(consulReg)就會去consul服務(wù)請求服務(wù)的地址;selector.SetStrategy(selector.RoundRobin)是指定獲取服務(wù)的策略緯輪詢的方式
第二步绸栅,構(gòu)建request請求级野,這里指定selector和ContentType,請求的服務(wù)名和接口名粹胯,map[string]string{}為請求參數(shù)蓖柔,這里我們傳空
第三步,請求接口风纠,調(diào)用Call函數(shù)况鸣,傳入請求,第一個參數(shù)默認傳空竹观,第三個參數(shù)是響應(yīng)的返回數(shù)據(jù)懒闷,這個是根據(jù)我們返回的數(shù)據(jù)格式定義的,我們在userserver的/users接口中返回的數(shù)據(jù)如下:
"status": "1",
"data":   "get userinfos",
所以這里我們把resp定義為map[string]interface{}栈幸,你也可以根據(jù)自己的返回定義

到這里就完成請求http api 的實現(xiàn),運行一下就可以看到效果

map[data:get userinfos status:1]

orderserver的完整代碼如下帮辟,userserver的可以在【go-micro+gin+consul微服務(wù)實戰(zhàn)之服務(wù)注冊與發(fā)現(xiàn)】中查看
orderserver代碼結(jié)構(gòu)如下:

image

main.go代碼如下

package main

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

var consulReg registry.Registry

func init(){

}

func main() {
    //初始化路由
    ginRouter := routers.InitRouters()
    //新建一個consul注冊的地址速址,也就是我們consul服務(wù)啟動的機器ip+端口
    consulReg = consul.NewRegistry(
        registry.Addrs("192.168.109.131:8500"),
    )

    //注冊服務(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),
        )

    microselector := selector.NewSelector(
        selector.Registry(consulReg),//傳入consul注冊
        selector.SetStrategy(selector.RoundRobin),//指定查詢機制
    )
    microClient := microhttp.NewClient(
        client.Selector(microselector),
        client.ContentType("application/json"))
    req:=microClient.NewRequest("userserver", "/users",map[string]string{})
    var resp map[string]interface{}

    err := microClient.Call(context.Background(), req, &resp)
    if err == nil{
        fmt.Println(resp)
    }

    microService.Run()
}

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
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者由驹。
  • 序言:七十年代末芍锚,一起剝皮案震驚了整個濱河市昔园,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌并炮,老刑警劉巖默刚,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逃魄,居然都是意外死亡荤西,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門伍俘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邪锌,“玉大人,你說我怎么就攤上這事癌瘾∶俜幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵妨退,是天一觀的道長妇萄。 經(jīng)常有香客問我,道長咬荷,這世上最難降的妖魔是什么冠句? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮萍丐,結(jié)果婚禮上轩端,老公的妹妹穿的比我還像新娘。我一直安慰自己逝变,他們只是感情好基茵,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著壳影,像睡著了一般拱层。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴咧,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天根灯,我揣著相機與錄音,去河邊找鬼掺栅。 笑死烙肺,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的氧卧。 我是一名探鬼主播桃笙,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沙绝!你這毒婦竟也來了搏明?” 一聲冷哼從身側(cè)響起鼠锈,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎星著,沒想到半個月后购笆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡虚循,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年同欠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮丰。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡行您,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剪廉,到底是詐尸還是另有隱情娃循,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布斗蒋,位于F島的核電站捌斧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏泉沾。R本人自食惡果不足惜捞蚂,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望跷究。 院中可真熱鬧姓迅,春花似錦、人聲如沸俊马。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柴我。三九已至解寝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間艘儒,已是汗流浹背聋伦。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留界睁,地道東北人觉增。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像翻斟,于是被迫代替她去往敵國和親抑片。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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