微服務架構攀登之路(五)之Go-micro入門


一、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 
} 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM