作者:黄金
一、架构演变
单应用架构 ----> 垂直架构 ----> 分布式架构 ----> 微服务架构 ----> 云原生架构
二、dubbo 总体架构
1、角色职能
container:服务容器 (tomcat、jetty、weblogic)
provider:服务提供者
consumer:服务消费者
registry:注册中心( zookeeper、nacos 、apollo)
minitor:监控中心
2、调用流程
(1)服务容器负责启动,加载,运行服务提供者。
(2)服务提供者在启动时,向注册中心注册自己提供的服务。
(3)服务消费者在启动时,向注册中心订阅自己所需的服务。
(4)注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
(5)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
(6)服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
三、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 提供了 triple (dubbo3)、dubbo2 协议, 第三方协议进行了集成,包括 grpc、thrift、jsonrpc、hessian2、rest 等。其中 rpc 协议包含:服务提供者的 ip 地址、协议指定开放端口、运行服务、协议报文编码、序列化方式
六、负载均衡和集群容错
1、负载均衡
dubbo 提供的是客户端负载均衡,即由 consumer 通过负载均衡算法得出需要将请求提交到哪个 provider 实例。在集群负载均衡时,dubbo 提供了多种均衡策略,缺省为 random 随机调用。
|
算法
|
特性
|
备注
|
|
randomloadbalance
|
加权随机
|
默认算法,默认权重相同
|
|
roundrobinloadbalance
|
加权轮询
|
借鉴于 nginx 的平滑加权轮询算法,默认权重相同
|
|
leastactiveloadbalance
|
{banned}最佳少活跃优先 加权随机
|
背后是能者多劳的思想
|
|
shortestresponseloadbalance
|
{banned}最佳短响应优先 加权随机
|
更加关注响应速度
|
|
consistenthashloadbalance
|
一致性 hash
|
确定的入参,确定的提供者,适用于有状态请求
|
2、集群容错
在集群调用失败时,dubbo 提供了多种容错方案,缺省为 failover 重试
|
容错机制
|
特性
|
|
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 架构设计与源码解析” 系列的文章。
阅读(430) | 评论(0) | 转发(0) |