本文基于dubbo 2.7.5版本代码
前面的文章介绍了很多dubbo的各个组件,本文将对通过介绍启动和服务调用过程梳理一下这些组件,也让大家对dubbo的全局有一个了解。
一、服务端启动
1、spring启动调用后处理器ServiceAnnotationBeanPostProcessor,该后处理器是通过@EnableDubbo引入的,该后处理器完成了下面三件事:
- 注册DubboBootstrapApplicationListener
- 创建DubboClassPathBeanDefinitionScanner对象,该类用于扫描@Service注解
- 遍历每个@Service注解的类,针对每个类创建一个创建ServiceBean的BeanDefinition对象,并将@Service的属性信息设置到BeanDefinition对象,之后将BeanDefinition对象注册到容器,名字为:ServiceBean:+接口名+Version+group
2、spring启动时根据BeanDefinition创建对应的ServiceBean对象;
3、spring容器启动完毕后,发布事件ContextRefreshEvent;
4、dubbo使用第一步注册的监听器DubboClassPathBeanDefinitionScanner监听到ContextRefreshEvent事件,该监听器调用DubboBootstrap.start()启动DubboBootstrap;
5、下面的步骤如下图:
二、客户端启动
spring启动调用后处理器ReferenceAnnotationBeanPostProcessor,该后处理器是通过DubboComponentScanRegistrar注册到spring容器的,而DubboComponentScanRegistrar是由@EnableDubbo引入的,该后处理器完成了:
- 扫描类的属性是否有注解@Reference
- 如果有,则创建对应的ReferenceBean对象并注册到spring容器
- 调用ReferenceBean对象的get方法,创建远程服务代理对象
- 代理对象创建完毕后,spring将代理赋值给对应的@Reference注解的属性
这里面最关键的是ReferenceBean对象的get方法,下面介绍一下这个方法的流程:
三、服务调用
当消费端调用时,其实调用的是上一小节里面最后生成的代理对象。