今天看啥  ›  专栏  ›  go4it

聊聊dubbo-go-proxy的ZookeeperRegistryLoad

go4it  · 掘金  ·  · 2021-02-16 10:22
阅读 90

聊聊dubbo-go-proxy的ZookeeperRegistryLoad

本文主要研究一下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方法。

doc




原文地址:访问原文地址
快照地址: 访问文章快照