导语:
  在了解一个框架的源码的时候,第一步要了解的就是源码的结构,接下来第二步需要了解的就是源码的架构,下面这张图在Dubbo官网上所展示的Dubbo的架构设计图。接下来就来详细的分析一下这张图。

整体说明

  从左右颜色的角度分析,浅蓝色的表示Consumer也就是服务消费者,浅绿色的表示Provider也就是服务提供者,这个是左右分离的越往两边说明对于服务提供者和服务消费者的调用越强烈,而越往中间则表示都需要进行调用。
  上面已经看过了从左右颜色的角度上分析,接下来就来分析一下上下结构,从上到下分别分为了十层(从图中可以看出),最左边有每一层的标注,而在最右边的黑色实线箭头表示的各个层级之间的依赖关系。从整个上下结构来看每一个层级都可以被单独的进行扩展。
  从整体的颜色分布可以看出蓝色的表示实现类,而绿色的表示接口,这个图中所显示的就是在各个层级中关联的类或者接口。对于每个层级中的详细实现的其他类并没有展示。图中的有实线和虚线。蓝色虚线表示初始化的过程,也就是当Dubbo启动的时候是按照这个过程进行组装,红色实线表示方法的调用过程,也就是在Dubbo运行过程中实施调用的的。紫色的箭头表示类之间的继承关系,可以把子类看作和父类是同一个节点。每条线上的文字表示调用的方法。

上下层分析

  从上到下可以分为十层,下面就来分析一下各个层级的作用。

Service层
  表示服务层,也就是说是表示服务的提供者以及服务消费者,在微服务架构中无论是服务提供者还是服务消费者在整个的服务治理体系中都是被看作是一个服务存在。这里通过实现接口或者继承接口的方式进行服务的调用配置,也就是在服务调用的过程中所有继承了某个接口的的服务类就可以向外提供服务。
Config配置层
  对外配置的接口,这个功能是以ServiceConfig、ReferenceConfig类为中心,可以提供直接的初始化的配置,也可以通过Spring框架来解析对应的配置文件生成配置类。
Proxy服务代理层
  服务接口代理,主要使用了代理模式,在实现远程服务调用的时候不至于直接操作原始对象,生成服务器端的客户端Stub和服务气短的Skeleton,这个代理层以ServiceProxy为中心,通过ProxyFactory进行扩展。
Registry注册中心
  封装服务地址以及服务的注册和发现。以服务为中心,拓展接口是RegistryFactory,Registry,RegistryService。当然还提供了RegistryDirectory,RegistryProtocol等实现类。
Cluster路由层
  封装多个服务提供者的路由以及负载均衡信息,并且桥接了注册中心,以Invoker为中心,扩展接口为Cluster、Directory、Router、LoadBalance
Monitor监控
  RPC 调用次数和调用时间监控,以Statistics为中心,扩展接口为MonitorFactory、Monitor、MonitorService
Protocol远程调用层
  封装了RPC调用,以Invocation,Result 为中心,扩展的接口为Protocol,Invoker,Exporter等
exchange信息交换层
  封装请求响应模式,同步与异步之间的转换,以Request、Response为中心,提供了Exchange、ExchangeChannel、ExchangeClient、ExchangeServer等接口以及实现类。
Transport网络传输层
  对于mina和Netty接口的统一抽象,以Message为中心,扩展接口为Channel,Transporter,Client,Server,Codec。
Serialize数据序列化层
  提供了一些数据序列化可复用的工具,扩展接口为Serialization,ObjectInput,ObjectOutput,ThreadPool。

各个层级关系说明

  • 在RPC中,Protocol是核心层,也就是只有Protocol+Invoker+Exporter就可以完成非透明的RPC调用,然后在Invoker的主过程上Filter拦截点。
  • 在上图中展示的Consumer 和 Provider都是抽象的概念,在Dubbo中大多数场景下都是使用这些名词
  • Cluster是一个外围的概念,Cluster的目的是为了将多个Invoker封装成一个Invoker,这样的话使用者只需要关注Protocol层面的Invoker,上面提到各个层是可以独立开发的也就是说去掉Cluster或者增加Cluster对于其他层都是不会受到影响。
  • Proxy层所封装的都是接口的透明化的代理,而其他层都是以Invoker为中心,只有在暴露给用户的时候才用Proxy将Invoker转换为接口,或者将接口转换为Invoker,也就是说去掉了Proxy层RPC是可以进行调用的,只不过就不会是透明调用,而更像是内部调用。
  • Remoting实现了Dubbo协议,如果选择的是其他的协议,整个的Remoting都不会用到,Remoting内部划分为Transport层和Exchange信息交换层Transport层负责单向消息传递,是对Mina、Netty、Grizzly等的抽象。也可以扩展UDP传输,而Exchange层是在传输层上的分装了Request-Response。
  • Registry和Monitor都是可以独立存在的。所以使用层级展示在图中。

从上图可以看到Dubbo实现的RPC就是由Config、Proxy、Registry、Cluster、Monitor、Protocol等实现,其中最为主要的就是Config、Proxy、Protocol三个,分别表示配置、代理、以及协议。

