专栏首页技术男的宅之路深入Dubbo源码 - Dubbo配置文件解析

深入Dubbo源码 - Dubbo配置文件解析

本文代码:https://github.com/GloryXu/test-project.git

从16年开始接触Dubbo,刚开始觉得很神奇,配置非常简洁,与Spring配置无缝衔接。上网各种搜索,Zookeeper + Provider + Consumer,测试项目跑起来了,很开心。但是对于源码总是狠不下心学习,那么多类,那么多英文注释,吓退我了。最近终于狠下心来一点一点的Debug代码,终于有了点收货,记录下。

Dubbo配置文件Demo

Provider配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://code.alibabatech.com/schema/dubbo
           http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="test-dubbo" />

    <dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}"/>

    <dubbo:protocol name="dubbo" port="${dubbo.registry.port}"/>

    <dubbo:service interface="com.redsun.dubbo.provider.ProviderI" ref="providerImpl"/>

</beans>

Properties文件中的配置

dubbo.registry.address=zookeeper://127.0.0.1:2181

Consumer配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
           http://code.alibabatech.com/schema/dubbo
           http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="test-dubbo-consumer"  />

    <!-- 使用zookeeper集群注册中心暴露发现服务地址 -->
    <dubbo:registry address="${dubbo.registry.address}" timeout="2500" />

    <!--<dubbo:protocol host="192.168.30.56" />-->

    <dubbo:reference id="providerI" interface="com.redsun.dubbo.provider.ProviderI"/>
</beans>

Properties配置同Provider

Dubbo配置文件加载

Spring的加载过程非常繁琐,哪里强大?待我日后慢慢道来,其实看懂了本篇文章,对于Spring加载也能有点了解,今天主要说Dubbo的配置文件加载和解析。

Spring识别Dubbo配置文件

在Spring的加载配置文件的时候,首先要做的就是解析配置文件,在解析发现节点是 import的时候,会再进行读取和解析 resource中的配置文件信息。详见如下,定心的详细的Debug跟踪Spring加载代码,不难发现,此处贴上关键代码

读取Dubbo配置文件之后

读取文件之后就会开始解析 dubbo-provider.xml文件,详见下图

继续跟

在解析完元素之后,怎么就将解析权限交给 Dubbo.jar了呢,之前我们所跟踪的代码都是Spring代码中的,此处给出了答案。通过识别元素是Dubbo开头的来获取 dubbo-provider.xml配置文件中的头信息,就是我们常说的Schema,来获取Dubbo中的解析Handler --> DubboNamespaceHandler

Spring会获取 META-INF/spring.handlers中的信息,大家也许会对这个文件很陌生,我们来看看这里面的信息

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

有没有豁然开朗的感觉,在此配置文件中配置了 http\://code.alibabatech.com/schema/dubbo此schema所对应的Handler了,有兴趣的同学可追踪下获取Handler的代码。

:其实Spring也有相应的 META-INF/spring.handlers文件,里面也有类似的配置信息,有兴趣的同学可以自行跟踪下

Dubbo配置文件解析

好了,在获取到Dubbo的Handler之后又做了什么呢?

DubboNamespaceHandler -- Dubbo处理器

这里相信大家就不陌生了吧,此处将Dubbo配置文件中的所有相关的节点都定义了对应的BeanDefinition解析器,此时也就不难想到,在解析到对应的节点时就去获取对应的parsers。

Service的解析

此处我们姑且跟踪下Service节点的parse详情。

按照我们之前所想,开始解析了,并读取service节点信息进行作相应的操作了。 什么操作呢?

DubboNamespaceHandlerinit方法中我们就知道service所对应的 beanClass就是 ServiceBean,此处的目的是通过反射来获取beanClass的所有是public的单个参数的set方法,并查看是否在配置文件中有了对应的配置,如果有则设置到 beanDefinition对象中。那么这个对象最终存在了哪里?在这里!

这一行代码太隐蔽了,不仔细很难发现。熟悉Spring源码的应该知道有一个BeanMap用于存放所有的Bean信息。

到此,配置文件中的service配置终于转化成一个内存中的对象了,也完成了解析的过程。

总结

之前总是狠不下心看源码,难,多,每次都退却了。静下心来跟一下,在熟悉代码的过程中还能学习更多的细节。比如在配置文件中使用classpath配置路径时,如果“:”无意写了个"/"并没有什么影响,Spring代码会subString的。

阅读源码,在路上,后续还会有~~

觉得有帮助,欢迎关注

本文分享自微信公众号 - 爪哇之路(java_roads),作者:GloryXu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-12-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深度Dubbo源码 - SPI的使用与好处

    相信阅读过Dubbo源码的同学应该看到在Dubbo中的很多接口上都有一个 @SPI的注解,笔者也不例外,但是一直不知道这个注解具体是干什么的,为了解决什么问题,...

    RedSheep
  • vue+element-ui+xlsx实现校验前端上传的Excel文件

    项目中需要校验上传的Excel模板是否符合规范。一开始的想法是在后端进行校验,但是后来想到一个跑批的文件最大是2M,如果放置在后端校验,对于不规范的文件,这2M...

    RedSheep
  • 深入Dubbo源码 - Dubbo消费者调用过程

    之前已经学习了, Dubbo是怎样加载配置文件的,怎样初始化 Bean的。那只是 Dubbo真正运行的准备工作,并不设计 Dubbo的核心,笔者也并不是很了解,...

    RedSheep
  • Dubbo基本用法-Dubbo Provider配置

    本章节主要讲述如何配置dubbo,按照配置方式上分,可以分为:XML配置,properties方式配置,注解方式配置,API调用方式配置。

    烂猪皮
  • JAVA单服务应用拆分成多个服务的实践(2)--服务的dubbo化

    上篇文章JAVA单服务应用拆分成多个服务的实践(1)--拆分的设计思想--提到,需要将各个应用微服务化. 我的应用是使用Spring boot ,没用spri...

    星痕
  • dubbo 2.7.0 中缺乏 <dubbo:annotation /> 的解决方案

     从 dubbo 2.6.5 升级到 2.7.0,突然发现好多地方不能用了,dubbo:annotation 直接报红,原先的 @Service 和 @Refe...

    JMCui
  • SpringBoot之Dubbox

    上次springboot集成dubbo写过一个简单的demo调用的方式,由于spring版本的问题,这次使用duboox,完全基于注解的方式。

    王念博客
  • dubbo起步

    jeremyxu
  • Dubbo入门-协议;注册中心

    Dubbo入门-协议&注册中心 一、配置dubbo多协议模式 1、默认协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,...

    奋斗蒙
  • spring|springboot集成dubbo

    现在国内中小公司,远程调用基本上用的都是dubbo ,当然小刀的公司也不例外,我们以前用的是dubbo 2.4.x的版本,虽然也能使用,但是本着新项目新技术的追...

    微笑的小小刀

扫码关注云+社区

领取腾讯云代金券