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