1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
   | @Override    @SuppressWarnings("unchecked")    public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {        url = url.setProtocol(url.getParameter(REGISTRY_KEY, DEFAULT_REGISTRY)).removeParameter(REGISTRY_KEY);                Registry registry = registryFactory.getRegistry(url);                if (RegistryService.class.equals(type)) {            return proxyFactory.getInvoker((T) registry, type, url);        }
                 Map<String, String> qs = StringUtils.parseQueryString(url.getParameterAndDecoded(REFER_KEY));        String group = qs.get(Constants.GROUP_KEY);        if (group != null && group.length() > 0) {            if ((COMMA_SPLIT_PATTERN.split(group)).length > 1 || "*".equals(group)) {                return doRefer(getMergeableCluster(), registry, type, url);            }        }                return doRefer(cluster, registry, type, url);    }        private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {    	        RegistryDirectory<T> directory = new RegistryDirectory<T>(type, url);        directory.setRegistry(registry);        directory.setProtocol(protocol);                Map<String, String> parameters = new HashMap<String, String>(directory.getUrl().getParameters());        URL subscribeUrl = new URL(CONSUMER_PROTOCOL, parameters.remove(REGISTER_IP_KEY), 0, type.getName(), parameters);        if (!ANY_VALUE.equals(url.getServiceInterface()) && url.getParameter(REGISTER_KEY, true)) {            directory.setRegisteredConsumerUrl(getRegisteredConsumerUrl(subscribeUrl, url));                        registry.register(directory.getRegisteredConsumerUrl());        }        directory.buildRouterChain(subscribeUrl);                directory.subscribe(subscribeUrl.addParameter(CATEGORY_KEY,                PROVIDERS_CATEGORY + "," + CONFIGURATORS_CATEGORY + "," + ROUTERS_CATEGORY)); 	        Invoker invoker = cluster.join(directory);        ProviderConsumerRegTable.registerConsumer(invoker, url, subscribeUrl, directory);        return invoker;    }
   |