天天看點

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

     服務的注冊與發現是微服務必不可少的功能,這樣系統才能有更高的性能,更高的可用性。go-micro架構的服務發現有自己能用的接口Registry。隻要實作這個接口就可以定制自己的服務注冊和發現。

    go-micro在用戶端做的負載,典型的Balancing-aware Client模式。

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

     服務端把服務的位址資訊儲存到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的詳細服務發現過程

go-micro 服務端注冊服務

     流程圖

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

     服務端看上去流程還是比較簡單的,當服務端調用Run()方法時,會調用service.Start()方法。這個除了監聽端口,啟動服務,還會把服務的ip端口号資訊,和所有的公開接口的中繼資料資訊儲存到我們選擇的Register伺服器上去。

     看上去沒有問題,但是,如果我們的節點發生故障,也是需要告訴Register把我們的節點資訊删除掉。

     Run()方法中有個go s.run(ex) 方法的調用,這個方法就是根據我們設定interval去重新注冊服務,當然比較保險的方式是我們把服務的ttl也設定上,這樣當服務在未知的情況下崩潰,到了ttl的時間Register服務也會自動把資訊删除掉。

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

    設定服務的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方法

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

    但是當你在執行service.Init()方法時

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

go-micro會把預設的selector替換成cacheSelector,具體的實作是在cmd.go的Before方法裡

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

cacheSelector 會把從Register裡擷取的主機資訊緩存起來。并設定逾時時間,如果逾時則重新擷取。在擷取主機資訊的時候他會單獨跑一個協程,去watch服務的注冊,如果有新節點發現,則加到緩存中,如果有節點故障則删除緩存中的節點資訊。當client還要根據selector選擇的主機選擇算法才能得到主機資訊,目前隻有兩種算法,循環和随機法。為了增加執行效率,很client端也會設定緩存連接配接池,這個點,以後會詳細說。

 是以大概的用戶端服務發現流程是下面這樣

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

     主要的調用過程都在Call方法内

go微服務架構go-micro深度學習(三) Registry服務的注冊和發現

主要的思路是

    從Selector裡得到選擇主機政策方法next。

    根據Retory是否重試調用服務,調用服務的過程是,從next 方法内得到主機,連接配接并傳輸資料 ,如果失敗則重試,重試時,會根據主機選擇政策方法next重新得到一個新的主機進行操作。

作者:李鵬

出處:http://www.cnblogs.com/li-peng/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。