这是Dubbo官网的服务提供者的时序图 复制代码
此文Dubbo的版本是2.7,1. Dubbo的通过@EnableDubbo来启动Dubbo的初始化配置,主要配置扫描ServiceBean的路径, 还有配置multipleConfig=true, 这个是支持多配置模式(例如: 支持多个注册中性)
这里通过@Import注解,引入DubboComponentScanRegistrar对象实现ServiceBean的BeanDefinition的Bean的注册.
DubboComponentScanRegistrar实现ImportBeanDefinitionRegistrar的接口, 这里实现注册 ServiceAnnotationBeanPostProcessor这个BeanDefinition.
Dubbo中主要通过ServiceAnnotationBeanPostProcessor来实现ServiceBean的BeanDefinition的注册.
这里可以看到ServiceAnnotationBeanPostProcessor实现了BeanDefinitionRegistryPostProcessor接口的方法,postProcessBeanDefinitionRegistry方法传入BeanDefinitionRegistry实例,该方法是将ServiceBean的BeanDefinition注册到BeanDefinitiond到BeanDefinitionRegistry实例中.
registerServiceBeans方法,首先是通过DubboClassPathBeanDefinitionScanner扫描包路径的过滤所有含有@Servcie注解的Bean,然后注到BeanDefinitionRegistry实例总
registerServiceBean方法就是解析带有@Service的Bean,并注册到BeanDefinitionRegistry的实例中.
接下来就看下ServiceBean是怎么服务Exportor的过程: 首先Service自身是实现ApplicationListener接口,监听ContextRefreshedEvent事件,也是ApplicationContext启动完成后,开始执行export. 复制代码
这里调用父类的export,并发布ServiceBeanExportedEvent事件.
父类中exprot方法中,判断是否应该delay发布, 如果没有配置这个delay参数,则调用 doExport方法同步调用发布逻辑.
doExport方法里面checkAndUpdateSubConfigs主要是检查和更新配置,然后设置export标志为TRUE, 如果Path参数为空,则设置接口的名字.并调用doExportUrls方法,导出url.
通过loadRegistries获取提供方的注册的URL,主要是获取注册的URL,并构建providerModel, 并设置到ApplicationModel中. 然后执行doExportUrlsFor1Protocol主要是做协议层的导出
doExportUrlsFor1Protocol这个方法里面主要通过ProxyFactory将提供服务包装成Invoker对象,并且,并调用protocal的export导出服务.
由于doExportUrlsFor1Protocol处理路基太长, 下面是该函数的代码, 从这里看到如果没有 配置remote导出, 则会同时执行导出到本地(这个本地和远程的以后会详细介绍).
这个就是协议导出的核心处理逻辑,通过ProxyFactory将ref和interface和URL包装成Invoker对象, 然后protocol对象(其中这里真实对象是DubboProtocol,通过dubbo的SPI加载的)调用export,实现服务的导出.
DubboProtocol的export方法主要构造DubboExporter对象,缓存该对象, 并调用openServer开启ExchageServer(与客户端的交互的对象),
这里的的key是服务端的IP加端口,默认端口20880, 如果没有 ExchangeServer则创建ExchangeServer, 并缓存到serverMap
Exchangers调用bind绑定URL和requestHandler,requestHandler就是调用实际提供者对象,
getExchanger的ExchangeServer,并绑定requestHandler的
通过Dubbo的SPI机制实例化ExchangeServer, 实际实例对象是 HeaderExchanger
这里可以看到ExchangeServer同时绑定Transporter的实例对象,它的通过SPI动态加载的,默认是NettyTransporter, 使用Netty作为 传输层.
这里可以看到默认是绑定的是NettyServer作为服务端通信的组件.
总结:今天完成了Dubbo基于注解驱动的服务导出过程,还有注册这一块没没有介绍,这个放在下一节中单独介绍.