CrazyHZM commented on a change in pull request #8455:
URL: https://github.com/apache/dubbo/pull/8455#discussion_r686487033
##########
File path:
dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/ReferenceConfig.java
##########
@@ -305,143 +330,153 @@ protected synchronized void init() {
map.put(methodConfig.getName() + ".retries", "0");
}
}
- AsyncMethodInfo asyncMethodInfo =
AbstractConfig.convertMethodConfig2AsyncInfo(methodConfig);
- if (asyncMethodInfo != null) {
-//
consumerModel.getMethodModel(methodConfig.getName()).addAttribute(ASYNC_KEY,
asyncMethodInfo);
- attributes.put(methodConfig.getName(), asyncMethodInfo);
- }
}
}
- String hostToRegistry =
ConfigUtils.getSystemProperty(DUBBO_IP_TO_REGISTRY);
- if (StringUtils.isEmpty(hostToRegistry)) {
- hostToRegistry = NetUtils.getLocalHost();
- } else if (isInvalidLocalHost(hostToRegistry)) {
- throw new IllegalArgumentException(
- "Specified invalid registry ip from property:" +
DUBBO_IP_TO_REGISTRY + ", value:" + hostToRegistry);
- }
- map.put(REGISTER_IP_KEY, hostToRegistry);
+ return map;
+ }
- serviceMetadata.getAttachments().putAll(map);
+ @SuppressWarnings({"unchecked"})
+ private T createProxy(Map<String, String> referenceParameters) {
+ if (shouldJvmRefer(referenceParameters)) {
+ createInvokerForLocal(referenceParameters);
+ } else {
+ urls.clear();
+ if (url != null && url.length() > 0) {
+ // user specified URL, could be peer-to-peer address, or
register center's address.
+ parseUrl(referenceParameters);
+ } else {
+ // if protocols not in jvm checkRegistry
+ if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {
+ AggregateUrlFromRegistry(referenceParameters);
+ }
+ }
+ createInvokerForRemote();
+ }
- ref = createProxy(map);
+ if (logger.isInfoEnabled()) {
+ logger.info("Referred dubbo service " + interfaceClass.getName());
+ }
- serviceMetadata.setTarget(ref);
- serviceMetadata.addAttribute(PROXY_CLASS_REF, ref);
- ConsumerModel consumerModel =
repository.lookupReferredService(serviceMetadata.getServiceKey());
- consumerModel.setProxyObject(ref);
- consumerModel.init(attributes);
+ URL consumerUrl = new ServiceConfigURL(CONSUMER_PROTOCOL,
referenceParameters.get(REGISTER_IP_KEY), 0,
+ referenceParameters.get(INTERFACE_KEY), referenceParameters);
+ MetadataUtils.publishServiceDefinition(consumerUrl);
- initialized = true;
+ // create service proxy
+ return (T) PROXY_FACTORY.getProxy(invoker,
ProtocolUtils.isGeneric(generic));
+ }
- checkInvokerAvailable();
+ /**
+ * Make a local reference, create a local invoker.
+ *
+ * @param referenceParameters
+ */
+ private void createInvokerForLocal(Map<String, String>
referenceParameters) {
+ URL url = new ServiceConfigURL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0,
interfaceClass.getName()).addParameters(referenceParameters);
+ invoker = REF_PROTOCOL.refer(interfaceClass, url);
+ if (logger.isInfoEnabled()) {
+ logger.info("Using in jvm service " + interfaceClass.getName());
+ }
}
- @SuppressWarnings({"unchecked", "rawtypes", "deprecation"})
- private T createProxy(Map<String, String> map) {
- if (shouldJvmRefer(map)) {
- URL url = new ServiceConfigURL(LOCAL_PROTOCOL, LOCALHOST_VALUE, 0,
interfaceClass.getName()).addParameters(map);
- invoker = REF_PROTOCOL.refer(interfaceClass, url);
- if (logger.isInfoEnabled()) {
- logger.info("Using injvm service " + interfaceClass.getName());
- }
- } else {
- urls.clear();
- if (url != null && url.length() > 0) { // user specified URL,
could be peer-to-peer address, or register center's address.
- String[] us = SEMICOLON_SPLIT_PATTERN.split(url);
- if (us != null && us.length > 0) {
- for (String u : us) {
- URL url = URL.valueOf(u);
- if (StringUtils.isEmpty(url.getPath())) {
- url = url.setPath(interfaceName);
- }
- if (UrlUtils.isRegistry(url)) {
- urls.add(url.putAttribute(REFER_KEY, map));
- } else {
- URL peerURL = ClusterUtils.mergeUrl(url, map);
- peerURL = peerURL.putAttribute(PEER_KEY, true);
- urls.add(peerURL);
- }
- }
+ /**
+ * Parse the directly configured url.
+ */
+ private void parseUrl(Map<String, String> referenceParameters) {
+ String[] us = SEMICOLON_SPLIT_PATTERN.split(url);
+ if (us != null && us.length > 0) {
+ for (String u : us) {
+ URL url = URL.valueOf(u);
+ if (StringUtils.isEmpty(url.getPath())) {
+ url = url.setPath(interfaceName);
}
- } else { // assemble URL from register center's configuration
- // if protocols not injvm checkRegistry
- if (!LOCAL_PROTOCOL.equalsIgnoreCase(getProtocol())) {
- checkRegistry();
- List<URL> us = ConfigValidationUtils.loadRegistries(this,
false);
- if (CollectionUtils.isNotEmpty(us)) {
- for (URL u : us) {
- URL monitorUrl =
ConfigValidationUtils.loadMonitor(this, u);
- if (monitorUrl != null) {
- u = u.putAttribute(MONITOR_KEY, monitorUrl);
- }
- urls.add(u.putAttribute(REFER_KEY, map));
- }
- }
- if (urls.isEmpty()) {
- throw new IllegalStateException(
- "No such any registry to reference " +
interfaceName + " on the consumer " + NetUtils.getLocalHost() +
- " use dubbo version " +
Version.getVersion() +
- ", please config <dubbo:registry
address=\"...\" /> to your spring config.");
- }
+ if (UrlUtils.isRegistry(url)) {
+ urls.add(url.putAttribute(REFER_KEY, referenceParameters));
+ } else {
+ URL peerUrl = ClusterUtils.mergeUrl(url,
referenceParameters);
+ peerUrl = peerUrl.putAttribute(PEER_KEY, true);
+ urls.add(peerUrl);
}
}
+ }
+ }
- if (urls.size() == 1) {
- invoker = REF_PROTOCOL.refer(interfaceClass, urls.get(0));
- } else {
- List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
- URL registryURL = null;
- for (URL url : urls) {
- // For multi-registry scenarios, it is not checked whether
each referInvoker is available.
- // Because this invoker may become available later.
- invokers.add(REF_PROTOCOL.refer(interfaceClass, url));
-
- if (UrlUtils.isRegistry(url)) {
- registryURL = url; // use last registry url
- }
- }
-
- if (registryURL != null) { // registry url is available
- // for multi-subscription scenario, use 'zone-aware'
policy by default
- String cluster = registryURL.getParameter(CLUSTER_KEY,
ZoneAwareCluster.NAME);
- // The invoker wrap sequence would be:
ZoneAwareClusterInvoker(StaticDirectory) ->
FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker
- invoker = Cluster.getCluster(cluster, false).join(new
StaticDirectory(registryURL, invokers));
- } else { // not a registry url, must be direct invoke.
- String cluster = CollectionUtils.isNotEmpty(invokers)
- ?
- (invokers.get(0).getUrl() != null ?
invokers.get(0).getUrl().getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME) :
- Cluster.DEFAULT)
- : Cluster.DEFAULT;
- invoker = Cluster.getCluster(cluster).join(new
StaticDirectory(invokers));
+ /**
+ * Get URLs from the registry and aggregate them.
+ */
+ private void AggregateUrlFromRegistry(Map<String, String>
referenceParameters) {
Review comment:
done
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]