转载

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这是Dubbo官网的服务提供者的时序图
复制代码
Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

此文Dubbo的版本是2.7,1. Dubbo的通过@EnableDubbo来启动Dubbo的初始化配置,主要配置扫描ServiceBean的路径, 还有配置multipleConfig=true, 这个是支持多配置模式(例如: 支持多个注册中性)

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这里通过@Import注解,引入DubboComponentScanRegistrar对象实现ServiceBean的BeanDefinition的Bean的注册.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

DubboComponentScanRegistrar实现ImportBeanDefinitionRegistrar的接口, 这里实现注册 ServiceAnnotationBeanPostProcessor这个BeanDefinition.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

Dubbo中主要通过ServiceAnnotationBeanPostProcessor来实现ServiceBean的BeanDefinition的注册.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这里可以看到ServiceAnnotationBeanPostProcessor实现了BeanDefinitionRegistryPostProcessor接口的方法,postProcessBeanDefinitionRegistry方法传入BeanDefinitionRegistry实例,该方法是将ServiceBean的BeanDefinition注册到BeanDefinitiond到BeanDefinitionRegistry实例中.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

registerServiceBeans方法,首先是通过DubboClassPathBeanDefinitionScanner扫描包路径的过滤所有含有@Servcie注解的Bean,然后注到BeanDefinitionRegistry实例总

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

registerServiceBean方法就是解析带有@Service的Bean,并注册到BeanDefinitionRegistry的实例中.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析
接下来就看下ServiceBean是怎么服务Exportor的过程:
首先Service自身是实现ApplicationListener接口,监听ContextRefreshedEvent事件,也是ApplicationContext启动完成后,开始执行export.
复制代码
Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这里调用父类的export,并发布ServiceBeanExportedEvent事件.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

父类中exprot方法中,判断是否应该delay发布, 如果没有配置这个delay参数,则调用 doExport方法同步调用发布逻辑.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

doExport方法里面checkAndUpdateSubConfigs主要是检查和更新配置,然后设置export标志为TRUE, 如果Path参数为空,则设置接口的名字.并调用doExportUrls方法,导出url.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

通过loadRegistries获取提供方的注册的URL,主要是获取注册的URL,并构建providerModel, 并设置到ApplicationModel中. 然后执行doExportUrlsFor1Protocol主要是做协议层的导出

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

doExportUrlsFor1Protocol这个方法里面主要通过ProxyFactory将提供服务包装成Invoker对象,并且,并调用protocal的export导出服务.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

由于doExportUrlsFor1Protocol处理路基太长, 下面是该函数的代码, 从这里看到如果没有 配置remote导出, 则会同时执行导出到本地(这个本地和远程的以后会详细介绍).

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这个就是协议导出的核心处理逻辑,通过ProxyFactory将ref和interface和URL包装成Invoker对象, 然后protocol对象(其中这里真实对象是DubboProtocol,通过dubbo的SPI加载的)调用export,实现服务的导出.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

DubboProtocol的export方法主要构造DubboExporter对象,缓存该对象, 并调用openServer开启ExchageServer(与客户端的交互的对象),

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这里的的key是服务端的IP加端口,默认端口20880, 如果没有 ExchangeServer则创建ExchangeServer, 并缓存到serverMap

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

Exchangers调用bind绑定URL和requestHandler,requestHandler就是调用实际提供者对象,

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

getExchanger的ExchangeServer,并绑定requestHandler的

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

通过Dubbo的SPI机制实例化ExchangeServer, 实际实例对象是 HeaderExchanger

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这里可以看到ExchangeServer同时绑定Transporter的实例对象,它的通过SPI动态加载的,默认是NettyTransporter, 使用Netty作为 传输层.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

这里可以看到默认是绑定的是NettyServer作为服务端通信的组件.

Dubbo源码分析(二)-----基于注解的提供者Exportor过程分析

总结:今天完成了Dubbo基于注解驱动的服务导出过程,还有注册这一块没没有介绍,这个放在下一节中单独介绍.

原文  https://juejin.im/post/5d1d768ef265da1b6029206f
正文到此结束
Loading...