dubbo 源码分析汇总
3.1 Dubbo 内核解剖
dubbo 源码分析 1 之 架构原理探索
dubbo 源码分析 2 之 内核 SPI 实现
dubbo 源码分析 3 之 动态编译
dubbo 源码分析 4 之 与 Spring 集成
dubbo 源码分析 5 之 SPI 分析3.2 Dubbo 服务发布原理解剖
dubbo 源码分析 6 之 服务暴露概述
dubbo 源码分析 7 之 服务本地暴露
dubbo 源码分析 8 之 服务远程暴露 (上)
dubbo 源码分析 9 之 服务远程暴露 (中)
dubbo 源码分析 10 之 服务远程暴露 (下)3.3 Dubbo 服务引用原理解剖
dubbo 源码分析 11 之 服务引用
dubbo 源码分析 12 之 Listener & Filter3.4 Dubbo 集群容错的设计解剖
dubbo 源码分析 13 之 集群容错 Invoke
dubbo 源码分析 14 – 集群容错之 Directory
dubbo 源码分析 15 – 集群容错之 Route
dubbo 源码分析 16 – 集群容错之 LoadBalance
dubbo 源码分析 17 – 集群容错总结3.5 Dubbo 服务治理设计解剖
dubbo 源码分析 18 – 服务监控
dubbo 源码分析 19 – 服务治理3.6 Dubbo 网络通信架构解剖
dubbo 源码分析 20 – 远程调用概述
dubbo 源码分析 21 – 远程通信 netty
dubbo 源码分析 22 – consumer 发送与接收原理
dubbo 源码分析 23 – provider 接收与发送原理
dubbo 源码分析 24 – 调用核心 Invoke3.7 Dubbo 网络通信编解码解剖
public class ConsumerApi {public static void main(String[] args) {ReferenceConfig<UserService> reference = new ReferenceConfig<>();reference.setApplication(new ApplicationConfig("api-consumer"));reference.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));reference.setInterface(UserService.class);UserService orderService = reference.get();String username = orderService.getUsername();System.out.println("result: " + username);}}public class ReferenceConfig<T> extends AbstractReferenceConfig {public synchronized T get() {if (destroyed) {throw new IllegalStateException("Already destroyed!");}if (ref == null) {init();}return ref;}}

public class ReferenceConfig<T> extends AbstractReferenceConfig {...private T createProxy(Map<String, String> map) {URL tmpUrl = new URL("temp", "localhost", 0, map);final boolean isJvmRefer;if (isInjvm() == null) {if (url != null && url.length() > 0) { // if a url is specified, don't do local referenceisJvmRefer = false;} else if (InjvmProtocol.getInjvmProtocol().isInjvmRefer(tmpUrl)) {// by default, reference local service if there isisJvmRefer = true;} else {isJvmRefer = false;}} else {isJvmRefer = isInjvm().booleanValue();}if (isJvmRefer) {URL url = new URL(Constants.LOCAL_PROTOCOL, NetUtils.LOCALHOST, 0, interfaceClass.getName()).addParameters(map);invoker = refprotocol.refer(interfaceClass, url);if (logger.isInfoEnabled()) {logger.info("Using injvm service " + interfaceClass.getName());}} else {if (url != null && url.length() > 0) { // user specified URL, could be peer-to-peer address, or register center's address.String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url);if (us != null && us.length > 0) {for (String u : us) {URL url = URL.valueOf(u);if (url.getPath() == null || url.getPath().length() == 0) {url = url.setPath(interfaceName);}if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {urls.add(url.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(map)));} else {urls.add(ClusterUtils.mergeUrl(url, map));}}}} else { // assemble URL from register center's configurationList<URL> us = loadRegistries(false);if (us != null && !us.isEmpty()) {for (URL u : us) {URL monitorUrl = loadMonitor(u);if (monitorUrl != null) {map.put(Constants.MONITOR_KEY, URL.encode(monitorUrl.toFullString()));}urls.add(u.addParameterAndEncoded(Constants.REFER_KEY, StringUtils.toQueryString(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 (urls.size() == 1) {invoker = refprotocol.refer(interfaceClass, urls.get(0));} else {List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();URL registryURL = null;for (URL url : urls) {invokers.add(refprotocol.refer(interfaceClass, url));if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {registryURL = url; // use last registry url}}if (registryURL != null) { // registry url is available// use AvailableCluster only when register's cluster is availableURL u = registryURL.addParameter(Constants.CLUSTER_KEY, AvailableCluster.NAME);invoker = cluster.join(new StaticDirectory(u, invokers));} else { // not a registry urlinvoker = cluster.join(new StaticDirectory(invokers));}}}Boolean c = check;if (c == null && consumer != null) {c = consumer.isCheck();}if (c == null) {c = true; // default true}if (c && !invoker.isAvailable()) {throw new IllegalStateException("Failed to check the status of the service " + interfaceName + ". No provider available for the service " + (group == null ? "" : group + "/") + interfaceName + (version == null ? "" : ":" + version) + " from the url " + invoker.getUrl() + " to the consumer " + NetUtils.getLocalHost() + " use dubbo version " + Version.getVersion());}if (logger.isInfoEnabled()) {logger.info("Refer dubbo service " + interfaceClass.getName() + " from url " + invoker.getUrl());}// create service proxyreturn (T) proxyFactory.getProxy(invoker);}}
