Dubbo的分层架构

本文将简单介绍Dubbo的分层架构设计,如下图是Dubbo官方的整体架构图:

Dubbo官方提供的该架构图很复杂,一开始我们没必要深入细节,下面我们简单介绍下其中的主要模块。

  • 其中Service和Config层为API,对于服务提供方来说,使用ServiceConfig API来代表一个要发布的服务配置对象,对于服务消费方来说,ReferenceConfig代表了一个要消费的服务的配置对象。可以直接初始化配置类,也可以通过Spring解析配置自动生成配置类。
  • 其他各层均为SPI层,SPI意味着下面各层都是组件化可以被替换的,这也是Dubbo设计的比较好的一点。Dubbo增强了JDK中提供的标准SPI功能,在Dubbo中除了Service和Config层外,其他各层都是通过实现扩展点接口来提供服务的,Dubbo增强的SPI增加了对扩展点IoC和AOP的支持,一个扩展点可以直接setter注入其他扩展点,并且不会一次性实例化扩展点的所有实现类,这避免了当扩展点实现类初始化很耗时,但当时还没有用上它的功能时仍进行加载,浪费资源的情况;增强的SPI是在具体用某一个实现类的时候才对具体实现类进行实例化。后续会具体介绍Dubbo增强的SPI的实现原理。
  • proxy服务代理层:扩展接口为ProxyFactory,Dubbo提供的实现主要有JavassistProxyFactory(默认使用)和JdkProxyFactory,用来对服务提供方和服务消费方的服务进行代理。
  • registry注册中心层:封装服务地址的注册与发现,扩展接口Registry对应的扩展接口实现为ZookeeperRegistry/RedisRegistry/MulticastRegistry/DubboRegistry等。扩展接口RegistryFactory对应的扩展接口实现为DubboRegistryFactory/DubboRegistryFactory/RedisRegistryFactory/ZookeeperRegistryFactory。
  • cluster路由层:封装多个提供者的路由及负载引擎,并桥接注册中心,集群容错扩展接口Cluster对应的实现类有FailoverCluster(失败重试)/FailbackCluster(失败自动恢复)/FailfastCluster(快速失败)/FailsafeCluster(失败安全)/ForkingCluster(并行调用)等,均衡扩展接口LoadBalance对应的实现类为RandomLoadBalance(随机)/RoundRobinLoadBalance(轮询)/LeastActiveLoadBalance(最小活跃数)/ConsistentHashLoadBalance(一致性hash)等。
  • monitor监控层:RPC调用次数和调用时间监控,扩展接口为MonitorFactory,对应的实现类为DubboMonitorFactory。
  • protocol远程调用层:封装RPC调用,扩展接口为Protocol,对应实现有RegistryProtocol/DubboProtocol/InjvmProtocol等。
  • exchange信息交换层:封装请求响应模式,同步转异步,扩展接口Exchanger,对应扩展实现有HeaderExchanger等。
  • transport网络传输层:抽象mina和netty为统一接口,扩展接口为Channel,对应实现有NettyChannel/MinaChannel等。
  • serialize数据序列化层:可复用的一些工具,扩展接口为Serialization,对应扩展实现有DubboSerialization/FastJsonSerialization/Hessian2Serialization/JavaSerialization等,扩展接口ThreadPool对应扩展实现有FixedThreadPool/CachedThreadPool/LimitedThreadPool等。

上面说了那么多关于扩展点的东西,那么具体什么是扩展点呢,下面看下Dubbo扩展点一个简单例子。以扩展点Protocol为例,如果我们想自己写一个Protocol扩展接口的实现类,那么我们想自己写一个Protocol扩展接口的实现类,那么我们需要在实现类所在的Jar包内的 METAINF/dubbo/ 目录下创建一个名字为 com.alibaba.dubbo.rpc.Protocol 的文本文件,然后配置它的内容为:

myprotocol=com.alibaba.user.MyProtocol

假设该实现类MyProtocol的内容如下:

package com.alibaba.user;
import com.alibaba.dubbo.rpc.Protocol;
public class MyProtocol implements Protocol{
// ...
}

到此,可知我们需要实现Protocol接口。

那么如何使用我们自定义的扩展实现呢?Dubbo配置模块中,扩展点均有对应配置属性或标签,如下代码通过配置指定使用哪个扩展实现:

<dubbo:protocol name="myprotocol" />

注意这里的name必须与jar包内 METAINF/dubbo/ 目录下 com.alibaba.dubbo.rpc.Protocol 文件中的名字一致。

远程调用细节概述

服务提供方暴露一个服务的详细过程

  • 首先ServiceConfig类拿到对外提供服务的实际类ref(如:UserServiceImpl),然后通过ProxyFactory类的getInvoker方法使用ref生成一个AbstractProxyInvoker实例,到这一步就完成了具体服务到Invoker的转化。接下来就是Invoker转换为Exporter的过程。Dubbo处理服务暴露的关键就在Invoker转换到Exporter的过程,上图中的红色部分。
  • Dubbo协议的Invoker转为Exporter发生在DubboProtocol类的export方法中,它主要是创建一个Netty Server侦听服务,并接收客户端发来的各种请求,通讯细节由Dubbo自己实现,然后注册服务到服务注册中心。

服务消费者消费一个服务的详细过程

  • 首先ReferenceConfig类的init方法调用Protocol的refer方法生成Invoker实例(如上图的红色部分),这是服务消费的关键。接下来把Invoker转换为客户端需要的接口(如:UserServiceBo)。
  • Dubbo协议的Invoker转换为客户端需要的接口,发生在DubboProtocol的refer方法中,它主要创建一个 netty client链接服务提供者,通讯细节由Dubbo自己实现。

