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 進行發送