(四)go-kit服務註冊與發現

前言

爲什麼需要服務註冊與發現?
在微服務架構下,原單體服務被拆分爲多個服務獨立部署,維護數量過多的服務地址,運維人員無法高效工作。所以,在微服務架構中引入了服務註冊中心,用於接受和維護各個服務地址的地址信息。客戶端或者網關可以通過註冊中心查詢目標服務地址,動態實現服務訪問,並且在此基礎上實現服務負載均衡。
本文代碼地址:gtihub地址

1. 啓動consul鏡像

本文基於consul進行服務註冊,先基於docker啓動一個consul,在docker目錄下新建docker-compose-consul.yml

version: '2'

services:
  consul:
    image: progrium/consul:latest
    ports:
      - 8400:8400
      - 8500:8500
      - 8600:53/udp
    hostname: consulserver
    command: -server -bootstrap -ui-dir /ui

2. 啓動docker

在終端切換至項目目錄,執行以下命令:

sudo docker-compose -f docker/docker-compose-consul.yml up

3. 瀏覽器訪問

通過瀏覽器訪問http://localhost:8500,確認consul是否啓動成功

4. 服務註冊

  • 從main.go裏面看得出來55行創建了註冊對象,這裏面提供了一個/health的接口用於供consul對服務接口進行健康檢查,所以要在go kit實現getUserName接口一樣去實現health的接口
  • 然後在60行和73行分別執行了當前服務的register和unregister,在接口啓動前註冊服務,接口關閉或者異常退出的時候註銷服務
  • 然後在/cell-register/register目錄下運行go run main.go -consulHost localhost -consulPort 8500 -serviceHost 192.168.192.145 -servicePort 8000,就將我們的服務註冊到上一步啓動的consul裏面了,可以通過瀏覽器頁面看到userservice已經註冊了,並且服務端也打出了consul調用服務端health check的日誌

5. 服務發現

  • 通過目錄對比可以發現,discover和register的不同就是用factory.go替代了service.go,service.go裏面就是針對user接口創建factory
  • endpoint.go裏面的MakeDiscoverEndpoint()方法通過onsul.Client創建服務發現Endpoint,go-kit 的kit/sd/Endpointer提供了一套服務發現機制,們需要通過Endpointer來實現服務發現功能。在微服務模式下,同一個服務可能存在多個實例,所以需要通過負載均衡機制完成實例選擇,這裏使用go-kit工具集中的kit/sd/lb組件(該組件實現RoundRibbon,並具備Retry功能)
  • transport.go裏面的MakeHttpHandler()方法還是和以前一樣,提供路由轉發和轉碼request和response
  • 啓動discover:
然後在/cell-register/discover目錄下運行`go run main.go -consulHost localhost -consulPort 8500`,這個服務就成功調用了register註冊的user服務的getUserName接口了,並且通過9001端口暴露出去成爲一個新的接口,可以訪問localhost:9001/user/1獲取結果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章