dubbo源码分析

来源:互联网 发布:dc数据恢复指南针 编辑:程序博客网 时间:2024/04/30 22:32
其实dubbo整个框架内容并不算大,仔细看的话可能最多两天看完一遍,但是目前还是没领悟到怎么做到的扩展性,学习深度还不够~
要学习dubbo源码的话,必须要拿出官方高清大图才行。

这张图看起来挺复杂的样子,真正拆分之后对照源码来看会发现非常清晰、简单直观。

1.如何跟进源码

入口就是各种dubbo配置项的解析,<dubbo:xxx />都是spring namespace,可以看到dubbo jar包下META-INF里面的spring.handlers,自定义的spring namespace处理器。
对于spring不太熟的同学可以先了解下这个功能,入口都在这里,解析成功后每个<dubbo:xxx />配置项都对应一个spring实例。

2.服务提供者

首先把这张图拆分成三块,首先是服务端剖去网络传输模块,也就是大图中的右上角。


这里主要抽几个主要的类,从服务初始化到接收消息的流程简单说明下,有兴趣的再对照源码看下会比较清晰。
  • ServiceBean
继承ServiceConfig,做为服务配置管理和配置信息校验,每一个dubbo:service配置或者注解都会对应生成一个ServiceBean的实例,维护当前服务的配置信息,并把一些全局配置塞入到该服务配置中。
另外ServiceBean本身是一个InitializingBean,在afterPropertiesSet时通过配置信息引导服务绑定和注册。
可以留意到ServiceBean还实现了ApplicationListener,在全部spring bean加载完成后判断是否延迟加载的逻辑。
  • ProtocolFilterWrapper
经过serviceBean引导后进入该类,这个地方注意下,Protocol使用的装饰模式,叶子只有DubboProtocol和RegistryProtocol,在中间调用中会绕来绕去,而且registry会走一遍这个流程,然后在RegistryProtocol中暴露服务再走一遍,注意每个类的作用,不要被绕昏了就行,第一次跟进代码的时候没留意就晕头转向的。
在这之前其实还有个ProtocolListenerWrapper,封装监听器,在服务暴露后通知到监听器,没有复杂逻辑,如果没特殊需求可以先绕过。
再来说ProtocolFIlterWrapper,这个类的作用就是串联filter调用链,如果有看过struts或者spring mvc拦截器源码的应该不会陌生。
  • RegistryProtocol
注册中心协议,如果配置了注册中心地址,每次服务暴露肯定首先引导进入这个类中,如果没有注册中心连接则会先创建连接,然后再引导真正的服务协议暴露流程,会再走一次ProtocolFilterWrapper的流程(这次引导到的叶子是DubboProtocol)。
在服务暴露返回后,会再执行服务信息的注册和订阅操作。
  • DubboProtocol
这个类的export相对较简单,就是引导服务bind server socket。
另外该类还提供了一个内部类,用于处理接收请求,就是下面要提到的ExchangeHandler。
  • DubboProtocol$ExchangeHandler
接收反序列化好的请求消息,然后根据请求信息找到执行链,将请求再丢入执行链,让其最终执行到实现类再将执行结果返回即整个过程完成。

3.客户端

客户端模块与服务端模块比较类似,只是刚好反过来,一个是暴露服务,一个是引用服务,然后客户端多出路由和负载均衡。

  • ReferenceBean
继承ReferenceConfig,维护配置信息和配置信息的校验,该功能与ServiceBean类似
其本身还实现了FactoryBean,作为实例工厂,创建远程调用代理类;而且如果不指定为init的reference都是在首次getBean的时候调用到该factoryBean的getObject才进行初始化
另外实现了InitializingBean,在初始化过程中引导配置信息初始化和构建init的代理实例
  • InvokerInvocationHandler
看到这个类名应该就知道是动态代理的handler,这里作为远程调用代理类的处理器在客户端调用接口时引导进入invoker调用链
  • ProtocolFIlterWrapper
与Service那边的功能类似,构建调用链
  • RegistryProtocol
与service那边类似,如果与注册中心还没有连接则建立连接,之后注册和订阅,再根据配置的策略返回相应的clusterInvoker
比service那边有个隐藏较深的逻辑需要留意的,就是订阅过程,RegistryDirectory作为订阅监听器,在订阅完成后会通知到RegistryDirectory,然后会刷新invoker,进入引导至DubboProtocol的流程,与变更的service建立长连接,第一次发生订阅时就会同步接收到通知并将已存在的service存到字典
  • DubboProtocol
在订阅过程中发现有service变更则会引导至这里,与服务建立长连接,整个过程为了得到串联执行链Invoker
  • ClusterInvoker
ClusterInvoker由RegistryProtocol构建完成后,内部封装了Directory,在调用时会从Directory列举存活的service对应的Invoker,Directory作为被通知对象,在service有变更时也会及时得到通知
调用时在集群中发现存在多节点的话都会通过clusterInvoker来根据配置抉择最终调用的节点,包括路由方式、负载均衡等
dubbo本身支持的节点调用策略包括比如failoverClusterInvoker在失败时进行重试其他节点,failfastClusterInvoker在失败时返回异常,mergeableClusterInvoker则是对多个实现结果进行合并的等等很多
  • DubboInvoker
承接上层的调用信息,作为调用结构的叶子,将信息传递到exchange层,主要用来和echange交互的功能模块

4.网络传输层

从exchange往下都是算网络传输,包括做序列化、反序列化,使用Netty等IO框架发送接收消息等逻辑,先前看的时候没有做统一梳理,后续有机会再来编辑吧。
0 0