public class ReferenceBean<T> extends ReferenceConfig<T> implements FactoryBean, ApplicationContextAware, InitializingBean, DisposableBean
afterPropertiesSet(),初始化consumer、application、module、registry、monitor信息,接下来
Boolean b = isInit(); if (b == null && getConsumer() != null) { b = getConsumer().isInit(); } if (b != null && b.booleanValue()) { getObject(); }
会调到父类referenceConfig的get方法,get方法调用init方法,以下是init片段
1、对本地reslove文件的解析,如果在resolve文件里能找到key为interfaceName的,url设置成key对应的value
if (resolve == null || resolve.length() == 0) { resolveFile = System.getProperty("dubbo.resolve.file"); if (resolveFile == null || resolveFile.length() == 0) { File userResolveFile = new File(new File(System.getProperty("user.home")), "dubbo-resolve.properties"); if (userResolveFile.exists()) { resolveFile = userResolveFile.getAbsolutePath(); } } if (resolveFile != null && resolveFile.length() > 0) { Properties properties = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream(new File(resolveFile)); properties.load(fis); } catch (IOException e) { throw new IllegalStateException("Unload " + resolveFile + ", cause: " + e.getMessage(), e); } finally { try { if (null != fis) fis.close(); } catch (IOException e) { logger.warn(e.getMessage(), e); } } resolve = properties.getProperty(interfaceName); } } if (resolve != null && resolve.length() > 0) { url = resolve; if (logger.isWarnEnabled()) { if (resolveFile != null && resolveFile.length() > 0) { logger.warn("Using default dubbo resolve file " + resolveFile + " replace " + interfaceName + "" + resolve + " to p2p invoke remote service."); } else { logger.warn("Using -D" + interfaceName + "=" + resolve + " to p2p invoke remote service."); } } }
2、载入dubbo.application配置,载入dubbo.service.shutdown.wait 优雅关机 配置
checkApplication()
3、如果reference的stub=true,判断是否有interface为参数的构造函数
if (ConfigUtils.isNotEmpty(stub)) { Class<?> localClass = ConfigUtils.isDefault(stub) ? ReflectUtils.forName(interfaceClass.getName() + "Stub") : ReflectUtils.forName(stub); if (!interfaceClass.isAssignableFrom(localClass)) { throw new IllegalStateException("The local implementation class " + localClass.getName() + " not implement interface " + interfaceClass.getName()); } try { ReflectUtils.findConstructor(localClass, interfaceClass); } catch (NoSuchMethodException e) { throw new IllegalStateException("No such constructor \"public " + localClass.getSimpleName() + "(" + interfaceClass.getName() + ")\" in local implementation class " + localClass.getName()); } }
4、如果reference的mock=true或者mock=mock类名称
if (ConfigUtils.isNotEmpty(mock)) { if (mock.startsWith(Constants.RETURN_PREFIX)) { String value = mock.substring(Constants.RETURN_PREFIX.length()); try { MockInvoker.parseMockValue(value);//如果mock配置是 return xxx } catch (Exception e) { throw new IllegalStateException("Illegal mock json value in <dubbo:service ... mock=\"" + mock + "\" />"); } } else { Class<?> mockClass = ConfigUtils.isDefault(mock) ? ReflectUtils.forName(interfaceClass.getName() + "Mock") : ReflectUtils.forName(mock);//Mock类在mock=true时是interfaceName+Mock(package一致),mock也可以填具体的实现类名称 if (!interfaceClass.isAssignableFrom(mockClass)) {//mockclass要实现interfaceClass throw new IllegalStateException("The mock implementation class " + mockClass.getName() + " not implement interface " + interfaceClass.getName()); } try { mockClass.getConstructor(new Class<?>[0]);//Mock类需要有无参数构造函数 } catch (NoSuchMethodException e) { throw new IllegalStateException("No such empty constructor \"public " + mockClass.getSimpleName() + "()\" in mock implementation class " + mockClass.getName()); } } }
MockInvoker.parseMockValue(value);如下,可见mock:return xxx可以有null 、空对象、true、false、字符串、json串(map、list)
public static Object parseMockValue(String mock, Type[] returnTypes) throws Exception { Object value = null; if ("empty".equals(mock)) { value = ReflectUtils.getEmptyObject(returnTypes != null && returnTypes.length > 0 ? (Class<?>) returnTypes[0] : null); } else if ("null".equals(mock)) { value = null; } else if ("true".equals(mock)) { value = true; } else if ("false".equals(mock)) { value = false; } else if (mock.length() >= 2 && (mock.startsWith("\"") && mock.endsWith("\"") || mock.startsWith("\'") && mock.endsWith("\'"))) { value = mock.subSequence(1, mock.length() - 1); } else if (returnTypes != null && returnTypes.length > 0 && returnTypes[0] == String.class) { value = mock; } else if (StringUtils.isNumeric(mock)) { value = JSON.parse(mock); } else if (mock.startsWith("{")) { value = JSON.parseObject(mock, Map.class); } else if (mock.startsWith("[")) { value = JSON.parseObject(mock, List.class); } else { value = mock; } if (returnTypes != null && returnTypes.length > 0) { value = PojoUtils.realize(value, (Class<?>) returnTypes[0], returnTypes.length > 1 ? returnTypes[1] : null); } return value; }
5、接下来是把组装消费者url所需要的参数放到一个map
6、重头戏来了,创建动态代理
ref = createProxy(map);
url要么是reference指定的(点对点直连),要么是通过注册中心的配置组装的 组装主要是加上applicaiton、protocol相关信息,还要判断subscribe是否为dubbo.registry.subscribe是否为true,如果为rue则不返回url invoker = refprotocol.refer(interfaceClass, url); 生成invoker,refprotocol对应不同的协议,dubbo协议实现类是DubboProtocol,以后再来看这个 // 创建服务代理 return (T) proxyFactory.getProxy(invoker); proxyFactory默认adaptive是javassist
相关推荐
《Dubbo 2.5.7 源码解析与技术探索》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,为分布式应用提供了丰富的服务调用、负载均衡、容错处理等能力。这里我们将深入探讨Dubbo 2.5.7版本的源码,了解...
由dubbo最新版编译出的admin的war包,解决了之前无法在jdk1.8下运行的问题.有需要的可以下载
这是已经打包好的dubbo2.5.7 maven 下载,可以直接编译,下载后直接部署在tomat即可使用。经过本人测试完全可以执行, 支持jdk1.6,jdk1.7 如果是jdk1.8的话需要修改tomcat中jdk应用,改成1.6或者1.7的
而"alibaba-dubbo-e2d63ad"这一压缩包文件,很可能是Dubbo源码的某个特定分支或版本,用于研究和学习Dubbo的内部实现机制,进一步理解其与Java 8的兼容性。 通过深入理解这些变化,开发者不仅能够提升自身技能,还...
dubbo最新war包dubbo-admin-2.5.7,可以用在jdk1.8/jdk1.7等版本,亲测可用
dubbo-admin-2.5.7.war,dubbo的监控端工具,亲自maven编译打包
### Dubbo 2.0 源码阅读关键知识点概览 #### 一、源码阅读预备知识 在深入理解Dubbo源码之前,需要掌握一系列基础知识,这将有助于更好地理解Dubbo的设计与实现。 1. **Java语言编程**:熟悉Java语言的基本语法和...
dubbo-2.5.7.jar
dubbo 2.5.6 vs 2.5.7 源码差异分析,一点点小事情,希望对大家有帮助
《阿里巴巴Dubbo 2.5.7源码分析与应用》 阿里巴巴的Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了服务发现、服务治理、流量控制等一系列完整的服务解决方案。本压缩包"alibaba-dubbo-dubbo-2.5.7-0-ge2d...
通过阅读源码,我们可以了解到项目是如何组织和运行的。 二、服务注册与发现 在Dubbo中,服务注册与发现是核心功能之一。dubbo-admin通过与Zookeeper、Etcd等注册中心交互,实现了服务的注册、查询和监控。在源码...
dubbo的源码分布较为分散,阅读时需要有一定的顺序,这样才能保证理解的连贯性。通常建议从dubbo的启动流程入手,逐步深入到核心模块和组件。 3. 接下来,是dubbo架构的介绍。dubbo采用了微内核的架构模式,核心...
《Dubbo框架源码解析深度探索》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,已经成为Java世界中分布式...Dubbo的源码阅读也是一个不断提升自身技术深度的过程,有助于成长为更优秀的Java开发者。
源码结构清晰,便于阅读和学习。通过`mvn clean install`命令,即可完成编译过程。 总结,Dubbo 2.5.3源码的学习能让我们更深入理解分布式服务治理的原理,对于提升Java开发者的架构设计能力、优化系统性能有着极大...
【标题】"dubbo-admin2.5.7.rar" 是一个包含Dubbo管理控制台的压缩包,版本为2.5.7。Dubbo是一个高性能、轻量级的开源Java RPC框架,它提供了丰富的服务治理功能,而dubbo-admin正是其中的服务监控中心。 【描述】...
通过阅读这篇文章,开发者可以学习到如何配置和启动Dubbo服务,以及如何进行服务调用和服务治理。 在这个源码工程中,我们可以深入学习以下关键知识点: 1. **Dubbo服务提供者和服务消费者**:Dubbo的核心概念是...