本节我们从整体上来看看 Dubbo 的分层架构设计,架构分层是一个比较经典的模式,比如网络中的7层协议,每层执行固定的功能,上层依赖下层提供的功能,下层对上层提供功能,下层的改变对上层不可见,并且每层都是一个可被替换的组件。

如下图是 Dubbo 官方提供的Dubbo的整体架构图:

图2.1.1

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

  • 其中 Service 和 Config 层为 API接口层,是为了方便的让Dubbo使用方发布服务和引用服务;对于服务提供方来说需要实现服务接口,然后使用 ServiceConfig API 来发布该服务;对于服务消费方来说需要使用ReferenceConfig 对服务接口进行代理。Dubbo服务发布与引用方可以直接初始化配置类,也可以通过 Spring 配置自动生成配置类。

  • 其它各层均为 SPI层,SPI 意味着下面各层都是组件化可以被替换的,这也是 Dubbo 设计的比较好的一点。Dubbo 增强了 JDK 中提供的标准 SPI 功能,在 Dubbo 中除了 Service 和 Config 层外,其它各层都是通过实现扩展点接口来提供服务的;Dubbo 增强的 SPI 增加了对扩展点 IoC 和 AOP 的支持,一个扩展点可以直接 setter 注入其它扩展点;并且不会一次性实例化扩展点的所有实现类,这避免了当扩展点实现类初始化很耗时,但当前还没用上它的功能时仍进行加载实例化,浪费资源的情况;增强的 SPI 是在具体用某一个实现类的时候才对具体实现类进行实例化。后续会具体讲解 Dubbo 增强的 SPI 的实现原理。

  • Proxy 服务代理层:该层主要是对服务消费端使用的接口进行代理,把本地调用透明的转换为远程调用;另外对服务提供方的服务实现类进行代理,把服务实现类转换为 Wrapper 类,这是为了减少反射的调用,后面会具体讲解到。Proxy层的SPI扩展接口为 ProxyFactory,Dubbo 提供的实现主要有 JavassistProxyFactory(默认使用)和 JdkProxyFactory,用户可以实现ProxyFactory SPI接口,自定义代理服务层的实现。

  • Registry 服务注册中心层:服务提供者启动时候会把服务注册到服务注册中心,消费者启动时候会去服务注册中心获取服务提供者的地址列表,Registry层主要功能是封装服务地址的注册与发现逻辑,扩展接口 Registry 对应的扩展实现为 ZookeeperRegistry、RedisRegistry、MulticastRegistry、DubboRegistry等。扩展接口 RegistryFactory 对应的扩展接口实现为 DubboRegistryFactory、DubboRegistryFactory、RedisRegistryFactory、ZookeeperRegistryFactory。另外该层扩展接口Directory实现类有RegistryDirectory、StaticDirectory用来透明的把invoker列表转换为一个invoker;用户可以实现该层的一系列扩展接口,自定义该层的服务实现。

  • Cluster 路由层:封装多个服务提供者的路由规则、负载均衡、集群容错的实现,并桥接服务注册中心;扩展接口 Cluster 对应的实现类有 FailoverCluster(失败重试)、FailbackCluster(失败自动恢复)、FailfastCluster(快速失败)、FailsafeCluster(失败安全)、ForkingCluster(并行调用)等;负载均衡扩展接口 LoadBalance 对应的实现类为 RandomLoadBalance(随机)、RoundRobinLoadBalance(轮询)、LeastActiveLoadBalance(最小活跃数)、ConsistentHashLoadBalance(一致性hash)等。用户可以实现该层的一系列扩展接口,自定义集群容错和负载均衡策略。

  • Monitor 监控层:用来统计RPC 调用次数和调用耗时时间,扩展接口为 MonitorFactory,对应的实现类为 DubboMonitorFactroy。用户可以实现该层的MonitorFactory扩展接口,实现自定义监控统计策略。

  • Protocol 远程调用层:封装 RPC 调用逻辑,扩展接口为 Protocol, 对应实现有 RegistryProtocol、DubboProtocol、InjvmProtocol 等。

  • Exchange 信息交换层:封装请求响应模式,同步转异步,扩展接口 Exchanger,对应扩展实现有 HeaderExchanger 等。

  • Transport 网络传输层:抽象 mina 和 netty 为统一接口。扩展接口为 Channel,对应实现有 NettyChannel(默认)、MinaChannel 等;扩展接口Transporter对应的实现类有GrizzlyTransporter、MinaTransporter、NettyTransporter(默认实现);扩展接口Codec2对应实现类有DubboCodec、ThriftCodec等

  • Serialize 数据序列化层:提供可以复用的一些工具,扩展接口为 Serialization,对应扩展实现有 DubboSerialization、FastJsonSerialization、Hessian2Serialization、JavaSerialization等,扩展接口ThreadPool对应扩展实现有 FixedThreadPool、CachedThreadPool、LimitedThreadPool 等。

综上可知Dubbo的分层架构使得Dubbo的每层的功能都是可被替换的,这使得Dubbo的扩展性极强,上面说了那么多关于扩展点的东西,那么具体什么是扩展点呢,下面看下 Dubbo 扩展点一个简单例子。以扩展点 Protocol 为例:

@SPI("dubbo")

public interface Protocol {

...

}

扩展点接口的类上面都含有@SPI注解,这里注解里面的"dubbo"说明Protocol扩展接口SPI的默认实现是DubboProtocol。

