前言:
在很久之前就对rpc(远程过程调用)框架非常感兴趣,然后主动去学习了阿里开源框架dubbo,最近阿里也是重启了dubbo的更新,dubbo又重新散发出活力。
当然学习首先是看dubbo官方文档,官方文档有非常详细的功能说明以及使用方法,对于使用dubbo的开发者已经足够了。最近在实习的公司中也有使用到dubbo来编写接口,我辛辛苦苦学习的dubbo框架终于有了用武之地。但我觉得还不够,今天在可伸缩服务架构:框架与中间件一书中看到有dubbo源码解析的一部分,大为惊喜!立刻打开博客开始记录起来。
源码分析:
dubbo初始化是通过spi,spi解释如下:
首先编写dubbo.xml时需要解析dubbo标签:<dubbo:/>,而解析dubbo标签需要以下步骤:
dubbo的核心接口Protocol:
dubbo的URL设计:
dubbo服务暴露过程:
引用服务过程:
FailOverCluster分析:
总结:
服务暴露原理:dubbo的namespacehandler里面会使用serviceconfig来解析dubbo标签获取ref,里面的afterpropertiesset方法将设置service配置以及暴露服务,利用proxyFactory(Javassist增强字节码,内部直接调用方法不是反射调用)的getInvoker方法将服务对象转化为invoker,利用Protocol的export方法将invoker转化为exporter(不同协议),然后放进exporters列表中。Serviceconfig最后监听到ContextRefreshed事件后开始暴露方法,利用netty去绑定端口监听服务调用。
调用服务原理:dubbo的namespacehandler里面会使用referenceconfig来解析dubbo标签获取interface,里面的afterpropertiesset方法将设置reference配置以及返回接口代理对象,利用Protocol的refer方法生成Invoker,利用ProxyFactory将Invoker转化为接口ref。生成接口ref时会根据配置信息产生对应的Cluster,将directory中的多个invoker整合成一个invoker对象。Cluster会根据容错机制调用select方法选择Invoker来调用产生结果返回,select方法里面带有配置信息中的loadbalance参数,select根据loadbalance来选择其中的Invoker返回给Cluster。