依赖关系说明

  了解过之前的Dubbo框架的人应该知道这个图在相对于之前的调用关系图有了一定的改动。说是改动其实就是将这个架构图画的好看了一些。

 图中分别展示了Protocol、Cluster、Proxy、Service、Container、Registry、Monitor等模块以及各个模块之前的调用关系,蓝色虚线表示初始化调用、红色虚线表示异步调用、红色实线表示同步调用。整个关系图中并没有看到Remoting,因为这被统一当做了Protocol进行处理。整个关系图按照1~5的顺序标注了调用的步骤,分别展示了蓝色的Consumer和绿色的Provider。

  接下来就按照1~5的流程简单的描述一下各自的操作过程,首先当容器启动的时候Dubbo会向注册中心注册Provider的信息,Consumer向注册中心订阅信息。注册中心会以异步的方式向Consumer发送对应的Provider

调用链流程


  如图所示浅蓝色的为Consumer也就是服务消费者,而浅绿色的为Provider服务提供者,紫色的实线表示继承关系,蓝色虚线表示初始化操作,红色的实线表示调用关系。中间位置表示整个调用流程中公共调用的地方,也就是编解码操作。

服务提供方暴露服务

服务消费方调用服务

总结

  从Dubbo的官方文档中整理出来自己理解的部分,从整个流程中来看Dubbo是一个比较简单的RPC框架,但是想要将Dubbo用好或者说想要更好的理解微服务利用Dubbo开发出适合自己的微服务调用框架整合Zookeeper以及Dubbo搭建出高可用的微服务集群还是需要更多的技术支持,从最简单的反射到设计模式,从简单的类的调用到整体的架构设计。

Dubbo源码分析系列之-整体架构设计相关推荐

  1. dubbo源码分析系列(1)扩展机制的实现

    1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 SPI扩展 ...

  2. apache dubbo 源码分析系列汇总

    Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.后面捐献给了知名的开源社区 ...

  3. dubbo源码分析系列——dubbo-cluster模块源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 模块功能介绍 该模块的使用介绍请参考dubbo官方用户手册如下章节内容. 集群容错 负载均衡 路由规则 配置规则 注册中心参考 ...

  4. Dubbo源码分析系列-深入RPC协议扩展

    导语   在之前的博客里面提到了关于扩展机制以及SPI的原理,这篇博客主要来讨论一下关于协议的扩展问题,在系统与系统之间通信就需要两个系统之间遵循相同的协议.而现在被熟知的常用的协议有TCP/IP协议 ...

  5. Dubbo源码分析系列-深入Dubbo SPI机制

    导语   在之前的博客中介绍过关于Java中SPI的机制,也简单的分析了关于Java中SPI怎么去使用.SPI的全称Service Provider Interface,是一种服务发现机制.SPI的本 ...

  6. dubbo源码解析-集群容错架构设计

    前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心态,在交流过程中也发表了个人的一些粗劣的 ...

  7. Dubbo源码分析系列-Dubbo的动态编译原理

    导语   Java程序时运行在JVM中的Class文件,在一般的情况下都是把左右的Java文件编写完成之后,统一进行编译操作,做完编译操作之后,统一由JVM进行加载.而所谓的动态编译则是在JVM进程运 ...

  8. Dubbo源码分析系列之-深入Dubbo扩展机制

    导语:   在之前的博客中分析过Java的SPI机制,其实Dubbo的扩展点加载机制也是从JDK表中的SPI(Service Provider Interface)机制中开发而来,只不过在原生的基础上 ...

  9. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

最新文章

  1. QGC注释消息提示框
  2. python程序设计语言是什么类型的语言-Python 是弱类型的语言 强类型和弱类型的语言区别...
  3. Android系统Surface机制的SurfaceFlinger服务的启动过程分析
  4. LIS(最大上升子序列)
  5. 新建notebook时发现在notebook里的sys.path与电脑上不一样
  6. python就是玩具_极客老爹的玩具DIY之路:Python + Kids + Building Stuff == Fun
  7. Nginx关于浏览器缓存相关的配置指令
  8. 一些我工作中经常使用的C4C ABSL代码片段
  9. [渝粤教育] 中国地质大学 结构力学 复习题
  10. linux将所有文件生成lst_10行Python代码自动清理电脑内重复文件,解放双手!
  11. ajax post 变options,关于ajax:JQuery POST请求转换为OPTIONS。 为什么?
  12. php js 交互(js调用PHP代码执行)
  13. 计算机把时间和日历添加到桌面上,怎样在电脑原有的桌面上再添加上日历啊?....
  14. ISIS协议原理-工作原理-配置-路由计算-与OSPF差异
  15. Android MTK 预制应用遇到的问题
  16. 3D游戏编程与设计-井字棋
  17. 使用redis list类型解决卡券类奖品发放问题
  18. 【笔记】MS5837-30BA压力传感器调试笔记
  19. nessus漏洞报告英文翻译中文脚本
  20. 1139 First Contact (30分)[DFS]

热门文章

  1. 启动修复可以尝试将您的计算机还原到,如何修复Windows Bootloader问题(如果您的计算机不启动) | MOS86...
  2. Shiro源码分析之Subject和SecurityManager
  3. window mysql5.5错误
  4. 专家:未来三年为转云时间窗口
  5. 从远程服务器获取数据
  6. android 开源项目列表【持续整理中。。。】
  7. P1119 灾后重建(floyd进阶)
  8. RPMB原理介绍【转】
  9. 常用品牌交换机镜像抓包配置
  10. Android进入商店并跳转到指定应用