Dubbo架构设计与源码解析(一) 架构设计

2022-12-28 0 470

译者:白银

Dubbo架构设计与源码解析(一) 架构设计

一、构架演进

单应用领域构架 —-> 横向构架 —-> 分布式系统构架 —-> 微服务项目构架 —-> 云原生植物构架

Dubbo架构设计与源码解析(一) 架构设计

二、Dubbo整体构架

Dubbo架构设计与源码解析(一) 架构设计

1、配角职责

Container:服务项目罐子 tomcat、jetty、weblogic

Provider:服务项目提供者

•Consumer:服务项目顾客

•Registry:注册登记服务中心(zookeeper、Nacos 、Apollo)

•Minitor:监控服务中心

2、调用流程

(1)服务项目罐子负责启动,加载,运行服务项目提供者。

(2)服务项目提供者在启动时,向注册登记服务中心注册登记自己提供的服务项目。

(3)服务项目顾客在启动时,向注册登记服务中心订阅自己所需的服务项目。

(4)注册登记服务中心返回服务项目提供者地址列表给顾客,如果有变更,注册登记服务中心将基于长连接推送变更数据给顾客。

(5)服务项目顾客,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

(6)服务项目顾客和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控服务中心。

三、Dubbo分层构架

Dubbo架构设计与源码解析(一) 架构设计

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

四、Dubbo六大核心能力

1、面向接口代理的高性能RPC调用

提供高性能的基于代理的远程调用能力,服务项目以接口为粒度,为开发者屏蔽远程调用底层细节。

2、服务项目自动注册登记和发现

支持多种注册登记服务中心服务项目,服务项目实例上下线实时感知。

3、负载均衡和智能容错

内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。

4、高度可扩展能力

遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现

5、运行期流量调度

内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。

6、可视化的服务项目治理与运维

提供丰富服务项目治理、运维工具:随时查询服务项目元数据、服务项目健康状态及调用统计,实时下发路由策略、调整配置参数。

五、RPC通信协议

分布式系统框架的核心是RPC框架,RPC框架的核心是RPC协议。RPC是指服务项目之间远程调用协议,也就是指明了服务项目之间接口调用,进行序列化和网络传输的约定。

Dubbo架构设计与源码解析(一) 架构设计
Dubbo架构设计与源码解析(一) 架构设计

Dubbo提供了 Triple(Dubbo3)、Dubbo2 协议, 第三方协议进行了集成,包括 gRPC、Thrift、JsonRPC、Hessian2、REST 等。其中RPC协议包含:服务项目提供者的IP地址、协议指定开放端口、运行服务项目、协议报文编码、序列化方式

六、负载均衡和集群容错

1、负载均衡

Dubbo 提供的是客户端负载均衡,即由 Consumer 通过负载均衡算法得出需要将请求提交到哪个 Provider 实例。在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

算法

特性

备注

RandomLoadBalance

加权随机

默认算法,默认权重相同

RoundRobinLoadBalance

加权轮询

借鉴于 Nginx 的平滑加权轮询算法,默认权重相同

LeastActiveLoadBalance

最少活跃优先 + 加权随机

背后是能者多劳的思想

ShortestResponseLoadBalance

最短响应优先 + 加权随机

更加关注响应速度

ConsistentHashLoadBalance

一致性 Hash

确定的入参,确定的提供者,适用于有状态请求

2、集群容错

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试

Dubbo架构设计与源码解析(一) 架构设计

容错机制

特性

Failover

失败自动切换

Failfast

快速失败

Failsafe

失败安全

Failback

失败自动恢复

Forking

并行调用多个服务项目器

Broadcast

广播调用所有提供者

七、设计思想

1、领域模型

Protocol 服务项目域:Invoker 暴露和引用的主功能入口,它负责 Invoker 的生命周期管理

Invoker 实体域:Dubbo 的核心模型,其它模型都向它靠拢,或转换成它,它代表一个可执行体,可向它发起 invoke 调用,它有可能是一个本地的实现,也可能是一个远程的实现,也可能一个集群实现

Invocation 会话域:持有调用过程中的变量,比如方法名,参数等

2、基本设计原则

Microkernel + Plugin 模式:Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的,也就是 Dubbo 的所有功能点都可被用户自定义扩展所替换

URL:采用 URL 作为配置信息的统一格式,所有扩展点都通过传递 URL 携带配置信息

八、总结

至此,Dubbo整体构架与核心模块介绍完成,文中如有不当或者错误观点,欢迎大家评论区指出。感兴趣的同学,可以关注后续“Dubbo构架设计与源代码导出”系列的文章。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务