http://dubbo.apache.org/zh-cn/docs/user/preface/architecture.html dubbo官方文档
Dubbo自定义标签实现。
dubbo通过Spring加载配置文件后,是如何触发注册中心、服务提供者、服务消费者按照Dubbo的设计执行相关的功能。
所谓的执行相关功能如下:注册中心启动,监听消息提供者的注册服务、接收消息消费者的服务订阅(服务注册与发现机制)。
服务提供者向注册中心注册服务。
服务消费者向注册中心订阅服务。
上面通过dubbo提供的dubbo:application、dubbo:registry、dubbo:protocol、dubbo:provider、dubbo:service分别定义dubbo应用程序名、注册中心、协议、服务提供者参数默认值、服务提供者,这些配置后面的实现原理是什么呢?是如何启动并发挥相关作用的呢?
一、需要先解析dubbo标签,先看DubboNamespaceHandler,
DubboBeanDefinitionParser 和 AnnotationBeanDefinitionParser ,分别基于xml配置文件和注解annotation进行解析
dubbo标签和实例化后的类名,映射如下
Step1:解析id属性,如果DubboBeanDefinitionParser对象的required属性为true,如果id为空,则根据如下规则构建一个id。
如果name属性不为空,则取name的值,如果已存在,则为 name + 序号,例如 name,name1,name2。
如果name属性为空,如果是dubbo:protocol标签,则取protocol属性,其他的则取interface属性,如果不为空,则取该值,但如果已存在,和name处理相同,在后面追加序号。
如果第二步还未空,则取beanClass的名称,如果已存在,则追加序号。
Step2:根据不同的标签解析特殊属性。
dubbo:protocol,添加protocol属性(BeanDefinition)。
dubbo:service,添加ref属性。
dubbo:provider,嵌套解析,dubbo:provider标签有两个可选的子标签,dubbo:service、dubbo:parameter,这里需要嵌套解析dubbo:service标签
知识点:dubbo:provider是配置服务提供者的默认参数,在dubbo spring配置文件中可以配置多个dubbo:provider,那dubbo:service标签如何选取一个合适的dubbo:provider作为其默认参数呢?有两种办法:
将dubbo:service标签直接声明在dubbo:provider方法
在dubbo:service中通过provider属性指定一个provider配置,如果不填,并且存在多个dubbo:provider配置,则会抛出错误。
dubbo:customer:解析嵌套标签,其原理与dubbo:provider解析一样。
Step3:解析标签,将属性与值填充到BeanDefinition的propertyValues中。最终返回BeanDefinition实例,供Spring实例化Bean。
上述已经解答了Dubbo自定义标签的解析实现,主要完成了ApplicationConfig、RegistryConfig、ServiceBean、ReferenceBean实例的初始化,那什么时候构建与注册中心的连接、服务提供者什么时候会向注册中心注册服务,服务消费者向注册中心订阅服务呢?
据我目前所掌握的知识,Spring在对象实例化,一般有两种方式来对Bean做一些定制化处理。
1. 实现BeanPostProcessor Spring后置处理器,在Bean初始化前后执行相关操作。
2. Bean实现InitializingBean接口(init-method)
ServiceBean(服务提供者)与ReferenceBean(服务消费者)比较特殊,实现了Spring与Bean生命周期相关的接口。
摸到Dubbo服务注册与发现机制(Dubbo服务提供者、Dubbo服务消费者、注册中心的启动流程入口点了,下一步就是分析ServiceBean、ReferenceBean的实现原理,试图揭开Dubbo服务注册与发现机制