首先上dubbo调用服务经典流程图:
dubbo配置基于 Spring 的 Schema 和 XML 扩展机制实现,dubbo的配置文件会通过dubbo自定义的标签解析器去解析。reference标签会解析成对应的ReferenceBean。
ReferenceBean实现spring 接口InitializingBean的afterPropertiesSet方法,所以bean初始化会执行afterPropertiesSet,dubbo配置init为加载时即刻初始化,就是afterPropertiesSet()--->getObject()---->ReferenceBean的父类ReferenceConfig的init方法,init的方法中主要是做了新旧版本的兼容,消费者全局配置信息的获取,校验配置信息等操作,最后将消费者配置信息封装成map创建代理对象。
createProxy(Map)根据配置信息中注册中心类型,非本地暴露,非直连,通过注册中心配置拼url,通过refprotocol.refer调用RegistryProtocol的refer方法(这里说一下,RegistryProtocol是Protocol接口的一个实现类,Protocol接口有很多的实现类,dubbo支持多种协议,通过配置动态支持不同协议的实现是基于dubbo的SPI(服务发现),通过适配注解@Adaptive,通过动态代理生成代理类Protocol$Adaptive,通过dubbo全局Url获取配置的对应协议的实现类。)
上面方法栈信息可以看出,生成的代理类,以及调用RegistryProtocol之前经过的两个装饰类(稍后补充解释该两个类的作用)。
RegistryProtocol的refer方法主要是使用注册中心地址获取注册中心实例,调用doRefer方法
在doRefer里面主要通过RegistryDirectory类完成了消费者向注册中心注册,和订阅服务。