这是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基于注解驱动的服务导出过程,还有注册这一块没没有介绍,这个放在下一节中单独介绍.缓存