1.整体设计

(1)架构图

图例说明:

  • 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。
  • 图中从下至上分为十层,各层均为单向依赖,右边的黑色箭头代表层之间的依赖关系,每一层都可以剥离上层被复用,其中,Service 和 Config 层为 API,其它各层均为 SPI。
  • 图中绿色小块的为扩展接口,蓝色小块为实现类,图中只显示用于关联各层的实现类。
  • 图中蓝色虚线为初始化过程,即启动时组装链,红色实线为方法调用过程,即运行时调时链,紫色三角箭头为继承,可以把子类看作父类的同一个节点,线上的文字为调用的方法。

各层说明:

  • config 配置层:对外配置接口,以 ServiceConfigReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类
  • proxy 服务代理层:服务接口透明代理,生成服务的客户端 Stub 和服务器端 Skeleton, 以 ServiceProxy为中心,扩展接口为 ProxyFactory
  • registry 注册中心层:封装服务地址的注册与发现,以服务 URL 为中心,扩展接口为 RegistryFactoryRegistryRegistryService
  • cluster 路由层:封装多个提供者的路由及负载均衡,并桥接注册中心,以 Invoker 为中心,扩展接口为 ClusterDirectoryRouterLoadBalance
  • monitor 监控层:RPC 调用次数和调用时间监控,以 Statistics 为中心,扩展接口为 MonitorFactoryMonitorMonitorService
  • protocol 远程调用层:封装 RPC 调用,以 InvocationResult 为中心,扩展接口为 ProtocolInvokerExporter
  • exchange 信息交换层:封装请求响应模式,同步转异步,以 RequestResponse 为中心,扩展接口为 ExchangerExchangeChannelExchangeClientExchangeServer
  • transport 网络传输层:抽象 mina 和 netty 为统一接口,以 Message 为中心,扩展接口为 ChannelTransporterClientServerCodec
  • serialize 数据序列化层:可复用的一些工具,扩展接口为 SerializationObjectInputObjectOutputThreadPool

(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框架设计学习的更多相关文章

  1. 【STM32H7教程】第12章 STM32H7的HAL库框架设计学习

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第12章       STM32H7的HAL库框架设计学 ...

  2. 基于SOA分布式架构的dubbo框架基础学习篇

    以需求用例为基,抽象接口,Case&Coding两条线并行,服务(M)&消费(VC)分离,单元.接口.功能.集成四层质量管理,自动化集成.测试.交付全程支持. 3个大阶段(需求分析阶段 ...

  3. dubbo框架初步学习

    dubbo简介 Dubbo是一个分布式服务框架,以及SOA治理方案.其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等. 官网:http://dubb ...

  4. Dubbo框架设计

    各层说明 config配置层:对外配置接口,以 ServiceConfig, ReferenceConfig 为中心,可以直接初始化配置类,也可以通过 spring 解析配置生成配置类 proxy服务 ...

  5. 个人学习分布式专题(二)分布式服务治理之Dubbo框架

    目录 Dubbo框架 1.1 Dubbo是什么 1.2 Dubbo企业级应用示例(略) 1.3 Dubbo实现原理及架构剖析 1.4 Dubbo+Spring集成 Dubbo框架 1.1 Dubbo是 ...

  6. dubbo初识(一)Dubbo架构设计详解

    参见http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合( ...

  7. Dubbo架构设计详解

    from:http://shiyanjun.cn/archives/325.html Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...

  8. Dubbo架构设计详解(转自shiyanjun.cn)

    Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...

  9. Dubbo架构设计详解-转

    Dubbo架构设计详解  2013-09-03 21:26:59    Yanjun Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解 ...

随机推荐

  1. win32 htmlayout dom操作demo

    之前两篇关于win32 htmlayout博文,记载了一个实现了简单的点击按钮弹出新窗口的demo,之后实践中发现,图形界面开发,最重要的还是要实现响应用户操作,改变原有界面的功能.比如说,界面上有一 ...

  2. redis入门笔记(3)

    本篇文章介绍几个redis的应用场景. 1.取最新N个数据的操作 –比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数 ...

  3. 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] ...

  4. oracle data guard配置dg_broker

    https://community.oracle.com/docs/DOC-1007327 本文主要包括以下内容: 1.  配置dg broker,需要完成以下几个工作: 在主备库配置静态监听注册,注 ...

  5. PHP trait 特性在 Laravel 中的使用个人心得

    trait 是在PHP5.4中为了方便代码复用的一种实现方式,但目前我在看的的PHP项目中较少看的有程序员去主动使用这个实现方式,在laravel中有很多 trait 的使用,关于trait 在 la ...

  6. 今天想安装 windowsl ive 提示安装失败 错误码

    Windows Live installation error: OnCatalogResult: 0x80072ee6 看了了这个老兄的回答,试了试,果然OK,谢谢@普洛提亚从这里下载安装包,然后安 ...

  7. python代码检查工具pylint 让你的python更规范

    1.pylint是什么? Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准(Pylint 默认使用的代码风格是 PEP 8,具体信息,请参阅 ...

  8. 使用Gson封装和解析JSON

    案例:判断用户名是否存在 在jsp页面使用ajax $("#username").change(function(){ var username = $(this).val(); ...

  9. 基于jsp技术的校园二手交易网站

    [项目介绍]基于jsp的校园二手商品交易网站系统使用jsp技术进行开发,项目主要实现了一整套的校园二手交易逻辑, 主要功能如下(包括但不限于,只列出主要功能): 管理员模块    |-----用户管理 ...

  10. 最全java多线程总结3——了解阻塞队列和线程安全集合不

      看了前两篇你肯定已经理解了 java 并发编程的低层构建.然而,在实际编程中,应该经可能的远离低层结构,毕竟太底层的东西用起来是比较容易出错的,特别是并发编程,既难以调试,也难以发现问题,我们还是 ...