序
本文主要研究一下dubbo-go-proxy的ZookeeperRegistryLoad
Loader
dubbo-go-proxy/pkg/registry/load.go
// Loader this interface defined for load services from different kinds registry, such as nacos,consul,zookeeper.
type Loader interface {
// LoadAllServices load all services registered in registry
LoadAllServices() ([]*common.URL, error)
// GetCluster get the registry name
GetCluster() (string, error)
}
Loader接口定义了LoadAllServices、GetCluster方法
ZookeeperRegistryLoad
dubbo-go-proxy/pkg/registry/zookeeper.go
const (
rootPath = "/dubbo"
)
func init() {
var _ Loader = new(ZookeeperRegistryLoad)
}
// ZookeeperRegistryLoad load dubbo apis from zookeeper registry
type ZookeeperRegistryLoad struct {
zkName string
client *zookeeper.ZookeeperClient
Address string
cluster string
}
func newZookeeperRegistryLoad(address, cluster string) (Loader, error) {
newClient, err := zookeeper.NewZookeeperClient("zkClient", strings.Split(address, ","), 15*time.Second)
if err != nil {
logger.Warnf("newZookeeperClient error:%v", err)
return nil, err
}
r := &ZookeeperRegistryLoad{
Address: address,
client: newClient,
cluster: cluster,
}
return r, nil
}
ZookeeperRegistryLoad定义了zkName、client、Address、cluster属性;newZookeeperRegistryLoad根据address及cluster来创建ZookeeperRegistryLoad
GetCluster
dubbo-go-proxy/pkg/registry/zookeeper.go
// nolint
func (crl *ZookeeperRegistryLoad) GetCluster() (string, error) {
return crl.cluster, nil
}
GetCluster方法返回cluster属性
LoadAllServices
dubbo-go-proxy/pkg/registry/zookeeper.go
// LoadAllServices load all services from zookeeper registry
func (crl *ZookeeperRegistryLoad) LoadAllServices() ([]*common.URL, error) {
children, err := crl.client.GetChildren(rootPath)
if err != nil {
logger.Errorf("[zookeeper registry] get zk children error:%v", err)
return nil, err
}
var urls []*common.URL
for _, _interface := range children {
providerStr := path.Join(rootPath, "/", _interface, "/", "providers")
urlStrs, err := crl.client.GetChildren(providerStr)
if err != nil {
logger.Errorf("[zookeeper registry] get zk children \"%s\" error:%v", providerStr, err)
return nil, err
}
for _, url := range urlStrs {
dubboURL, err := common.NewURL(url)
if err != nil {
logger.Warnf("[zookeeper registry] transfer zk info to url error:%v", err)
continue
}
urls = append(urls, dubboURL)
}
}
return urls, nil
}
LoadAllServices通过client.GetChildren(rootPath)获取children,之后遍历children,挨个获取provider信息通过common.NewURL(url)构建dubboURL
小结
ZookeeperRegistryLoad定义了zkName、client、Address、cluster属性;newZookeeperRegistryLoad根据address及cluster来创建ZookeeperRegistryLoad;它实现了Loader接口,提供了GetCluster、LoadAllServices方法。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。