Go實踐微服務 -- 服務發現

來源:互聯網
上載者:User

服務的註冊發現對於微服務來說是一個非常重要的環節,在單一架構應用中,service之間的互相調用,通過一個固定的host和port來發起REST或者RPC來調用,但是在微服務架構中,各個服務往往是動態變化的,所以需要一個服務發現機制來發送用戶端的請求到動態service執行個體中去。

在利用go micro來實現服務發現便利很多,micro中預設支援使用 Consul 來做服務發現,當然它使用外掛程式機制(go-plugins)還支援 Etcd, Gossip, NATS等其他的第三方服務註冊發現工具。在每個服務啟動的時候,都將自己註冊到registry上,退出時也自動解註冊,具體實現我們可以來看一下go-micro/service.go的相關程式碼片段:

......func (s *service) run(exit chan bool) {    if s.opts.RegisterInterval <= time.Duration(0) {        return    }    //定時註冊自己    t := time.NewTicker(s.opts.RegisterInterval)    for {        select {        case <-t.C:            err := s.opts.Server.Register()            if err != nil {                log.Log("service run Server.Register error: ", err)            }        case <-exit:            t.Stop()            return        }    }}......func (s *service) Start() error {    for _, fn := range s.opts.BeforeStart {        if err := fn(); err != nil {            return err        }    }    if err := s.opts.Server.Start(); err != nil {        return err    }    // Run() 調用中也會結果run來調到這裡來註冊    if err := s.opts.Server.Register(); err != nil {        return err    }    for _, fn := range s.opts.AfterStart {        if err := fn(); err != nil {            return err        }    }    return nil}func (s *service) Stop() error {    var gerr error    for _, fn := range s.opts.BeforeStop {        if err := fn(); err != nil {            gerr = err        }    }   // 退出時自動解除註冊    if err := s.opts.Server.Deregister(); err != nil {        return err    }    if err := s.opts.Server.Stop(); err != nil {        return err    }    for _, fn := range s.opts.AfterStop {        if err := fn(); err != nil {            gerr = err        }    }    return gerr}......

關於Consul的相關使用可以參考 《Consul 簡介和快速入門》,下面主要來利用一個酒店預訂的樣本來看下Go Micro如何使用Consul的叢集來做服務發現。

樣本中會使用到一個 Micro API,它是Micro組件中的一個微服務API Gateway的實現,API Gateway模式可以為服務提供一個入口,該HTTP入口動態路由到合適的後端service,利用它進行服務發現,Server Load Balancer,編碼和基於RPC的通訊。

Micro API提供的HTTP API 如下 :

- /[service]/[method]    # HTTP路徑動態映射到services- /rpc # 通過名稱和方法顯示調用後端service

在樣本中使用 Micro API 的 RPC Handler,它是go-micro用戶端將請求主體轉寄為RPC請求的預設處理常式的替代方案,具體Micro API的使用和REST映射規則可以查看文檔https://micro.mu/docs/api.html

該酒店預定服務利用了官方 micro/examples中的booking樣本改寫, 具體代碼 => https://github.com/yuansir/go...

.├── README.md├── api│   └── hotel   # booking service├── data    # data│   ├── bindata.go│   ├── customers.json│   ├── locations.json│   ├── profiles.json│   └── rates.json├── docker-compose.yml # docker compose file└── srv # services    ├── auth    # auth token servce    ├── geo     # geo service    ├── profile # profile service    └── rate    # rate service

docker-compose.yml

version: '3'services:  consul-agent-1: &consul-agent    image: consul:latest    networks:      - consul-cluster    command: "agent -retry-join consul-server-bootstrap -client 0.0.0.0"  consul-agent-2:    <<: *consul-agent  consul-agent-3:    <<: *consul-agent  consul-server-1: &consul-server    <<: *consul-agent    command: "agent -server -retry-join consul-server-bootstrap -client 0.0.0.0"  consul-server-2:    <<: *consul-server  consul-server-bootstrap:    <<: *consul-agent    ports:      - "8400:8400"      - "8500:8500"      - "8600:8600"      - "8600:8600/udp"    command: "agent -server -bootstrap-expect 3 -ui -client 0.0.0.0"  auth:    build: ./srv/auth    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  geo:    build: ./srv/geo    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  profile:    build: ./srv/profile    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  rate:    build: ./srv/rate    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap  api:    build: ./api/hotel    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500    links:      - consul-server-bootstrap      - auth      - geo      - profile      - rate  micro:    networks:      - consul-cluster    command: --registry_address=consul-server-bootstrap:8500  api --handler=rpc    image: microhq/micro:latest    links:      - consul-server-bootstrap      - api    ports:      - "8080:8080"networks:  consul-cluster:

consul每個資料中心至少必須擁有一台server,建議在一個叢集中有3或者5個server.部署單一的server,在出現失敗時會不可避免的造成資料丟失.-bootstrap-expect 選項提示Consul我們期待加入的server節點的數量。每一個服務的--registry_address就是設定註冊到的服務發現註冊表地址。

docker-compose up 後可以通過consul 的web ui來查看Service的狀態。

轉載請註明: 轉載自Ryan是菜鳥 | LNMP技術棧筆記

如果覺得本篇文章對您十分有益,何不 打賞一下

本文連結地址: Go實踐微服務 -- 服務發現

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.