sequence

In this paper, ConsulRegistryLoad of Dubo-Go-proxy is studied

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)
}
Copy the code

The Loader interface defines LoadAllServices and GetCluster methods

ConsulRegistryLoad

dubbo-go-proxy/pkg/registry/consul.go

func init() { var _ Loader = new(ConsulRegistryLoad) } const ( dubboAPIFilter = "dubbo in Tags" ) // ConsulRegistryLoad load dubbo apis from consul registry type ConsulRegistryLoad struct { Address string // Consul client. client *consul.Client cluster string } func newConsulRegistryLoad(address, cluster string) (Loader, error) { config := &consul.Config{Address: address} client, err := consul.NewClient(config) if err ! = nil { return nil, err } r := &ConsulRegistryLoad{ Address: address, client: client, cluster: cluster, } return r, nil }Copy the code

ConsulRegistryLoad specifies the Address, client, and Cluster attributes. The newConsulRegistryLoad method creates consulregistryLoads based on address and cluster

GetCluster

dubbo-go-proxy/pkg/registry/consul.go

func (crl *ConsulRegistryLoad) GetCluster() (string, error) {
	return crl.cluster, nil
}
Copy the code

The GetCluster method returns the Cluster attribute of ConsulRegistryLoad

LoadAllServices

dubbo-go-proxy/pkg/registry/consul.go

func (crl *ConsulRegistryLoad) LoadAllServices() ([]*common.URL, error) { agentServices, err := crl.client.Agent().ServicesWithFilter(dubboAPIFilter) if err ! = nil { logger.Error("consul load all apis error:%v", err) return nil, perrors.Wrap(err, "consul load all apis") } var urls []*common.URL for _, service := range agentServices { url, err := crl.transfer2Url(*service) if err ! = nil { logger.Warnf("consul transfer service to url error:%v", err) continue } urls = append(urls, url) } return urls, nil }Copy the code

The LoadAllServices method obtains agentServices from ConsulRegistryLoad client.agent ().servicesWithFilter. The agentServices is then iterated over and converted to a url using the transfer2Url method

transfer2Url

dubbo-go-proxy/pkg/registry/consul.go

func (crl *ConsulRegistryLoad) transfer2Url(service consul.AgentService) (*common.URL, error) { var params = url.Values{} var protocol string for _, tag := range service.Tags { kv := strings.Split(tag, "=") if len(kv) ! = 2 { continue } params.Add(kv[0], kv[1]) } if url, ok := service.Meta["url"]; ok { protocol = strings.Split(url, ":")[0] } methodsParam := strings.Split(params.Get(constant.METHODS_KEY), ",") var methods = make([]string, len(methodsParam)) for _, method := range methodsParam { if method ! = "" { methods = append(methods, method) } } url := common.NewURLWithOptions(common.WithPort(strconv.Itoa(service.Port)), common.WithProtocol(protocol), common.WithMethods(methods), common.WithIp(service.Address), common.WithParams(params)) return url, nil }Copy the code

Meta[“url”]; params.get (constant.METHODS_KEY); Finally, build the URL with common.newUrlWithOptions

summary

ConsulRegistryLoad specifies the Address, client, and Cluster attributes. The newConsulRegistryLoad method creates consulregistryLoads based on address and cluster. It implements Loader interface and provides GetCluster and LoadAllServices methods.

doc

  • dubbo-go-proxy