Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现

进入主题前先看一下dubbo各个节点的职责及他们的调用关系
DUBBO各节点图
Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
dubbo-各个节点.png 节点角色说明

节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器
调用关系说明
【Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现】1:服务容器负责启动,加载,运行服务提供者。
2:服务提供者在启动时,向注册中心注册自己提供的服务。
3:服务消费者在启动时,向注册中心订阅自己所需的服务。
4:注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5:服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6:服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
DUBBO调用链图
Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
DUBBO调用链图.jpg
上图所示各个模块初始化的节点和调用过程。本次主要对dubbo如何基于Spring实现、dubbo的自定义拓展及dubbo的代理进行详解。
如何基于Spring实现
1:扩展关键入口DubboNamespaceHandler(截图如下)

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
DubboNamespaceHandler.png 2:如何拓展
在DefaultNamespaceHandlerResolver类中会扫描整个项目"META-INF/spring.handlers"; 文件。打开dubbo对应的jar包可以找到文件“dubbo-2.5.3.jar!\META-INF\spring.handlers”中的内容就是指向DubboNamespaceHandler。如下图所示

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
spring.handlers.png 2.2:dubbo中的bean对象如果定义
在目录“META-INF/spring.schemas”中定义了对应bean对应的属性的namespace及属性如下图所示

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
spring.schemas.png dubbo.xsd中描述了各个标签对应有哪些属性。在dubbo-consumer.xml或者dubbo-provider.xml中加入对应xmlns即可如下图所示

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
dubbo-xx.xml.png 2.3:Spring添加对dubbo标签的解析
spring添加对dubbo标签的解析,如下图所示

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
Spring添加对dubbo标签的解析.png 2.4:如何解析dubbo对应Bean
应用启动导入dubbo-consumer.xml和dubbo-provider.xml文件如下所示:

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
导入dubbo-consumer.xml和dubbo-provider.xml DubboBeanDefinitionParser实现BeanDefinitionParser接口且重写了parse方法如下图所示

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
DubboBeanDefinitionParser实现BeanDefinitionParser接口且重写了parse方
在parse方法中对各个节点进行解析如:ProtocolConfig、ServiceBean、ProviderConfig、ConsumerConfig的解析
2.5:ServiceBean启动过程
首先看一下ServiceBean类结构如下图所示。
Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
ServiceBean
主要的实现在方法onApplicationEvent中,实现了服务配置的解析、导出、Filter链包装及注册服务等。代码片段如下
@Override public void onApplicationEvent(ContextRefreshedEvent event) { if (!isExported() && !isUnexported()) { if (logger.isInfoEnabled()) { logger.info("The service ready on spring started. service: " + getInterface()); } //服务导出 export(); } }

注册关键内容(protocol.export(wrapperInvoker),实际运行的过程中使用那个实现类由ExtensionLoad加载,后面详解)如下图所示

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
protocol初始化
如果想基于spring实现特定功能可以定义自己的xmlns、spring.handler及xsd文件实现。mybatis也是通过同样的拓展进行实现的如下图所示:

Dubbo如何基于Spring实现、SPI|Dubbo如何基于Spring实现、SPI 源码实现
文章图片
mybatis如果实现

    推荐阅读