go-micro register 解析

register

完成go-micro的服務發現功能。

保存broker的發佈訂閱主題

保存server的rpc調用 信息等等

 

源碼分析

Registry
 

type Registry interface {
    Init(...Option) error  // 根據選項初始化
    Options() Options      // 返回所有的選項
    Register(*Service, ...RegisterOption) error // 把信息登記到 Registry 
    Deregister(*Service) error // 刪除信息
    GetService(string) ([]*Service, error)  // 獲取指定 topic 的信息
    ListServices() ([]*Service, error)  // 枚舉所有信息
    Watch(...WatchOption) (Watcher, error) // 監控信息
    String() string // 這個Registry  是 msdn?  etcd? 還是什麼?
}

 

options.go 看看有哪些選項

 

Addrs(addrs ...string) Option    設置 Registry 的地址
Timeout(t time.Duration) Option  GetService ListService 的等待超時時間
Secure(b bool) Option  通信過程是否是否加密
TLSConfig(t *tls.Config) Option

RegisterTTL(t time.Duration) RegisterOption
WatchService(name string) WatchOption

 

util.go


一些實用函數 對 node  service的一些操作
mergeNodes 更合適  深拷貝  返回 old+neu 去掉重複的  
addNodes(old, neu []*Node) []*Node

返回 old中刪掉del部分
delNodes(old, del []*Node) []*Node

拷貝一份Service 深拷貝
CopyService(service *Service) *Service

拷貝多個Service     逐個調用CopyService
Copy(current []*Service) []*Service

返回 olist+nlist   深拷貝
Service.Version 同版本的話 result.Nodes = addNodes(Service.Nodes, Service.Nodes)
不同版本的全拷貝到 result 中去
Merge(olist []*Service, nlist []*Service) []*Service

深拷貝  返回的Service是old刪除了 del包含的Service 的
Service僅 Version 相同 才判定爲相同
刪除也只是把 del的 包含的nodes 刪除掉
如果Service的nodes被完全刪完了, Service 才被刪除出 []*Service
Remove(old, del []*Service) []*Service 

 

encoding.go

mdnsTxt  是個重要結構, 保存到 msdn底層的就是這個信息了

依次保存topic.Name   

是否廣播的標記

service.Endpoints的 Endpoints

Node的Metadata
type mdnsTxt struct {
    Service   string
    Version   string
    Endpoints []*Endpoint
    Metadata  map[string]string
}
mdnsTxt的序列化 反序列化
encode  先轉化成json串 然後zlib壓縮 再轉換成 hex, 字符串太長就拆分成字符串數組,字符串(最後一個除外)長度爲255
decode  還原 mdsnTxt

 

watcher.go


定義 Watcher interface  以及傳遞的信息Result
定義了 registry.Event 註冊事件

 

registry.go


registry的對外通信接口
註冊一個 Service 節點
Register(s *Service, opts ...RegisterOption) error
刪除Service的註冊信息
Deregister(s *Service) error

獲取 name 指定的 Service  該名字有多少個Vesrion,[]*Service就有多少個Service
GetService(name string) ([]*Service, error)

返回所有的Service
ListServices() ([]*Service, error)

創建並返回一個 觀察者   目前WatchOption就一個選項
指定觀察哪個Service
Watch(opts ...WatchOption) (Watcher, error)

用法示例 Watch(registry.WatchService(serviceName))

怎麼顯示這個 Registry,    mdns?  consul? etcd? zookeeper 還是別的
func String() string
 

mdns_registry.go

 

返回一個新的 registry    
NewRegistry(opts ...Option) Registry { return newRegistry(opts...) }

只是創建並返回了 mdnsRegistry 對象
newRegistry(opts ...Option) Registry

根據選項值進行初始化, 其實就是重新設置 mdnsRegistry.Options 的值
(m *mdnsRegistry) Init(opts ...Option) error

返回 mdnsRegistry.Options
(m *mdnsRegistry) Options() Options 

String() string  返回  mdns

註冊Service到 mdns 中
Service的所有Node 到註冊進去
s,err := mdns.NewMDNSService{Node.Id, service.Name, node.Address}
然後構建 mdns.NewServer(&mdns.Config{Zone: s})
Register(service *Service, opts ...RegisterOption) error

 

以下是 broker的 訂閱 發佈
Subscriber()
Node.Id         = broker.id+"."+uuid
Service.Name    = topic
Service.Version = options.Queue 或者 broadcastVersion

Publish()
根據topic 獲取 所有的 Service
對於每一個Service
  如果 service.Version 廣播    發送給service的所有node
  否則 隨機選一個 node 進行發送
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章