golang 注冊和獲取consul服務(wù),api服務(wù)注冊獲取以及grpc注冊獲取

1.普通接口注冊服務(wù)

執(zhí)行后就會出現(xiàn)下面那個(gè)服務(wù),他這里會檢查這個(gè)服務(wù)是否可用问裕,不可用就會自動(dòng)剔除

package main

import (
    "fmt"
    "net/http"
    consulapi "github.com/hashicorp/consul/api"
)

const (
    consulAddress = "124.70.156.31:8500"
    localIP       = "124.70.156.31"
    localPort     = 3001
)

func consulRegister() {
    // 創(chuàng)建連接consul服務(wù)配置
    config := consulapi.DefaultConfig()
    config.Address = consulAddress
    client, err := consulapi.NewClient(config)
    if err != nil {
        fmt.Println("consul client error : ", err)
    }

    // 創(chuàng)建注冊到consul的服務(wù)到
    registration := new(consulapi.AgentServiceRegistration)
    registration.ID = "shitingbao"
    registration.Name = "service_shitingbao"http://根據(jù)這個(gè)名稱來找這個(gè)服務(wù)
    registration.Port = localPort
    registration.Tags = []string{"shitingbao_test_service"}//這個(gè)就是一個(gè)標(biāo)簽哥艇,可以根據(jù)這個(gè)來找這個(gè)服務(wù),相當(dāng)于V1.1這種
    registration.Address = localIP

    // 增加consul健康檢查回調(diào)函數(shù)
    check := new(consulapi.AgentServiceCheck)
    check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port)
    check.Timeout = "5s"                         //超時(shí)
    check.Interval = "5s"                        //健康檢查頻率
    check.DeregisterCriticalServiceAfter = "30s" // 故障檢查失敗30s后 consul自動(dòng)將注冊服務(wù)刪除
    registration.Check = check

    // 注冊服務(wù)到consul
    err = client.Agent().ServiceRegister(registration)
}

//Handler 3001
func Handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("you are visiting health check api:3001"))
}

//ServerLoad 啟動(dòng)
func ServerLoad() {
    consulRegister()
    //定義一個(gè)http接口
    http.HandleFunc("/", Handler)
    err := http.ListenAndServe(":3001", nil)
    if err != nil {
        fmt.Println("error: ", err.Error())
    }
}

2.grpc注冊入consul

grpc需要多做一步僻澎,因?yàn)閏onsul需要一個(gè)健康檢查,在api中驗(yàn)證是否可用是可以直接檢查就行了十饥,但是對于rpc的這種協(xié)議不一樣處理窟勃,這里需要寫一個(gè)自定義的檢查函數(shù),給consul檢查逗堵。這個(gè)函數(shù)需要實(shí)現(xiàn)consul包中的RegisterHealthServer接口秉氧,grpc服務(wù)的代碼就不展示了,這里展示了注冊grpc的過程

package main

import (
    "context"
    "fmt"
    "log"
    "net"
    stb_server "stb_consul/external_service/stb_server"
    "stb_consul/external_service/stbserver"

    "github.com/hashicorp/consul/api"
    "github.com/sirupsen/logrus"
    "google.golang.org/grpc"
    "google.golang.org/grpc/health/grpc_health_v1"
)

// HealthImpl 健康檢查實(shí)現(xiàn)
type HealthImpl struct{}

// Check 實(shí)現(xiàn)健康檢查接口蜒秤,這里直接返回健康狀態(tài)汁咏,這里也可以有更復(fù)雜的健康檢查策略,比如根據(jù)服務(wù)器負(fù)載來返回
func (h *HealthImpl) Check(ctx context.Context, req *grpc_health_v1.HealthCheckRequest) (*grpc_health_v1.HealthCheckResponse, error) {
    return &grpc_health_v1.HealthCheckResponse{
        Status: grpc_health_v1.HealthCheckResponse_SERVING,
    }, nil
}

//Watch 這個(gè)沒用作媚,只是為了讓HealthImpl實(shí)現(xiàn)RegisterHealthServer內(nèi)部的interface接口
func (h *HealthImpl) Watch(req *grpc_health_v1.HealthCheckRequest, w grpc_health_v1.Health_WatchServer) error {
    return nil
}

//grpc開啟
func externalServer() {
    lis, err := net.Listen("tcp", ":3001")
    if err != nil {
        logrus.Info("外置服務(wù)開啟失敗:", err)
        panic(err)
    }
    logrus.WithFields(logrus.Fields{
        "tcp": ":3001",
    }).Info("external server")
    s := grpc.NewServer()
    stbserver.RegisterStbServerServer(s, &stb_server.StbServe{})
    grpc_health_v1.RegisterHealthServer(s, &HealthImpl{})//比普通的grpc開啟多了這一步
    s.Serve(lis)
    log.Println("grpc start")
}