如果我们想自己写一个 Protocol 扩展接口的实现类,那么我们需要在实现类所在的 Jar 包内的 META-INF/dubbo/ 目录下创建一个名字为 org.apache.dubbo.rpc.Protocol 的文本文件,然后配置它的内容为:

myprotocol=com.alibaba.user.MyProtocol

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

package com.alibaba.user;

public class MyProtocol implemenets Protocol {

// ...

}

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

name="myprotocol" />

注意这里的 name 必须与 jar 包内 META-INF/dubbo/ 目录下 org.apache.dubbo.rpc.Protocol 文件中的等号左侧的key的名字一致。

如上内容摘自《。

dubbo 自定义路由_Dubbo分层架构概述相关推荐

  1. dubbo 自定义路由_爱奇艺在 Dubbo 生态下的微服务架构实践

    作者 | 周晓军 爱奇艺中间件团队负责人 导读:本文整理自作者于 2020 年云原生微服务大会上的分享<爱奇艺在 Dubbo 生态下的微服务架构实践>,重点介绍了爱奇艺在 Dubbo.Se ...

  2. dubbo 自定义路由_高性能可扩展分布式RPC框架Dubbo内核原理揭秘

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

  3. Dubbo源码解析(一)---架构概述

    一 前言 之前的文章描述了如何简单的搭建dubbo服务,会用只是迈入了初级阶段.要想更好的理解原理,只能通过源码.为什么要看源码呢?因为好的源码是一些大牛级别的工程师呕心沥血的结晶,这里面渗透着好多东 ...

  4. ASP.NET Core 企业开发架构概述

    ASP.NET Core 企业开发架构概述 企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成 ...

  5. (转)ASP.NET Core 企业开发架构概述

    目录 一. 垂直方向架构 1. 多层架构 2. 典型框架 二. 水平方向架构 1. SOA架构 2. 微服务架构 3. 整体式 vs SOA架构 vs 微服务架构 4. SOA典型框架 5. 微服务典 ...

  6. Axon Framework架构概述

    CQRS本身是一个非常简单的模式.它只规定了处理命令的应用程序的组件应该与处理查询 的组件分离. 虽然这种分离本身非常简单,但它与其他模式结合时提供了许多非常强大的功 能.Axon 提供的构建块更容易 ...

  7. AxonFramework架构概述

    2019独角兽企业重金招聘Python工程师标准>>> CQRS本身是一个非常简单的模式.它只规定了处理命令的应用程序的组件应该与处理查询 的组件分离. 虽然这种分离本身非常简单,但 ...

  8. 经典游戏服务器端架构概述

    12 经典游戏服务器端架构概述 架构的分析模型 一. 讨论的背景 ​ 现代电子游戏,基本上都会使用一定的网络功能.从验证正版,到多人交互等等,都需要架设一些专用的服务器,以及编写在服务器上的程序.因此 ...

  9. 软件架构设计杂记: 分层架构 与 PO、VO、DTO、BO、POJO、BO/DO、DAO

    软件架构设计杂记: 分层架构 与 PO.VO.DTO.BO.POJO.BO/DO.DAO 原创: 陈光剑 Kotlin 开发者社区 前天 某位计算机大师说过: 计算机科学领域任何问题,都可以间接的通过 ...

最新文章

  1. RDKit | 基于RDKit的SMILES转canonical SMILES
  2. 检索数据_15_将空值转成其它值
  3. 解决C# 7.2中的结构体性能问题
  4. Java:将条件移至消息文件
  5. android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解
  6. 记一次DNS运维排错
  7. java itext read a pdf file_java - 使用iText7读取PDF时遇到的问题(使用iText5) - 堆栈内存溢出...
  8. 俄罗斯的程序员工资高吗?
  9. window10 安装Java11 并可以和Java8进行自由切换
  10. POP3协议与SMTP协议分析(winmail、Wireshark、ubuntu(QT)、foxmail)
  11. 计算机组策略怎么显示音量图标,win7系统电源、网络、音量图标不见的解决方法...
  12. fabs在python中是什么意思_Python fabs() 与 abs() 区别是什么?
  13. 苹果手机升级13无法开机_苹果11更新ios13.7卡在开机页面
  14. mysql数据库安全加固_数据库安全加固系统
  15. canvas圆形进度条
  16. ac9260网卡linux,#Linux# 在OpenSUSE下安装9260AC驱动
  17. Revit MEP 平面视图中(立管)怎么设置二维表达?
  18. 在excel中用VBA生成PPT图表
  19. 关于shell脚本的一些理解和基础
  20. obs windows 编译 obs browser

热门文章

  1. 「递归算法」看这一篇就够了|多图
  2. 我写了10年博客,却被人说“不火”?我是这样怼回去的?
  3. asp.net 取windows的所有进程
  4. 一起玩Docker之1——Ubuntu配置安装Docker运行环境并安装(Ubuntu、Centos)镜像
  5. 什么是JSON? 以及jackson的使用
  6. SQL Server更新某一列中多个字典码对应内容(sql示例)
  7. mysql 回滚失败_Mysql非事务表回滚失败的现象
  8. mysql系统属性_mysql 显示表字段及mysql系统信息
  9. 时分秒 java_JAVA 时分秒累加
  10. python入门小游戏之跳一跳_从零基础开始,用python手把手教你玩跳一跳小游戏,直接打出高分...