dubbo框架设计学习
1.整体设计
(1)架构图
图例说明:
- 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
- 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
- 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
- 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。
各层说明:
- 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
(2)功能成熟度(部分可用于生产环节的功能,使用时注意版本是否支持)
Feature |
Maturity |
Strength |
Problem |
Advise |
User |
分组聚合 |
Tested |
分组聚合返回值,用于菜单聚合等服务 |
特殊场景使用 |
可用于生产环境 |
|
泛化引用 |
Stable |
泛化调用,无需业务接口类进行远程调用,用于测试平台,开放网关桥接等 |
可用于生产环境 |
Alibaba |
|
泛化实现 |
Stable |
泛化实现,无需业务接口类实现任意接口,用于Mock平台 |
可用于生产环境 |
Alibaba |
|
隐式传参 |
Stable |
附加参数 |
可用于生产环境 |
||
本地存根 |
Stable |
在客户端执行部分逻辑 |
可用于生产环境 |
Alibaba |
|
本地伪装 |
Stable |
伪造返回结果,可在失败时执行,或直接执行,用于服务降级 |
需注册中心支持 |
可用于生产环境 |
Alibaba |
延迟暴露 |
Stable |
延迟暴露服务,用于等待应用加载warmup数据,或等待spring加载完成 |
可用于生产环境 |
Alibaba |
(3)策略成熟度(部分可用于生产环节的策略,使用时注意版本是否支持)
协议:
Feature |
Maturity |
Strength |
Problem |
Advise |
User |
Dubbo协议 |
Stable |
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) |
在大文件传输时,单一连接会成为瓶颈 |
可用于生产环境 |
Alibaba |
Rmi协议 |
Stable |
可与原生RMI互操作,基于TCP协议 |
偶尔会连接失败,需重建Stub |
可用于生产环境 |
Alibaba |
Hessian协议 |
Stable |
可与原生Hessian互操作,基于HTTP协议 |
需hessian.jar支持,http短连接的开销大 |
可用于生产环境 |
序列化:
Feature |
Maturity |
Strength |
Problem |
Advise |
User |
Hessian Serialization |
Stable |
性能较好,多语言支持(推荐使用) |
Hessian的各版本兼容性不好,可能和应用使用的Hessian冲突,Dubbo内嵌了hessian3.2.1的源码 |
可用于生产环境 |
Alibaba |
Java Serialization |
Stable |
Java原生支持 |
性能较差 |
可用于生产环境 |
集群容错:
Feature |
Maturity |
Strength |
Problem |
Advise |
User |
Failover Cluster |
Stable |
失败自动切换,当出现失败,重试其它服务器,通常用于读操作(推荐使用) |
重试会带来更长延迟 |
可用于生产环境 |
Alibaba |
Failfast Cluster |
Stable |
快速失败,只发起一次调用,失败立即报错,通常用于非幂等性的写操作 |
如果有机器正在重启,可能会出现调用失败 |
可用于生产环境 |
Alibaba |
Failsafe Cluster |
Stable |
失败安全,出现异常时,直接忽略,通常用于写入审计日志等操作 |
调用信息丢失 |
可用于生产环境 |
Monitor |
Failback Cluster |
Tested |
失败自动恢复,后台记录失败请求,定时重发,通常用于消息通知操作 |
不可靠,重启丢失 |
可用于生产环境 |
Registry |
Forking Cluster |
Tested |
并行调用多个服务器,只要一个成功即返回,通常用于实时性要求较高的读操作 |
需要浪费更多服务资源 |
可用于生产环境 |
|
Broadcast Cluster |
Tested |
广播调用所有提供者,逐个调用,任意一台报错则报错,通常用于更新提供方本地状态 |
速度慢,任意一台报错则报错 |
可用于生产环境 |
负载均衡
Feature |
Maturity |
Strength |
Problem |
Advise |
User |
Random LoadBalance |
Stable |
随机,按权重设置随机概率(推荐使用) |
在一个截面上碰撞的概率高,重试时,可能出现瞬间压力不均 |
可用于生产环境 |
Alibaba |
RoundRobin LoadBalance |
Stable |
轮询,按公约后的权重设置轮询比率 |
存在慢的机器累积请求问题,极端情况可能产生雪崩 |
可用于生产环境 |
|
LeastActive LoadBalance |
Stable |
最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差,使慢的机器收到更少请求 |
不支持权重,在容量规划时,不能通过权重把压力导向一台机器压测容量 |
可用于生产环境 |
|
ConsistentHash LoadBalance |
Stable |
一致性Hash,相同参数的请求总是发到同一提供者,当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动 |
压力分摊不均 |
可用于生产环境 |
2.依赖关系
图例说明:
- 图中小方块 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表层或模块,蓝色的表示与业务有交互,绿色的表示只对 Dubbo 内部交互。
- 图中背景方块 Consumer, Provider, Registry, Monitor 代表部署逻辑拓扑节点。
- 图中蓝色虚线为初始化时调用,红色虚线为运行时异步调用,红色实线为运行时同步调用。
- 图中只包含 RPC 的层,不包含 Remoting 的层,Remoting 整体都隐含在 Protocol 中。
3.调用链
4.dubbo源码学习
源码学习,内容比较多,可以参考http://dubbo.apache.org/zh-cn/docs/user/quick-start.html 中的“源码导读”部分,代码中加了很多注释,讲解很详细,配合源码debug学习,效果更好。
参考:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
dubbo框架设计学习的更多相关文章
- 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章 STM32H7的HAL库框架设计学 ...
- 基于SOA分布式架构的dubbo框架基础学习篇
以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...
- dubbo框架初步学习
dubbo简介 Dubbo是一个分布式服务框架,以及SOA治理方案.其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等. 官网:http://dubb ...
- Dubbo框架设计
各层说明 config配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 proxy服务 ...
- 个人学习分布式专题(二)分布式服务治理之Dubbo框架
目录 Dubbo框架 1.1 Dubbo是什么 1.2 Dubbo企业级应用示例(略) 1.3 Dubbo实现原理及架构剖析 1.4 Dubbo+Spring集成 Dubbo框架 1.1 Dubbo是 ...
- dubbo初识(一)Dubbo架构设计详解
参见http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合( ...
- Dubbo架构设计详解
from:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...
- Dubbo架构设计详解(转自shiyanjun.cn)
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...
- Dubbo架构设计详解-转
Dubbo架构设计详解 2013-09-03 21:26:59 Yanjun Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...
随机推荐
- win32 htmlayout dom操作demo
之前两篇关于win32 htmlayout博文,记载了一个实现了简单的点击按钮弹出新窗口的demo,之后实践中发现,图形界面开发,最重要的还是要实现响应用户操作,改变原有界面的功能.比如说,界面上有一 ...
- redis入门笔记(3)
本篇文章介绍几个redis的应用场景. 1.取最新N个数据的操作 –比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数 ...
- Redaht7/Oracle Linux7 + ORA11g : ohasd fails to start(Doc ID 1959008.1)
APPLIES TO: Oracle Database - Standard Edition - Version 11.2.0.4 to 12.1.0.1 [Release 11.2 to 12.1] ...
- oracle data guard配置dg_broker
https://community.oracle.com/docs/DOC-1007327 本文主要包括以下内容: 1. 配置dg broker,需要完成以下几个工作: 在主备库配置静态监听注册,注 ...
- PHP trait 特性在 Laravel 中的使用个人心得
trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 la ...
- 今天想安装 windowsl ive 提示安装失败 错误码
Windows Live installation error: OnCatalogResult: 0x80072ee6 看了了这个老兄的回答,试了试,果然OK,谢谢@普洛提亚从这里下载安装包,然后安 ...
- python代码检查工具pylint 让你的python更规范
1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅 ...
- 使用Gson封装和解析JSON
案例:判断用户名是否存在 在jsp页面使用ajax $("#username").change(function(){ var username = $(this).val(); ...
- 基于jsp技术的校园二手交易网站
[项目介绍]基于jsp的校园二手商品交易网站系统使用jsp技术进行开发,项目主要实现了一整套的校园二手交易逻辑, 主要功能如下(包括但不限于,只列出主要功能): 管理员模块 |-----用户管理 ...
- 最全java多线程总结3——了解阻塞队列和线程安全集合不
看了前两篇你肯定已经理解了 java 并发编程的低层构建.然而,在实际编程中,应该经可能的远离低层结构,毕竟太底层的东西用起来是比较容易出错的,特别是并发编程,既难以调试,也难以发现问题,我们还是 ...