go-micro registry 服務的注冊和發現


  go-micro的服務發現插件有mdns、consul、etcd等,默認使用mdns

  server、client的服務注冊和發現的邏輯如下圖:

 

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

  服務端把服務的地址信息保存到Registry, 然后定時的心跳檢查,或者定時的重新注冊服務。客戶端監聽Registry,最好是把服務信息保存到本地,監聽服務的變動,更新緩存。當調用服務端的接口是時,根據客戶端的服務列表和負載算法選擇服務端進行通信。

   go-micro的Registry接口:

// The registry provides an interface for service discovery
// and an abstraction over varying implementations
// {consul, etcd, zookeeper, ...}
type Registry interface {
	Init(...Option) error
	Options() Options
	Register(*Service, ...RegisterOption) error
	Deregister(*Service) error
	GetService(string) ([]*Service, error)
	ListServices() ([]*Service, error)
	Watch(...WatchOption) (Watcher, error)
	String() string
}

// Watcher is an interface that returns updates
// about services within the registry.
type Watcher interface {
	// Next is a blocking call
	Next() (*Result, error)
	Stop()
}

// Result is returned by a call to Next on
// the watcher. Actions can be create, update, delete
type Result struct {
	Action  string
	Service *Service
}

  

go-micro 服務端注冊服務

     

     服務端看上去流程還是比較簡單的,當服務端調用Run()方法時,會調用service.Start()方法。這個除了監聽端口,啟動服務,還會把服務的ip端口號信息,和所有的公開接口的元數據信息保存到我們選擇的Register服務器上去。

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

     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端也會設置緩存連接池,這個點,以后會詳細說。

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

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

 

主要的思路是

    從Selector里得到選擇主機策略方法next。

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


免責聲明!

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



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