golang consul-grpc 服務註冊與發現

來源:互聯網
上載者:User

在微服務架構裡面,每個小服務都是由很多節點群組成,節點的添加刪除故障希望能對下遊透明,因此有必要引入一種服務的自動註冊和發現機制,而 consul 提供了完整的解決方案,並且內建了對 GRPC 以及 HTTP 服務的支援

總體架構

  • 服務調用: client 直連 server 調用服務
  • 服務註冊: 服務端將服務的資訊註冊到 consul 裡
  • 服務發現: 用戶端從 consul 裡探索服務資訊,主要是服務的地址
  • 健全狀態檢查: consul 檢查伺服器的健康狀態

服務註冊

服務端將服務資訊註冊到 consul 裡,這個註冊可以在服務啟動可以提供服務的時候完成

完整代碼參考: https://github.com/hatlonely/...

config := api.DefaultConfig()config.Address = r.Addressclient, err := api.NewClient(config)if err != nil {    panic(err)}agent := client.Agent()IP := localIP()reg := &api.AgentServiceRegistration{        ID:      fmt.Sprintf("%v-%v-%v", r.Service, IP, r.Port), // 服務節點的名稱        Name:    fmt.Sprintf("grpc.health.v1.%v", r.Service),    // 服務名稱        Tags:    r.Tag,                                          // tag,可以為空白        Port:    r.Port,                                         // 服務連接埠        Address: IP,                                             // 服務 IP        Check: &api.AgentServiceCheck{     // 健全狀態檢查            Interval: r.Interval.String(), // 健全狀態檢查間隔            // grpc 支援,執行健全狀態檢查的地址,service 會傳到 Health.Check 函數中            GRPC:     fmt.Sprintf("%v:%v/%v", IP, r.Port, r.Service),             DeregisterCriticalServiceAfter: r.DeregisterCriticalServiceAfter.String(), // 登出時間,相當於到期時間        },    }if err := agent.ServiceRegister(reg); err != nil {    panic(err)}

服務發現

用戶端從 consul 裡探索服務資訊,主要是服務的地址

完整代碼參考: https://github.com/hatlonely/...

services, metainfo, err := w.client.Health().Service(w.service, "", true, &api.QueryOptions{    WaitIndex: w.lastIndex, // 同步點,這個調用將一直阻塞,直到有新的更新})if err != nil {    logrus.Warn("error retrieving instances from Consul: %v", err)}w.lastIndex = metainfo.LastIndexaddrs := map[string]struct{}{}for _, service := range services {    addrs[net.JoinHostPort(service.Service.Address, strconv.Itoa(service.Service.Port))] = struct{}{}}

健全狀態檢查

consul 檢查伺服器的健康狀態,consul 用 google.golang.org/grpc/health/grpc_health_v1.HealthServer 介面,實現了對 grpc健全狀態檢查的支援,所以我們只需要實現先這個介面,consul 就能利用這個介面作健全狀態檢查了

完整代碼參考: https://github.com/hatlonely/...

// HealthImpl 健全狀態檢查實現type HealthImpl struct{}// Check 實現健全狀態檢查介面,這裡直接返回健康狀態,這裡也可以有更複雜的健全狀態檢查策略,比如根據伺服器負載來返回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}grpc_health_v1.RegisterHealthServer(server, &HealthImpl{})

參考連結

  • 完整工程代碼: https://github.com/hatlonely/...
  • consul 健全狀態檢查 api: https://www.consul.io/api/age...
  • consul 服務註冊 api: https://www.consul.io/api/age...
  • grpc 健全狀態檢查: https://github.com/grpc/grpc/...
轉載請註明出處
本文連結:http://www.hatlonely.com/2018...
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.