本文次要钻研一下dubbo-go的nacosRegistry

nacosRegistry

dubbo-go-v1.4.2/registry/nacos/registry.go

var (    localIP = "")const (    //RegistryConnDelay registry connection delay    RegistryConnDelay = 3)func init() {    localIP, _ = gxnet.GetLocalIP()    extension.SetRegistry(constant.NACOS_KEY, newNacosRegistry)}type nacosRegistry struct {    *common.URL    namingClient naming_client.INamingClient}
  • nacosRegistry定义了common.URL、namingClient属性

newNacosRegistry

dubbo-go-v1.4.2/registry/nacos/registry.go

func newNacosRegistry(url *common.URL) (registry.Registry, error) {    nacosConfig, err := getNacosConfig(url)    if err != nil {        return nil, err    }    client, err := clients.CreateNamingClient(nacosConfig)    if err != nil {        return nil, err    }    registry := nacosRegistry{        URL:          url,        namingClient: client,    }    return &registry, nil}
  • newNacosRegistry办法先通过getNacosConfig获取nacosConfig,之后通过clients.CreateNamingClient(nacosConfig)创立client,最初实例化nacosRegistry

getNacosConfig

dubbo-go-v1.4.2/registry/nacos/registry.go

func getNacosConfig(url *common.URL) (map[string]interface{}, error) {    if url == nil {        return nil, perrors.New("url is empty!")    }    if len(url.Location) == 0 {        return nil, perrors.New("url.location is empty!")    }    configMap := make(map[string]interface{}, 2)    addresses := strings.Split(url.Location, ",")    serverConfigs := make([]nacosConstant.ServerConfig, 0, len(addresses))    for _, addr := range addresses {        ip, portStr, err := net.SplitHostPort(addr)        if err != nil {            return nil, perrors.WithMessagef(err, "split [%s] ", addr)        }        port, _ := strconv.Atoi(portStr)        serverConfigs = append(serverConfigs, nacosConstant.ServerConfig{            IpAddr: ip,            Port:   uint64(port),        })    }    configMap["serverConfigs"] = serverConfigs    var clientConfig nacosConstant.ClientConfig    timeout, err := time.ParseDuration(url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT))    if err != nil {        return nil, err    }    clientConfig.TimeoutMs = uint64(timeout.Seconds() * 1000)    clientConfig.ListenInterval = 2 * clientConfig.TimeoutMs    clientConfig.CacheDir = url.GetParam(constant.NACOS_CACHE_DIR_KEY, "")    clientConfig.LogDir = url.GetParam(constant.NACOS_LOG_DIR_KEY, "")    clientConfig.Endpoint = url.GetParam(constant.NACOS_ENDPOINT, "")    clientConfig.Username = url.GetParam(constant.NACOS_USERNAME, "")    clientConfig.Password = url.GetParam(constant.NACOS_PASSWORD, "")    clientConfig.NamespaceId = url.GetParam(constant.NACOS_NAMESPACEID, "")    clientConfig.NotLoadCacheAtStart = true    configMap["clientConfig"] = clientConfig    return configMap, nil}
  • getNacosConfig办法解析url.Location为addresses,而后遍历addresses创立serverConfigs,之后设置clientConfig的参数,最初返回configMap

Register

dubbo-go-v1.4.2/registry/nacos/registry.go

func (nr *nacosRegistry) Register(url common.URL) error {    serviceName := getServiceName(url)    param := createRegisterParam(url, serviceName)    isRegistry, err := nr.namingClient.RegisterInstance(param)    if err != nil {        return err    }    if !isRegistry {        return perrors.New("registry [" + serviceName + "] to  nacos failed")    }    return nil}
  • Register办法通过getServiceName(url)获取serviceName,之后通过createRegisterParam(url, serviceName)创立注册参数,最初通过nr.namingClient.RegisterInstance(param)执行注册

Subscribe

dubbo-go-v1.4.2/registry/nacos/registry.go

//subscribe from registryfunc (nr *nacosRegistry) Subscribe(url *common.URL, notifyListener registry.NotifyListener) {    for {        if !nr.IsAvailable() {            logger.Warnf("event listener game over.")            return        }        listener, err := nr.subscribe(url)        if err != nil {            if !nr.IsAvailable() {                logger.Warnf("event listener game over.")                return            }            logger.Warnf("getListener() = err:%v", perrors.WithStack(err))            time.Sleep(time.Duration(RegistryConnDelay) * time.Second)            continue        }        for {            serviceEvent, err := listener.Next()            if err != nil {                logger.Warnf("Selector.watch() = error{%v}", perrors.WithStack(err))                listener.Close()                return            }            logger.Infof("update begin, service event: %v", serviceEvent.String())            notifyListener.Notify(serviceEvent)        }    }}
  • Subscribe办法执行nr.subscribe(url)获取listener,而后通过listener.Next()获取serviceEvent,而后通过notifyListener.Notify(serviceEvent)公布serviceEvent

小结

newNacosRegistry办法先通过getNacosConfig获取nacosConfig,之后通过clients.CreateNamingClient(nacosConfig)创立client,最初实例化nacosRegistry

doc

  • registry