Dubbo学习笔记5:Dubbo整体框架分析的更多相关文章

  1. Dubbo学习笔记0:RPC框架Dubbo介绍

    整体来说,一个公司业务系统的演进流程基本都是从单体应用到多应用.在单体应用时,不同业务模块相互调用直接在本地JVM进程内就可以完成,而变为多个应用时,相互之间进行通信就不能简单的进行本地调用了,因为不 ...

  2. Dubbo学习笔记(二) Dubbo的基本配置

    Check启动检查 根据之前的学习,我们简单理解的Dubbo远程调用的基本流程,服务提供者注册到注册中心,然后服务消费者通过监听注册中心达到远程调用的目的,那么如果注册中心中没有消费者对应的接口会怎么 ...

  3. dubbo学习笔记(二)dubbo中的filter

    转:https://www.cnblogs.com/cdfive2018/p/10219730.html dubbo框架提供了filter机制的扩展点(本文基于dubbo2.6.0版本). 扩展接口 ...

  4. Dubbo学习笔记9:Dubbo服务提供方启动流程源码分析

    首先我们通过一个时序图,直观看下Dubbo服务提供方启动的流程: 在<Dubbo整体框架分析>一文中我们提到,服务提供方需要使用ServiceConfig API发布服务,具体是调用代码( ...

  5. memcached学习笔记——存储命令源码分析下篇

    上一篇回顾:<memcached学习笔记——存储命令源码分析上篇>通过分析memcached的存储命令源码的过程,了解了memcached如何解析文本命令和mencached的内存管理机制 ...

  6. memcached学习笔记——存储命令源码分析上篇

    原创文章,转载请标明,谢谢. 上一篇分析过memcached的连接模型,了解memcached是如何高效处理客户端连接,这一篇分析memcached源码中的process_update_command ...

  7. input子系统学习笔记六 按键驱动实例分析下【转】

    转自:http://blog.chinaunix.net/uid-20776117-id-3212095.html 本文接着input子系统学习笔记五 按键驱动实例分析上接续分析这个按键驱动实例! i ...

  8. ArcGIS案例学习笔记2_1_学校选址适宜性分析

    ArcGIS案例学习笔记2_1_学校选址适宜性分析 计划时间:第二天上午 目的:学校选址,适宜性分析 内容:栅格数据分析 教程:pdf page=323 数据:chapter8/ex1/教育,生活,土 ...

  9. 并发编程学习笔记(12)----Fork/Join框架

    1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...

  10. Dubbo学习笔记10:Dubbo服务消费方启动流程源码分析

    同理我们看下服务消费端启动流程时序图: 在<Dubbo整体架构分析>一文中,我们提到服务消费方需要使用ReferenceConfig API来消费服务,具体是调用代码(1)get()方法来 ...

随机推荐

  1. 【转载】SSD断电保护原理

    异常掉电的隐患 若没有合理的掉电保护机制,而异常掉电的发生又不可避免,当发生异常掉电,会引发很多问题. (1)丢盘 异常掉电,会使得映射表来不及保存,丢失逻辑地址到物理地址的映射,待重新上电后,SSD ...

  2. 如何设计一个异步Web服务——任务调度

    接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...

  3. 【DDD】领域驱动设计实践 —— 业务建模战术

    本文结合团队在COMMUNITY(社区服务系统)业务建模过程中的实践经验,总结得到一些DDD业务建模的小招数,不一定是完美的,但是对我们团队来说很有效用,希望能帮到其他人.后面会陆续将项目中业务建模的 ...

  4. Asp.Net_Session跟Cookie的记住登陆名

    最近在做ASP.NET的项目时,接触到了登陆权限模块,所有总结了一下登陆时用到的知识和方法技巧. 如图说明:实现的效果如图,由于验证码验证比较简单这里就不介绍了 首先用代码生成器生成项目,以三层为例进 ...

  5. SCRUM 12.09 软件工程第二周计划

    第二轮迭代的第二周开始了,上一周我们进行了对代码优化的探索与自我审查. 本周,我们有以下两点目标要实现: 1.对客户端进行优化. 2.网络爬虫爬取美团外卖. 客户端优化主要开发人员:高雅智.牛强.彭林 ...

  6. 剑指offer:二叉树的深度

    题目描述: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 解题思路: 这道题也是递归的思路,比较简单. 做的过程中遇到的一个 ...

  7. 关于java中指针的概念

    今天寡人遇到一个问题,扫描非关系数据库中的图(由node和rel组成),将其转化成由寡人自定义的gnode和gedge组成的图. gnode类包含结点的id,label和包含此gnode的gedge的 ...

  8. 12th final 发布评价 I

    1.  约跑App——nice!:这次使用了摄像进行讲解,相比于上次能够更准确地向大家讲解,整体效果更好了,而且很好地针对同学提出的bug进行修改,能够在并不是很熟悉的领域做到这个程度已经很不容易了, ...

  9. opencv图像识别技术在自动化测试中的应用

    在自动化测试中,基于xpath.js选择器.css选择器进行元素定位及判定的技术已经比较成熟.在实际应用中,无论是web端还是移动端,仍有很多时候需要根据页面内容.页面中的图像进行定位及判定,这里介绍 ...

  10. [转帖]2019 简易Web开发指南

    2019 简易Web开发指南     2019年即将到来,各位同学2018年辛苦了. 不管大家2018年过的怎么样,2019年还是要继续加油的! 在此我整理了个人认为在2019仍是或者将成为主流的技术 ...