Dubbo原码解析(version:2.5.3)
一、启动
dubbo借助spring的schemas来启动(dubbo.jar/META-INF/spring.schemas)。
在dubbo.jar/META-INF/spring.handlers里配置了dubbo bean的解析类DubboNamespaceHandler。主要的有ServiceBean.java和ReferenceBean.java。
二、Dubbo Bean的注册(DubboBeanDefinitionParser.java)
DubboBeanDefinitionParser.parse():将我们在beans-dubbo.xml里面配置的 bean 进行解析(包括dubbo的配置,ServiceBean和ReferenceBean),然后注册到Spring容器中,给Spring托管。
例如:beans-dubbo.xml有如下配置
<dubbo:application name="#{dubboConfig.applicationName}" owner="#{dubboConfig.applicationOwner}" /> <dubbo:registry address="#{dubboConfig.registryAddress}" /> <dubbo:protocol name="#{dubboConfig.protocolName}" port="#{dubboConfig.protocolPort}" /> <dubbo:provider retries="0" timeout="10000" /> <dubbo:consumer check="false" /> <dubbo:service interface="com.tz.agent.job.IAccountNettingTask" ref="accountNettingTask" /> <dubbo:reference id="accountQueryService" interface="com.basizbiz.account.service.IAccountQueryService"/>
dubbo.properties配置:
dubbo.application.name=tz-agent dubbo.application.owner=tf dubbo.registry.address=zookeeper://192.168.xx.44:2181 dubbo.protocol.name=dubbo dubbo.protocol.port=20910
View Code
容器里面相关的bean name如下:(parserContext.getRegistry().getBeanDefinitionNames()的结果)
accountNettingTask, #{dubboConfig.applicationName}, com.alibaba.dubbo.config.RegistryConfig, #{dubboConfig.protocolName}, com.alibaba.dubbo.config.ProviderConfig, com.alibaba.dubbo.config.ConsumerConfig, com.tz.agent.job.IAccountNettingTask, accountQueryService
1. 第一个accountNettingTask是Spring @Service注解产生的bean。
2. com.ihome.tz.agent.job.IAccountNettingTask是dubbo配置文件里面定义的ServiceBean。
3. accountQueryService是dubbo配置文件里面定义的ReferenceBean。
可以看出,Provider端生产了两种bean,一种是@Service的bean,还有一种是dubbo export的bean。
三、Provider端暴露服务
ServiceBean.afterPropertiesSet()方法最终会做服务暴露export();
拼装dubbo的URL --> protocol.export(invoker) --> ProtocolFilterWrapper.export() --> protocol.export(buildInvokerChain(invoker, Constants.SERVICE_FILTER_KEY, Constants.PROVIDER))
buildInvokerChain()会将满足条件的Filter层层包装在Invoker上。比如:ExceptionFilter、ValidationFilter、EchoFilter....
暴露的URL形如:
dubbo://192.168.xx.11:20910/com.tz.agent.job.IHistoryShareInitJob?anyhost=true&application=tz-agent&default.retries=0&default.timeout=10000&dubbo=2.5.3&interface=com.ihome.tz.agent.job.IHistoryShareInitJob&methods=initByExcel&owner=tf&pid=9596&revision=0.0.2-SNAPSHOT&side=provider×tamp=1490688484344
四、Consumer端引用服务
ReferenceBean.afterPropertiesSet()方法最终会调ReferenceBean.createProxy()给ref赋值。
proxyFactory.getProxy(invoker) --> JavassistProxyFactory.getProxy()
ref的实例持有一个new InvokerInvocationHandler(invoker)对象。
------------------------
refprotocol.refer() --> ProtocolFilterWrapper.refer() --> buildInvokerChain(protocol.refer(type, url), Constants.REFERENCE_FILTER_KEY, Constants.CONSUMER)
引用的URL形如:
dubbo://10.166.xx.85:20899/com.biz.product.service.ISharesQueryService?anyhost=true&application=tz-agent&check=false&default.check=false&default.retries=0&default.timeout=10000&dubbo=2.5.3&interface=com.ihome.biz.product.service.ISharesQueryService&methods=queryProduct,queryByDate,queryBenefitAccount,queryProductByBizProductCode,queryBizProductSelect,queryAllProductList,queryProductByBenefitCode,queryBizProductPage&owner=tf&pid=12772&revision=0.0.5-SNAPSHOT&side=consumer×tamp=1490688712775
附:Dubbo SPI :
Dubbo SPI是Dubbo留的扩展点
例如Dubbo的Protocal就是通过dubbo SPI 来扩展的。 ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort()
Dubbo SPI 加载文件
ExtensionLoader.loadFile(extensionClasses, DUBBO_INTERNAL_DIRECTORY); ExtensionLoader.loadFile(extensionClasses, DUBBO_DIRECTORY); ExtensionLoader.loadFile(extensionClasses, SERVICES_DIRECTORY);
【1】
dubbo-2.5.3.jar\META-INF\dubbo\internal\com.alibaba.dubbo.common.extension.ExtensionFactory
adaptive=com.alibaba.dubbo.common.extension.factory.AdaptiveExtensionFactory spi=com.alibaba.dubbo.common.extension.factory.SpiExtensionFactory spring=com.alibaba.dubbo.config.spring.extension.SpringExtensionFactory
针对文件中的类:
带有@Adaptive 的放到 cachedAdaptiveClass 中,有参数为ExtensionFactory的构造函数的放到 cachedWrapperClasses 中,否则放到 cachedClasses 中
-->
public T getAdaptiveExtension() 优先取 cachedAdaptiveClass.newInstance(),即 AdaptiveExtensionFactory
否则,会动态编译代码 String code = createAdaptiveExtensionClassCode();,使用AdaptiveExtensionFactory.getExtension(Class<T> type, String name)拿到适配的Extension
【2】
dubbo-2.5.3.jar\META-INF\dubbo\internal\com.alibaba.dubbo.rpc.Protocol
======================
registry=com.alibaba.dubbo.registry.integration.RegistryProtocol --- 放到 cachedClasses
filter=com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper --- 放到 cachedWrapperClasses (ref时将Filter装饰在)
listener=com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper --- 放到 cachedWrapperClasses
mock=com.alibaba.dubbo.rpc.support.MockProtocol
injvm=com.alibaba.dubbo.rpc.protocol.injvm.InjvmProtocol --- 放到 cachedClasses
dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol --- 放到 cachedClasses
rmi=com.alibaba.dubbo.rpc.protocol.rmi.RmiProtocol --- 放到 cachedClasses
hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol --- 放到 cachedClasses
com.alibaba.dubbo.rpc.protocol.http.HttpProtocol
com.alibaba.dubbo.rpc.protocol.webservice.WebServiceProtocol
thrift=com.alibaba.dubbo.rpc.protocol.thrift.ThriftProtocol
memcached=memcom.alibaba.dubbo.rpc.protocol.memcached.MemcachedProtocol
redis=com.alibaba.dubbo.rpc.protocol.redis.RedisProtocol
======================
Dubbo中的特性和坑:
1. Dubbo的异步具有传递性。(移除异步:RpcContext.getContext().getAttachments().remove(com.alibaba.dubbo.common.Constants.ASYNC_KEY);)
2. Dubbo Hessian序列化问题 参数为null
3. Dubbo 支持 telnet
4. Dubbo 支持泛化调用
Dubbo配置:
注意:
dubbo中所有配置项分为三大类:
1. 【服务发现】参数:表示该配置项用于服务的注册与发现,目的是让消费方找到提供方。
2. 【服务治理】参数:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
3. 【性能调优】参数:表示该配置项用于调优性能,不同的选项对性能会产生影响。
只有interface,group,version是服务的匹配条件,用于服务发现,三者决定是不是同一个服务,其它配置项均为服务调优和服务治理参数。
http://dubbo.io/user-guide/reference-xmlconf/introduction.html
配置推荐用法
在Provider上尽量多配置Consumer端属性
原因如下:
- 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试次数,等等
- 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可以作为Consumer的缺省值。
否则,Consumer会使用Consumer端的全局设置,这对于Provider不可控的,并且往往是不合理的。
配置的覆盖规则:
1) 方法级配置别优于接口级别,即小Scope优先
2) Consumer端配置 优于 Provider配置 优于 全局配置,最后是Dubbo Hard Code的配置值(见配置文档)
Provider上尽量多配置Consumer端的属性,让Provider实现者一开始就思考Provider服务特点、服务质量的问题。
示例:
< dubbo:service interface = "com.alibaba.hello.api.HelloService" version = "1.0.0" ref = "helloService"
timeout = "300" retry = "2" loadbalance = "random" actives = "0"
/>
< dubbo:service interface = "com.alibaba.hello.api.WorldService" version = "1.0.0" ref = "helloService"
timeout = "300" retry = "2" loadbalance = "random" actives = "0" >
< dubbo:method name = "findAllPerson" timeout = "10000" retries = "9" loadbalance = "leastactive" actives = "5" />
< dubbo:service />
|
在Provider可以配置的Consumer端属性有:
- timeout,方法调用超时
- retries,失败重试次数,缺省是2(表示加上第一次调用,会调用3次)
- loadbalance,负载均衡算法(有多个Provider时,如何挑选Provider调用),缺省是随机(random)。
还可以有轮训(roundrobin)、最不活跃优先(leastactive,指从Consumer端并发调用最好的Provider,可以减少的反应慢的Provider的调用,因为反应更容易累积并发的调用) - actives,消费者端,最大并发调用限制,即当Consumer对一个服务的并发调用到上限后,新调用会Wait直到超时。
在方法上配置(dubbo:method )则并发限制针对方法,在接口上配置(dubbo:service),则并发限制针对服务。
Dubbo原码解析(version:2.5.3)相关推荐
- dubbo(5) Dubbo源码解析之服务调用过程
来源:https://juejin.im/post/5ca4a1286fb9a05e731fc042 Dubbo源码解析之服务调用过程 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与 ...
- dubbo源码解析(十)远程通信——Exchange层
远程通讯--Exchange层 目标:介绍Exchange层的相关设计和逻辑.介绍dubbo-remoting-api中的exchange包内的源码解析. 前言 上一篇文章我讲的是dubbo框架设计中 ...
- Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)
前言: 在介绍完Dubbo 本地模式(Injvm协议)下的服务提供与消费后,上文我们又介绍了Dubbo远程模式(dubbo协议)下的服务暴露过程,本质上就是通过Netty将dubbo协议端口暴露出去, ...
- Dubbo源码解析 - 远程暴露
作者:肥朝 原文地址:http://www.jianshu.com/p/893f7e6e0c58 友情提示:欢迎关注公众号[芋道源码].????关注后,拉你进[源码圈]微信群和[肥朝]搞基嗨皮. 友情 ...
- Dubbo源码解析 --- DIRECTORY和ROUTER
Dubbo源码解析 --- DIRECTORY和ROUTER 今天看一下Directory和Router. 我们直接从代码看起(一贯风格),先看后总结,对着总结再来看,相信会收获很多.我们先看com. ...
- dubbo源码解析-集群容错架构设计
前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心态,在交流过程中也发表了个人的一些粗劣的 ...
- dubbo源码解析(九)远程通信——Transport层
远程通讯--Transport层 目标:介绍Transport层的相关设计和逻辑.介绍dubbo-remoting-api中的transport包内的源码解析. 前言 先预警一下,该文篇幅会很长,做好 ...
- dubbo源码解析-zookeeper创建节点
前言 在之前dubbo源码解析-本地暴露中的前言部分提到了两道高频的面试题,其中一道dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,那发布者和订阅者还能通信吗?在上周的dubbo源码 ...
- dubbo源码解析(二)
大家好,我是烤鸭: dubbo 源码解析: 1.服务导出 介绍: Dubbo 服务导出过程始于 Spring 容器发布刷新事件,Dubbo 在接收到事件后,会立即执行服务导出逻辑.整个逻辑大致可分为三 ...
最新文章
- linux共享磁盘给指定ip,Linux 磁盘挂载和mount共享
- 分析与设计数据库模型的简单过程
- UVA - 11437 Triangle Fun(简单几何)
- java的hr样式,spring+spring mvc+mybatis开发java医院HR人事管理系统(加强版本+ shiro)...
- 用c#编写爬虫在marinetraffic下载船仅仅图片
- java声明公共构造函数_确保控制器具有无参数的公共构造函数错误
- Dijkstra最短路径算法
- 服务器地图不显示图片,传奇小地图不显示怎么办 传奇服务端小地图制作教程...
- Microsoft Visio 2016 专业版
- 芭蕉树上第十七根芭蕉-- 隐式转换
- 美的集团计算机综合面试群面,美的集团面试
- vs2017工具箱问题(不见工具箱选项卡此组中没有可用控件控件灰化)
- css 实现三维立体旋转效果
- 解决PC微信版本过低 1.0.7.33版本及以上版本方法
- 你真的会在阳光下拍照片么?
- WebDAV是什么,有哪些支持webdav的网盘和工具?
- c++小游戏代码(免费)
- java ftp 被动模式_ftp 主动模式与被动模式
- 重磅!再扩大产能!辉瑞新冠口服药组成之一,歌礼利托那韦口服片要年产5.3亿片;卫材中国推出含长效抗菌剂除菌喷雾 | 美通社头条...
- 追赶法的matlab实现,只需要输入A和d