dubbo源码浅析(二)-标签解析

7 篇文章 1 订阅
6 篇文章 0 订阅

前面了解了dubbo的插件化机制之后,接下来进入正题,研究一下dubbo的核心原理,由于dubbo的功能配置较多,为了更高效的研读代码,在阅读的过程中尽量忽略一些细节,重点关注它的主干流程,主干了解清楚之后再去分析它的一些细节功能就更轻松了,否则容易陷入各种细枝末节不能自拔让整个代码的阅读周期变得冗长无比效率大打折扣。
Dubbo框架中,服务提供者和服务消费是两个核心角色,所以主要通过服务提供者初始化、服务消费者初始化、服务调用流程这三个部分来分析dubbo框架是如何为我们的应用实现远程调用的。
做任何事之前都要找到开始的地方,阅读框架代码也不例外,对dubbo框架来说它的最佳入口无疑是使用它的地方,由于Spring IOC框架在java后端程序的广泛应用,大部分程序都是结合Spring IOC框架使用dubbo框架,如下所示:

<dubbo:application name="${dubbo.application.name}"
       owner="${dubbo.application.owner}" organization="${dubbo.application.organization}"
       logger="log4j" environment="${dubbo.environment}" />
    <dubbo:protocol name="dubbo" port="-1" accesslog="false" />
    <dubbo:registry address="${dubbo.registry.address}"
       check="false" />
    <dubbo:monitor protocol="registry" />

<dubbo:provider delay="-1" group="${dubbo.provider.group}"
       version="1.0" timeout="5000" filter="-monitor,traceFilter" dispatcher="kaolaall" />
<dubbo:service
    interface="com.netease.haitao.mykaola.compose.api.UserBrandFacadeService" ref="userBrandFacadeServiceImpl" />

<dubbo:consumer group="${dubbo.consumer.group}" cluster="failfast"
       version="1.0" check="false" filter="-monitor,traceFilter" />
<dubbo:reference id="sendCouponRemoteApiImpl"     interface="com.netease.haitao.online.web.remote.api.SendCouponRemoteApi"
       group="${dubbo.jxc.group}" />

上面的配置向dubbo框架注册了应用名称、框架协议、提供者全局属性、服务接口、消费者全局属性、服务消费者,下面就由这段简单的配置入手来分析一下服务提供者初始化和服务消费者初始化。
从上面的使用示例可以看到,dubbo框架扩展了一套dubbo标签,先简单了解一下Spring的标签扩展机制。Spring框架提供了两个接口:NamespaceHandler负责namespace处理和BeanDefinitionParser负责bean的解析。
代码
这里写图片描述
使用者可以实现NamespaceHandler接口,然后可以在classpath(包括class文件路径和jar包中的路径)的META-INF目录下编写一个spring.handlers文件,该文件中定义名称空间URL和名称空间处理器类的映射,如dubbo框架的spring.handlers文件内容如下:

http\://code.alibabatech.com/schema/dubbo=com.alibaba.dubbo.config.spring.schema.DubboNamespaceHandler

Spring框架初始化时会加载所有classpath的spring.handlers文件,把namespace URL和namespace处理器的映射存到一个Map中,Spring框架在解析bean定义文档时,遇到了非IOC内置(beans名称空间下)的标签,会在这个Map中查找namespace处理器,使用这个自定义的处理器来进行标签解析工作,可以在DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate类中看到相关的代码:
这里写图片描述
Dubbo框架实现了DubboNamespaceHandler 来处理dubbo名称空间:
这里写图片描述
处理器初始化时给dubbo所有标签都注册了一个解析器,其他的标签主要任务是给框架设置一些全局属性可以暂时先放一边,重点需要看下service和reference两个标签,它们分别用来注册服务和服务消费者,dubbo:service会被框架解析成一个ServiceBean,dubbo:reference会被框架解析成一个ReferenceBean。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值