下图标记注释:
淡蓝色:consumer范围
淡绿色:provider
中轴线:服务提供者和消费者公用的接口
紫色:继承和实现
蓝色虚线:初始化
红色:调用链路情况
黑色:依赖
dubbo链路情况
dubbo源码流程
dubbo执行流程(看图说话)
- Start–>Interface(在中轴线上,生产者和消费者都需要使用)–>消费端的Proxy(Proxy的创建需要ProxyFactory.getProxy())使用jdk和javassist代理–>
- (中间可以加自定义filter过滤器)
- Invoker调用list方法—》调用Directory中的list–》利用注册中心Directory(RegisterDirectory、RegistryProtocol)最终通过list方法拿到注册中心中的所有的invoker),然后返回给Directory–>Directory在通过路由route方法调用Router中的规则选取Invoker,然后调用loadBalance,然后loadBalance根据负载均衡策略Cluster模块,选出调用的Invoker后发起调用。
- 经过Filter过滤器,通过具体的协议,拿到一个Invoker对象(包括重试阶段)
- 拿到Invoker,后需要经过DubboInvoker—》ExchangeClient–》Client
- Client调用Codec中的encode–》Serialization中的serialize进行序列化
- 服务端Server通过Codec中的decode–》Serialization中的deSerialize进行反序列化
- Server调用received方法传给ChannelHandler然后再经过DubboHandler,再经过DubboExporter,最后传给Exporter。
- Export选择一个执行器,中间通过Invoke过滤器,到达Invoker(Invoker也是ProxyFactory的getInvoker创建的代理),最终调用到实现类Impl
dubbo分层结构(10层,参考图片)
- Bussiness(业务逻辑层)
- service层 包括业务代码,如接口,实现类,直接面向开发者
- RPC(远程过程调用层)
- Config:配置层 。对外提供配置,以ServiceConfig和ReferenceConfig为核心,可以直接初始化配置类,也可以解析配置文件生成
- Proxy:服务代理层 无论是生产者Proxy还是消费者Invoker,框架都会产生一个代理类,整个过程对上层透明,就是业务层对远程调用无感
- Registry:注册中心层 封装服务地址的注册与发现,以服务URL为中心
- Cluster:路由层(集群容错层) 提供了多个提供者的路由和负载均衡,并且桥接注册中心,以Invoker为核心
- Monitor:监控层,RPC调用相关信息,如调用次数,成功失败情况,调用时间等信息在这一层完成
- Protocol:远程调用层,封装RPC调用,无论是服务的暴漏还是引用,都是在Protocol中作为主功能入口,负责Invoker的整个生命周期,Dubbo中所有的模型都想Invoker靠拢
- Remoting(远程数据传输层)
- exchange:信息交换层 封装请求和响应的模式,如把请求由同步转化成异步
- transport:网络传输层 统一网络传输的接口,比如netty、mina统一为一个网络传输接口
- serialize:数据序列化层 负责管理整个框架中的数据传输的序列化和反序列化
结束语
文章由于是自己总结,导致有些地方用词不够严谨,希望大家多多见谅,多多指教。