Dubbo概述
Dubbo是阿里SOA服务化治理方案的核心框架,是一个分布式高性能RPC服务框架,其核心设计原理是微内核+插件,原生实现与第三方实现具有同等地位。
一、Dubbo总体架构
1. 总体层级划分
总体分为三层
- 业务层(Biz)
- RPC层
- Remote层
2. 具体层级划分
将这三层细分,将会得到十层架构
- Biz
- Service
- RPC
- Config
- Proxy
- Registry
- Cluster
- Monitor
- Protocol
- Remoting
- Exchange
- Transport
- Serialize
Service和Config层可以看作API层,提供给API使用者使用。之后的所有层可以看作SPI层,提供给扩展者使用。
二、总体调用过程
服务暴露过程
- 初始化服务实例
- 通过Proxy组件调用具体协议,将服务端要暴露的接口封装成Invoker
不同的协议可以将同一个远程接口配置转化为不同的Invoker对象,比如DubboInvoker - 将Invoker转换为Exporter
Exporter中持有Invoker对象,可以视为在Invoker上包装了一层 - 开启服务端口,将实例记录到内存中
- 通过Registry将服务元数据注册到注册中心
*消费端在启动时通过自身的Registry在注册中心订阅服务端的元数据(IP和端口)
服务调用过程
消费端:
- 从Proxy开始,Proxy中持有一个Invoker对象
- 由Proxy触发Invoker的invoke调用,调用中会用到Cluster组件(负责容错)
- Cluster组件由Directory中获取所有可调用的远程Invoker列表(同一个接口可以有多个节点提供服务)
- 若配置了路由规则,则在上一步结束后,也会根据路由规则对Invoker进行筛选
- 根据LoadBalance策略从存活的Invoker中选取一个可调用的Invoker
- 在Invoker调用前,经过一条过滤器链(实现处理上下文、限流、计数等功能)
- 最后,采用Client进行传输(Netty),在传输之前进行协议构造、序列化等处理
服务端:
- 消费端的调用请求以Request的形式进入服务端,Request会被分配到线程池(ThreadPool)中进行处理
- Server会处理Request,根据其中内容查找对应的Exporter(持有Invoker)
- Invoker在调用最终的实现类之前,会经过多层Filter (Filter与Invoker以装饰器模式组合)
- 最终调用实现类,并返回结果
参考
- 深入理解 Apache Dubbo 与实战