服務的註冊與發現是微服務必不可少的功能,這樣系統纔能有更高的性能,更高的可用性。go-micro框架的服務發現有本身能用的接口Registry。只要實現這個接口就能夠定製本身的服務註冊和發現。html
go-micro在客戶端作的負載,典型的Balancing-aware Client模式。java
服務端把服務的地址信息保存到Registry, 而後定時的心跳檢查,或者定時的從新註冊服務。客戶端監聽Registry,最好是把服務信息保存到本地,監聽服務的變更,更新緩存。當調用服務端的接口是時,根據客戶端的服務列表和負載算法選擇服務端進行通訊。算法
go-micro的能用Registry接口緩存
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 } type Watcher interface { // Next is a blocking call Next() (*Result, error) Stop() }
這個接口仍是很簡單明瞭的,看方法也大概能猜到主要的做用服務器
Register方法和Deregister是服務端用於註冊服務的,Watcher接口是客戶端用於監聽服務信息變化的。框架
接下來我以go-micro的etcdv3爲Registry的例給你們詳細講解一下go-micro的詳細服務發現過程微服務
流程圖性能
服務端看上去流程仍是比較簡單的,當服務端調用Run()方法時,會調用service.Start()方法。這個除了監聽端口,啓動服務,還會把服務的ip端口號信息,和全部的公開接口的元數據信息保存到咱們選擇的Register服務器上去。學習
看上去沒有問題,可是,若是咱們的節點發生故障,也是須要告訴Register把咱們的節點信息刪除掉。spa
Run()方法中有個go s.run(ex) 方法的調用,這個方法就是根據咱們設置interval去從新註冊服務,固然比較保險的方式是咱們把服務的ttl也設置上,這樣當服務在未知的狀況下崩潰,到了ttl的時間Register服務也會自動把信息刪除掉。
設置服務的ttl和 interval
// 初始化服務 service := micro.NewService( micro.Name(common.ServiceName), micro.RegisterTTL(time.Second*30), micro.RegisterInterval(time.Second*20), micro.Registry(reg), )
ttl就是註冊服務的過時時間,interval就是間隔多久再次註冊服務。若是系統崩潰,過時時間也會把服務刪除掉。客戶端固然也會有相應的判斷,下面會詳細解說
客戶端的服務發現要步驟多一些,但並不複雜,他涉及到服務選擇Selector和服務發現Register兩部分。
Selector是基於服務發現的,根據你選擇的主機選擇算法,返回主機的信息。默認的狀況,go-micro是每次要獲得服務器主機的信息都要去Register去獲取。可是查看cmd.go的源碼你會發現默認初始化的值,selector的默認flag是cache。DefaultSelectors裏的cache對應的就是初始化cacheSelector方法
可是當你在執行service.Init()方法時
go-micro會把默認的selector替換成cacheSelector,具體的實現是在cmd.go的Before方法裏
cacheSelector 會把從Register裏獲取的主機信息緩存起來。並設置超時時間,若是超時則從新獲取。在獲取主機信息的時候他會單獨跑一個協程,去watch服務的註冊,若是有新節點發現,則加到緩存中,若是有節點故障則刪除緩存中的節點信息。當client還要根據selector選擇的主機選擇算法才能獲得主機信息,目前只有兩種算法,循環和隨機法。爲了增長執行效率,很client端也會設置緩存鏈接池,這個點,之後會詳細說。想學習更多java知識的朋友能夠進羣:874811168 一塊兒學習 還有全套的免費資料領取
因此大概的客戶端服務發現流程是下面這樣
主要的調用過程都在Call方法內
主要的思路是
從Selector裏獲得選擇主機策略方法next。
根據Retory是否重試調用服務,調用服務的過程是,從next 方法內獲得主機,鏈接並傳輸數據 ,若是失敗則重試,重試時,會根據主機選擇策略方法next從新獲得一個新的主機進行操做。
出處:https://www.cnblogs.com/li-peng/p/9689786.html