服務的註冊發現對於微服務來說是一個非常重要的環節,在單一架構應用中,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實踐微服務 -- 服務發現