一、go-micro入門
1. go-micro 簡介
⚫ Go Micro 是一個插件化的基礎框架,基於此可以構建微服務,Micro 的設計哲學是可插拔的插件化架構
⚫ 在架構之外,它默認實現了 consul 作為服務發現(2019 年源碼修改了默認使用mdns),通過 http 進行通信,通過 protobuf 和 json 進行編解碼
2. go-micro 的主要功能
⚫ 服務發現:自動服務注冊和名稱解析。服務發現是微服務開發的核心。當服務 A需要與服務 B 通話時,它需要該服務的位置。默認發現機制是多播 DNS(mdns),一種零配置系統。您可以選擇使用 SWIM 協議為 p2p 網絡設置八卦,或者為彈性雲原生設置設置 consul
⚫ 負載均衡:基於服務發現構建的客戶端負載均衡。一旦我們獲得了服務的任意數量實例的地址,我們現在需要一種方法來決定要路由到哪個節點。我們使用隨機散列負載均衡來提供跨服務的均勻分布,並在出現問題時重試不同的節點
⚫ 消息編碼:基於內容類型的動態消息編碼。客戶端和服務器將使用編解碼器和內容類型為您無縫編碼和解碼 Go 類型。可以編碼任何種類的消息並從不同的客戶端發送。客戶端和服務器默認處理此問題。這包括默認的protobuf 和 json
⚫ 請求/響應:基於 RPC 的請求/響應,支持雙向流。我們提供了同步通信的抽象。對服務的請求將自動解決,負載平衡,撥號和流式傳輸。啟用 tls 時,默認傳輸為 http/ 1.1 或 http2
⚫ Async Messaging:PubSub 是異步通信和事件驅動架構的一流公民。事件通知是微服務開發的核心模式。啟用 tls 時,默認消息傳遞是點對點 http / 1.1 或 http2
⚫ 可插拔接口:Go Micro 為每個分布式系統抽象使用 Go 接口,因此,這些接口是可插拔的,並允許 Go Micro 與運行時無關,可以插入任何基礎技術
◼ 插件地址:https://github.com/micro/go-plugins
3. go-micro 通信流程
⚫ Server 監聽客戶端的調用,和 Brocker 推送過來的信息進行處理。並且 Server 端需要向 Register 注冊自己的存在或消亡,這樣 Client 才能知道自己的狀態
⚫ Register 服務的注冊的發現,Client 端從 Register 中得到 Server 的信息,然后每次調用都根據算法選擇一個的 Server 進行通信,當然通信是要經過編碼/解碼,選擇傳輸協議等一系列過程的
⚫ 如果有需要通知所有的 Server 端可以使用 Brocker 進行信息的推送,Brocker 信息隊列進行信息的接收和發布
4. go-micro 核心接口
⚫ go-micro 之所以可以高度訂制和他的框架結構是分不開的,go-micro 由 8 個關鍵的interface 組成,每一個 interface 都可以根據自己的需求重新實現,這 8 個主要的inteface 也構成了 go-micro 的框架結構

二、Go Micro接口詳解
1. Transort 通信接口
⚫ 服務之間通信的接口,也就是服務發送和接收的最終實現方式,是由這些接口定制的
type Socket interface {
Recv(*Message) error
Send(*Message) error
Close() error
}
type Client interface {
Socket
}
type Listener interface {
Addr() string
Close() error
Accept(func(Socket)) error
}
type Transport interface {
Dial(addr string, opts ...DialOption) (Client, error)
Listen(addr string, opts ...ListenOption) (Listener, error)
String() string
}
2. Codec 編碼接口
⚫ go-micro 有很多種編碼解碼方式,默認的實現方式是protobuf,當然也有其他的實現方式,json
type Codec interface {
ReadHeader(*Message, MessageType) error
ReadBody(interface{}) error
Write(*Message, interface{}) error
Close() error
String() string
}
3. Registry 注冊接口
⚫ 服務的注冊和發現,目前實現的有 consul、mdns、etcd、zookeeper、kubernetes 等
type Registry interface {
Register(*Service, ...RegisterOption) error
Deregister(*Service) error
GetService(string) ([]*Service, error)
ListServices() ([]*Service, error)
Watch(...WatchOption) (Watcher, error)
String() string
Options() Options
}
4. Selector 負載均衡
⚫ 以 Registry 為基礎,Selector 是客戶端級別的負載均衡,當有客戶端向服務發送請求時,selector 根據不同的算法從 Registery 中的主機列表,得到可用的 Service 節點,進行通信,目前實現的有循環算法和隨機算法,默認的是隨機算法
type Selector interface {
Init(opts ...Option) error
Options() Options
// Select returns a function which should return the next node
Select(service string, opts ...SelectOption) (Next, error)
// Mark sets the success/error against a node
Mark(service string, node *registry.Node, err error)
// Reset returns state back to zero for a service
Reset(service string)
// Close renders the selector unusable
Close() error
// Name of the selector
String() string
}
5. Broker 發布訂閱接口
⚫ Broker 是消息發布和訂閱的接口。例如,因為服務的節點是不固定的,如果需要修改所有服務行為,可以使服務訂閱某個主題,當有信息發布時,所有的監聽服務都會收到信息,根據你的需要做相應的行為即可
type Broker interface {
Options() Options
Address() string
Connect() error
Disconnect() error
Init(...Option) error
Publish(string, *Message, ...PublishOption) error
Subscribe(string, Handler, ...SubscribeOption) (Subscriber, error)
String() string
}
6. Client 客戶端接口
⚫ Client 是請求服務的接口,他封裝Transport 和Codec 進行rpc 調用,也封裝了Brocker進行信息的發布
type Client interface {
Init(...Option) error
Options() Options
NewMessage(topic string, msg interface{}, opts ...MessageOption) Message
NewRequest(service, method string, req interface{}, reqOpts ...RequestOption) Request
Call(ctx context.Context, req Request, rsp interface{}, opts ...CallOption) error
Stream(ctx context.Context, req Request, opts ...CallOption) (Stream, error)
Publish(ctx context.Context, msg Message, opts ...PublishOption) error
String() string
}
7. Server 服務端接口
⚫ Server 監聽等待 rpc 請求,監聽 broker 的訂閱信息,等待信息隊列的推送等
type Server interface {
Options() Options
Init(...Option) error
Handle(Handler) error
NewHandler(interface{}, ...HandlerOption) Handler
NewSubscriber(string, interface{}, ...SubscriberOption) Subscriber
Subscribe(Subscriber) error
Register() error
Deregister() error
Start() error
Stop() error
String() string
}
8. Serveice 接口
⚫ Service 是 Client 和 Server 的封裝,他包含了一系列的方法使用初始值去初始化
type Service interface {
Init(...Option)
Options() Options
Client() client.Client
Server() server.Server
Run() error
String() string
}
