文章目录
- 1.dubbo的整体调用链路
- 2.dubbo的源码整体设计
- 3.重要接口和类
1.dubbo的整体调用链路
-
消费者通过Interface进行方法调用,统一交由消费者的Proxy处理(Proxy通过ProxyFactory来进行代理对象的创建)
-
Proxy调用Filter模块,做一个统一的过滤请求。(这里的过滤一般是服务容错、调用本地缓存等)
-
进入到最主要的invoker调用逻辑:
-
通过Directory读取配置信息, 最终通过list方法获取所有的invoker
-
通过Cluster模块,根据选择的具体路由规则来选择invoker列表
-
通过loadBalance模块,选择负载均衡策略,选择一个具体的invoker来处理请求
-
如果执行出错,且Consumer阶段配置了重试机制,则会重新尝试执行
-
继续经过filter,进行执行功能的前后封装 invoker 选择具体的执行协议。(注意这里的filter要区别于上面步骤2中的filter,这里做的事情与上面完全不同,这里操作有:context、deprecated、count、limit、monitor等)
-
请求进入client,进行codec(编码)、serialization(序列化),然后发送数据给provider
-
请求到达Provider中的Server, 这里进行方便吗和反序列化的接收数据
-
使用Exporter选择执行器(执行协议)
-
交给Filter进行一个提供者端的过滤, 到达invoker
-
这里我们可以将6、7、8的执行过程与前面 4、5的执行过程做一个对比,前面4、5的执行过程时通过filter包装对象 – > invoker选择执行协议 —> client编码和序列化数据 ;这里6、7、8的执行过程是 server反序列化接收到的数据 --> Export选择执行协议 —> filter 包装数据。我们可以看到前面4、5的过程是服务消费端加工数据和传输的过程, 后面6、7、8是服务提供端接收数据和翻译数据的过程。
-
通过invoker调用接口的具体实现,然后返回
2.dubbo的源码整体设计
start —> interface — > proxy – >filter —> invoker --> filter —> client ----> codec—>serilization ----> server —> export —> filter —> invoker
- service 服务层:该层与实际业务逻辑有关,根据服务消费方和服务提供方的业务设计,实现对应的接口。
- config 配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类
- proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy 为中心,扩展接口为 ProxyFactory
- registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactory, Registry, RegistryService
- cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 Cluster, Directory, Router, LoadBalance
- monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactory, Monitor, MonitorService
- protocol 远程调用层:封装 RPC 调用,以 Invocation, Result 为中心,扩展接口为 Protocol, Invoker, Exporter
- exchange 信息交换层:封装请求响应模式,同步转异步,以 Request, Response 为中心,扩展接口为 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer
- transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 Channel, Transporter, Client, Server, Codec
- serialize 数据序列化层:可复用的一些工具,扩展接口为 Serialization, ObjectInput, ObjectOutput, ThreadPool
-
Protocol 是服务域,它是 Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理。
-
Invoker 是实体域,它是 Dubbo 的核心模型,其他模型都是向它靠拢,或转换成它,它代表一个可执行体,可向它发起 Invoker 调用,它有可能是一个本地实现,也有可能是一个远程实现,也有可能是一个集群实现。
-
在 RPC 中,Protocol 是核心层,也就是只要有 Protocol + Invoker + Exporter 就可以完成非透明的 RPC 调用,然后在 Invoker 的主过程上 Filter 拦截点。
-
当我们使用服务提供者调用服务提供者的时候,会经过一系列的Filter链,Filter链在服务提供者端有,在服务调用者端也是有的。
3.重要接口和类
- Invocation
- Invoker
- Exporter
- Directory
- Filter
- Protocol
- Transporter
- LoadBalance
Invocation: 其封装了远程调用的具体信息
Invoker: 提供者 provider 的代理对象,代码中表示提供者。消费者进行远程调用时,其通过服务路由、负载均衡、集群容错等机制要查找的就是 Invoker。找到了其需要的 Invoker 实例就可以进行远程调用了。
Exporter: 服务暴露对象,可以获取到服务暴露实例所包含的远程调用实例 Invoker
Directory: 可以将 Directory 理解为一个 Invoker 列表。
Filter: 当我们使用服务提供者调用服务提供者的时候,会经过一系列的Filter链,Filter链在服务提供者端有,在服务调用者端也是有的。
Protocol: 协议
Transporter: 传送者, Netty的实现
LoadBalance: 负载均衡的接口, 实现类有5个, hash算法, 最小回应, 随机轮询, 最少响应…