最近完成了公司租房微服務項目,由於使用 go-micro v3遇到了不少的問題,在這里利用一個實戰項目幫助大家融會貫通的使用 go-micro v3
另外,由於 Micro3.0直接放棄維護 go-micro,所以網上很多文章都是已經過時的了。
源碼地址
系列文章
- 微服務實戰Go Micro v3 系列(一)- 基礎篇
- 微服務實戰Go Micro v3 系列(二)- HelloWorld
- 微服務實戰Go-Micro v3 系列(三)- 啟動HTTP服務
- 微服務實戰Go Micro v3 系列(四)- 事件驅動(Pub/Sub)
- 微服務實戰Go Micro v3 系列(五)- 注冊和配置中心
- 微服務實戰Go Micro v3 系列(六)- 綜合篇(愛租房項目)
Go Micro 簡介與設計理念
Go Micro 是一個基於 Go 語言編寫的、用於構建微服務的基礎框架,提供了分布式開發所需的核心組件,包括 RPC 和事件驅動通信等。
它的設計哲學是「可插拔」的插件化架構,其核心專注於提供底層的接口定義和基礎工具,這些底層接口可以兼容各種實現。例如 Go Micro 默認通過 consul 進行服務發現,通過 HTTP 協議進行通信,通過 protobuf 和 json 進行編解碼,以便你可以基於這些開箱提供的組件快速啟動,但是如果需要的話,你也可以通過符合底層接口定義的其他組件替換默認組件,比如通過 etcd 或 zookeeper 進行服務發現,這也是插件化架構的優勢所在:不需要修改任何底層代碼即可實現上層組件的替換。
Go Micro 基礎架構介紹
Go Micro 框架的基礎架構如下,由 8 個核心接口組成,每個接口都有默認實現:
它的設計哲學是「可插拔」的插件化架構,其核心專注於提供底層的接口定義和基礎工具,這些底層接口可以兼容各種實現。例如 Go Micro 默認通過 consul 進行服務發現,通過 HTTP 協議進行通信,通過 protobuf 和 json 進行編解碼,以便你可以基於這些開箱提供的組件快速啟動,但是如果需要的話,你也可以通過符合底層接口定義的其他組件替換默認組件,比如通過 etcd 或 zookeeper 進行服務發現,這也是插件化架構的優勢所在:不需要修改任何底層代碼即可實現上層組件的替換。
- 最頂層的 Service 接口是構建服務的主要組件,它把底層的各個包需要實現的接口,做了一次封裝,包含了一系列用於初始化 Service 和 Client 的方法,使我們可以很簡單的創建一個 RPC 服務;
- Client 是請求服務的接口,從 Registry 中獲取 Server 信息,然后封裝了 Transport 和 Codec 進行 RPC 調用,也封裝了 Brocker 進行消息發布,默認通過 RPC 協議進行通信,也可以基於 HTTP 或 gRPC;
- Server 是監聽服務調用的接口,也將以接收 Broker 推送過來的消息,需要向 Registry 注冊自己的存在與否,以便客戶端發起請求,和 Client 一樣,默認基於 RPC 協議通信,也可以替換為 HTTP 或 gRPC;
- Broker 是消息發布和訂閱的接口,默認實現是基於 HTTP,在生產環境可以替換為 Kafka、RabbitMQ 等其他組件實現;
- Codec 用於解決傳輸過程中的編碼和解碼,默認實現是 protobuf,也可以替換成 json、mercury 等;
- Registry 用於實現服務的注冊和發現,當有新的 Service 發布時,需要向 Registry 注冊,然后 Registry 通知客戶端進行更新,Go Micro 默認基於 consul 實現服務注冊與發現,當然,也可以替換成 etcd、zookeeper、kubernetes 等;
- Selector 是客戶端級別的負載均衡,當有客戶端向服務端發送請求時,Selector 根據不同的算法從 Registery 的主機列表中得到可用的 Service 節點進行通信。目前的實現有循環算法和隨機算法,默認使用隨機算法,另外,Selector 還有緩存機制,默認是本地緩存,還支持 label、blacklist 等方式;
- Transport 是服務之間通信的接口,也就是服務發送和接收的最終實現方式,默認使用 HTTP 同步通信,也可以支持 TCP、UDP、NATS、gRPC 等其他方式。
Go Micro 官方創建了一個 Plugins 倉庫,用於維護 Go Micro 核心接口支持的可替換插件:
各個組件接口之間的關系可以通過下圖串聯:
小結
通過上述介紹,可以看到,Go Micro 簡單輕巧、易於上手、功能強大、擴展方便,是基於 Go 語言進行微服務架構時非常值得推薦的一個 RPC 框架,基於其核心功能及插件,我們可以輕松解決之前討論的微服務架構引入的需要解決的問題:
- 服務接口定義:通過 Transport、Codec 定義通信協議及數據編碼;
- 服務發布與調用:通過 Registry 實現服務注冊與訂閱,還可以基於 Selector 提高系統可用性;
- 服務監控、服務治理、故障定位:通過 Plugins Wrapper 中間件來實現。
接下來,我們將基於 Go Micro 微服務框架演示如何基於 Go 落地微服務架構。
參考鏈接