【第五弹】详解分布式中间件Dubbo
六、Dubbo源码分析
本文的源码分析将基于Dubbo 2.7.8版本
1. Dubbo源码环境构建
2. Dubbo分层设计
Dubbo整体结构设计大致上可分为三层,分别是:
(1)业务层:即处理业务逻辑层
(2)RPC 层:即远程过程调用层
(3)Remoting 层:即远程数据传输层
组件名称 | 描述 |
---|---|
Service | 业务层,包括业务代码的实现,比如接口、实现类,直接面向开发者 |
Config | 配置层,对外提供配置,以ServiceConfig和ReferenceConfig为核心,可以直接初始化配置类,也可以解析配置文件生成 |
Proxy | 服务代理层,无论是生产者还是消费者,框架都会产生一个代理类,它用来调用远程接口,整个过程对上层透明,就是业务层对远程调用无感 |
Registry | 注册中心层,封装服务地址的注册与发现,以服务的URL为中心 |
Cluster | 路由层 (集群容错层),负责远程调用的容错策略,负载均衡策略以及路由策略,并且它桥接注册中心,以Invoker为核心 |
Monitor | 监控层,负责监控RPC调用相关的信息,比如调用次数、成功失败的情况、调用时间等 |
Protocol | 远程调用层,封装RPC调用,无论是服务的暴露还是服务的引用都是在Protocol中作为主功能入口,负责Invoker的整个生命周期,Dubbo中所有的模型都向Invoker靠拢 |
Exchange | 信息交换层,建立Request-Response模型,封装请求和响应模式, 比如把请求由同步 转换成异步 |
Transport | 网络传输层,统一网络传输的接口,比如netty和mina统一为一个网络传输接口 |
Serialize | 数据序列化层,负责管理整个框架中的数据传输的序列化和反序列化 |
3. Dubbo远程调用工作流程
Dubbo 框架是用来处理分布式系统中,服务发现与注册以及调用问题的,并且管理调用过程。
Dubbo远程调用流程:
0.服务提供者在启动的时候,会通过读取一些配置将服务实例化;
1.Proxy封装服务调用接口,方便调用者调用。客户端获取Proxy时,可以像调用本地服务一样,调用远程服务。
2.Proxy在封装时,需要调用Protocol定义协议格式,例如:Dubbo Protocol;
3.将Proxy封装成Invoker,它是真实服务调用的实例;
4.将Invoker转化成Exporter,Exporter只是把Invoker包装了一层,是为了在注册中心中暴露自己,方便消费者使用;
5.将包装好的Exporter注册到注册中心;
6.服务消费者建立好实例,会到服务注册中心订阅服务提供者的元数据。元数据包括服务IP和端口以及调用方式(Proxy);
7.消费者会通过获取的Proxy进行调用。通过服务提供方包装过程可以知道,Proxy实际包装了Invoker 实体,因此需要使用Invoker进行调用;
8.(9)在Invoker调用之前,通过Directory获取服务提供者的Invoker列表。在分布式的服务中有可能出现同一个服务,分布在不同的节点上;
9.(10)通过路由规则了解,服务需要从哪些节点获取;
10.(8)Invoker调用过程中,通过Cluster进行容错,如果遇到失败策略进行重试;
11.调用中,由于多个服务可能会分布到不同的节点,就要通过LoadBalance来实现负载均衡;
12.Invoker调用之前还需要经过Filter,它是一个过滤链,用来处理上下文,限流和计数的工作;
13.生成过滤以后的Invoker;
14.用Client进行数据传输;
15.Codec会根据Protocol定义的协议,进行协议的构造;
16.构造完成的数据,通过序列化Serialization传输给服务提供者;
17.Request已经到达了服务提供者,它会被分配到线程池(ThreadPool)中进行处理;
18.Request被线程中的server执行;
19.Server拿到请求以后查找对应的Exporter(包含有 Invoker);
20.由于Exporter也会被Filter层层包裹;
21.通过Filter以后获得Invoker;
22.最后,对服务提供者实体进行调用。
4. Dubbo源码框架设计
入骨相思知不知
玲珑骰子安红豆
入我相思门,知我相思苦,长相思兮长相忆,短相思兮无穷极。