//grpc注冊進(jìn)consul
func grpcRegister() {
    config := api.DefaultConfig()
    config.Address = consulAddress
    client, err := api.NewClient(config)
    if err != nil {
        panic(err)
    }
    agent := client.Agent()

    reg := &api.AgentServiceRegistration{
        ID:      fmt.Sprintf("%v-%v-%v", "StbServe", localIP, localPort), // 服務(wù)節(jié)點(diǎn)的名稱
        Name:    fmt.Sprintf("grpc.health.v1.%v", "StbServe"),            // 服務(wù)名稱
        Tags:    []string{"StbServe"},                                    // tag攘滩,可以為空
        Port:    localPort,                                               // 服務(wù)端口
        Address: localIP,                                                 // 服務(wù) IP
        Check: &api.AgentServiceCheck{ // 健康檢查
            Interval: "5s", // 健康檢查間隔
            // grpc 支持,執(zhí)行健康檢查的地址纸泡,service 會傳到 Health.Check 函數(shù)中
            GRPC:                           fmt.Sprintf("%v:%v/%v", localIP, localPort, "StbServe"),
            DeregisterCriticalServiceAfter: "5s", // 注銷時(shí)間漂问,相當(dāng)于過期時(shí)間
        },
    }

    if err := agent.ServiceRegister(reg); err != nil {
        panic(err)
    }
}

func grpcLoad() {
    grpcRegister()
    externalServer()
}

3.服務(wù)查看

你可以在你的consul的UI中看見這個(gè)服務(wù)

image
image

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

發(fā)現(xiàn)服務(wù)中的代碼都是一樣的,如下

package main

import (
    "fmt"

    "github.com/hashicorp/consul/api"
    "github.com/sirupsen/logrus"
)

func client() {
    var lastIndex uint64
    config := api.DefaultConfig()
    config.Address = "124.70.156.31:8500" //consul server

    client, err := api.NewClient(config)
    if err != nil {
        fmt.Println("api new client is failed, err:", err)
        return
    }
    services, metainfo, err := client.Health().Service("service_shitingbao", "shitingbao_test_service", true, &api.QueryOptions{
        WaitIndex: lastIndex, // 同步點(diǎn)女揭,這個(gè)調(diào)用將一直阻塞蚤假,直到有新的更新
    })
    if err != nil {
        logrus.Panic("error retrieving instances from Consul:", err)
    }
    lastIndex = metainfo.LastIndex

    for _, service := range services {
        fmt.Println("service.Service.Address:", service.Service.Address, "service.Service.Port:", service.Service.Port)
    }
}

這里會輸出ServiceName為‘service_shitingbao’,tag標(biāo)簽為shitingbao_test_service的服務(wù)吧兔,這個(gè)service_shitingbao就是上面紅框里面的那個(gè)服務(wù)名稱磷仰,對應(yīng)的tag標(biāo)簽要對應(yīng)上,沒有就是空境蔼,不然獲取不到

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灶平,一起剝皮案震驚了整個(gè)濱河市伺通,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌民逼,老刑警劉巖泵殴,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異拼苍,居然都是意外死亡笑诅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門疮鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吆你,“玉大人,你說我怎么就攤上這事俊犯「径啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵燕侠,是天一觀的道長者祖。 經(jīng)常有香客問我,道長绢彤,這世上最難降的妖魔是什么七问? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茫舶,結(jié)果婚禮上械巡,老公的妹妹穿的比我還像新娘。我一直安慰自己饶氏,他們只是感情好讥耗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著疹启,像睡著了一般古程。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喊崖,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天籍琳,我揣著相機(jī)與錄音,去河邊找鬼贷祈。 笑死趋急,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的势誊。 我是一名探鬼主播呜达,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼粟耻!你這毒婦竟也來了查近?” 一聲冷哼從身側(cè)響起眉踱,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霜威,沒想到半個(gè)月后谈喳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈泼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年婿禽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大猛。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扭倾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出挽绩,到底是詐尸還是另有隱情膛壹,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布唉堪,位于F島的核電站模聋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏唠亚。R本人自食惡果不足惜链方,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趾撵。 院中可真熱鬧,春花似錦共啃、人聲如沸占调。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽究珊。三九已至,卻和暖如春纵苛,著一層夾襖步出監(jiān)牢的瞬間剿涮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工攻人, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留取试,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓怀吻,卻偏偏與公主長得像瞬浓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蓬坡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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