You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/10/07 08:34:25 UTC
[dubbo-go] branch 3.0 updated: refactor(config): refactor Refer
method of reference_config (#1504)
This is an automated email from the ASF dual-hosted git repository.
alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/3.0 by this push:
new f8bdd45 refactor(config): refactor Refer method of reference_config (#1504)
f8bdd45 is described below
commit f8bdd4556d7a2f8afdba622dbaa99164c8354e15
Author: Xuewei Niu <a...@nxw.name>
AuthorDate: Thu Oct 7 16:34:17 2021 +0800
refactor(config): refactor Refer method of reference_config (#1504)
* refactor(config): refactor Refer method of reference_config
* style(config): go fmt
* style(config): remove comments
* style(config): go fmt
* fix(config): fix array insertion bug
---
config/reference_config.go | 107 ++++++++++++++++++---------------------------
1 file changed, 42 insertions(+), 65 deletions(-)
diff --git a/config/reference_config.go b/config/reference_config.go
index 1055e75..4dc871a 100644
--- a/config/reference_config.go
+++ b/config/reference_config.go
@@ -114,91 +114,75 @@ func (rc *ReferenceConfig) Refer(srv interface{}) {
cfgURL.AddParam(constant.ForceUseTag, "true")
}
rc.postProcessConfig(cfgURL)
- if rc.URL != "" {
- // 1. user specified URL, could be peer-to-peer address, or register center's address.
+
+ // retrieving urls from config, and appending the urls to rc.urls
+ if rc.URL != "" { // use user-specific urls
+ /*
+ Two types of URL are allowed for rc.URL: direct url and registry url, they will be handled in different ways.
+ For example, "tri://localhost:10000" is a direct url, and "registry://localhost:2181" is a registry url.
+ rc.URL: "tri://localhost:10000;tri://localhost:10001;registry://localhost:2181",
+ urlStrings = []string{"tri://localhost:10000", "tri://localhost:10001", "registry://localhost:2181"}.
+ */
urlStrings := gxstrings.RegSplit(rc.URL, "\\s*[;]+\\s*")
for _, urlStr := range urlStrings {
serviceURL, err := common.NewURL(urlStr)
if err != nil {
panic(fmt.Sprintf("url configuration error, please check your configuration, user specified URL %v refer error, error message is %v ", urlStr, err.Error()))
}
- if serviceURL.Protocol == constant.REGISTRY_PROTOCOL {
+ if serviceURL.Protocol == constant.REGISTRY_PROTOCOL { // URL stands for a registry protocol
serviceURL.SubURL = cfgURL
rc.urls = append(rc.urls, serviceURL)
- } else {
+ } else { // URL stands for a direct address
if serviceURL.Path == "" {
serviceURL.Path = "/" + rc.InterfaceName
}
- // merge url need to do
+ // merge URL param with cfgURL, others are same as serviceURL
newURL := common.MergeURL(serviceURL, cfgURL)
rc.urls = append(rc.urls, newURL)
}
}
- } else {
- // 2. assemble SubURL from register center's configuration mode
+ } else { // use registry configs
rc.urls = loadRegistries(rc.RegistryIDs, rc.rootConfig.Registries, common.CONSUMER)
-
// set url to regURLs
for _, regURL := range rc.urls {
regURL.SubURL = cfgURL
}
}
- if len(rc.urls) == 1 {
- if rc.urls[0].Protocol == constant.SERVICE_REGISTRY_PROTOCOL {
- rc.invoker = extension.GetProtocol("registry").Refer(rc.urls[0])
+ // Get invokers according to rc.urls
+ var (
+ invoker protocol.Invoker
+ regURL *common.URL
+ )
+ invokers := make([]protocol.Invoker, len(rc.urls))
+ for i, u := range rc.urls {
+ if u.Protocol == constant.SERVICE_REGISTRY_PROTOCOL {
+ invoker = extension.GetProtocol("registry").Refer(u)
} else {
- rc.invoker = extension.GetProtocol(rc.urls[0].Protocol).Refer(rc.urls[0])
+ invoker = extension.GetProtocol(u.Protocol).Refer(u)
}
- // c.URL != "" is direct call
if rc.URL != "" {
- //filter
- rc.invoker = protocolwrapper.BuildInvokerChain(rc.invoker, constant.REFERENCE_FILTER_KEY)
-
- // cluster
- invokers := make([]protocol.Invoker, 0, len(rc.urls))
- invokers = append(invokers, rc.invoker)
- // TODO(decouple from directory, config should not depend on directory module)
- var hitClu string
- // not a registry url, must be direct invoke.
- hitClu = constant.FAILOVER_CLUSTER_NAME
- if len(invokers) > 0 {
- u := invokers[0].GetURL()
- if nil != &u {
- hitClu = u.GetParam(constant.CLUSTER_KEY, constant.ZONEAWARE_CLUSTER_NAME)
- }
- }
+ invoker = protocolwrapper.BuildInvokerChain(invoker, constant.REFERENCE_FILTER_KEY)
+ }
- cluster := extension.GetCluster(hitClu)
- // If 'zone-aware' policy select, the invoker wrap sequence would be:
- // ZoneAwareClusterInvoker(StaticDirectory) ->
- // FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker
- rc.invoker = cluster.Join(directory.NewStaticDirectory(invokers))
+ invokers[i] = invoker
+ if u.Protocol == constant.REGISTRY_PROTOCOL {
+ regURL = u
}
- } else {
- invokers := make([]protocol.Invoker, 0, len(rc.urls))
- var regURL *common.URL
- for _, u := range rc.urls {
- var invoker protocol.Invoker
- if u.Protocol == constant.SERVICE_REGISTRY_PROTOCOL {
- invoker = extension.GetProtocol("registry").Refer(u)
- } else {
- invoker = extension.GetProtocol(u.Protocol).Refer(u)
- }
+ }
- // c.URL != "" is direct call
- if rc.URL != "" {
- //filter
- invoker = protocolwrapper.BuildInvokerChain(invoker, constant.REFERENCE_FILTER_KEY)
- }
- invokers = append(invokers, invoker)
- if u.Protocol == constant.REGISTRY_PROTOCOL {
- regURL = u
+ // TODO(hxmhlt): decouple from directory, config should not depend on directory module
+ if len(invokers) == 1 {
+ rc.invoker = invokers[0]
+ if rc.URL != "" {
+ hitClu := constant.FAILOVER_CLUSTER_NAME
+ if u := rc.invoker.GetURL(); u != nil {
+ hitClu = u.GetParam(constant.CLUSTER_KEY, constant.ZONEAWARE_CLUSTER_NAME)
}
+ rc.invoker = extension.GetCluster(hitClu).Join(directory.NewStaticDirectory(invokers))
}
-
- // TODO(decouple from directory, config should not depend on directory module)
+ } else {
var hitClu string
if regURL != nil {
// for multi-subscription scenario, use 'zone-aware' policy by default
@@ -206,20 +190,13 @@ func (rc *ReferenceConfig) Refer(srv interface{}) {
} else {
// not a registry url, must be direct invoke.
hitClu = constant.FAILOVER_CLUSTER_NAME
- if len(invokers) > 0 {
- u := invokers[0].GetURL()
- if nil != &u {
- hitClu = u.GetParam(constant.CLUSTER_KEY, constant.ZONEAWARE_CLUSTER_NAME)
- }
+ if u := invokers[0].GetURL(); u != nil {
+ hitClu = u.GetParam(constant.CLUSTER_KEY, constant.ZONEAWARE_CLUSTER_NAME)
}
}
-
- cluster := extension.GetCluster(hitClu)
- // If 'zone-aware' policy select, the invoker wrap sequence would be:
- // ZoneAwareClusterInvoker(StaticDirectory) ->
- // FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker
- rc.invoker = cluster.Join(directory.NewStaticDirectory(invokers))
+ rc.invoker = extension.GetCluster(hitClu).Join(directory.NewStaticDirectory(invokers))
}
+
// publish consumer's metadata
publishServiceDefinition(cfgURL)
// create proxy