dubbo 自定义路由_Dubbo分层架构概述
本节我们从整体上来看看 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分层架构概述相关推荐
- dubbo 自定义路由_爱奇艺在 Dubbo 生态下的微服务架构实践
作者 | 周晓军 爱奇艺中间件团队负责人 导读:本文整理自作者于 2020 年云原生微服务大会上的分享<爱奇艺在 Dubbo 生态下的微服务架构实践>,重点介绍了爱奇艺在 Dubbo.Se ...
- dubbo 自定义路由_高性能可扩展分布式RPC框架Dubbo内核原理揭秘
一.前言 整体来说,一个公司业务系统的演进流程基本都是从单体应用到多体应用.在单体应用时,不同业务模块相互调用直接在本地 JVM 进程内就可以完成;而变为多个应用时,相互之间进行通信的方式就不能简单的 ...
- Dubbo源码解析(一)---架构概述
一 前言 之前的文章描述了如何简单的搭建dubbo服务,会用只是迈入了初级阶段.要想更好的理解原理,只能通过源码.为什么要看源码呢?因为好的源码是一些大牛级别的工程师呕心沥血的结晶,这里面渗透着好多东 ...
- ASP.NET Core 企业开发架构概述
ASP.NET Core 企业开发架构概述 企业开发框架包括垂直方向架构和水平方向架构.垂直方向架构是指一个应用程序的由下到上叠加多层的架构,同时这样的程序又叫整体式程序.水平方向架构是指将大应用分成 ...
- (转)ASP.NET Core 企业开发架构概述
目录 一. 垂直方向架构 1. 多层架构 2. 典型框架 二. 水平方向架构 1. SOA架构 2. 微服务架构 3. 整体式 vs SOA架构 vs 微服务架构 4. SOA典型框架 5. 微服务典 ...
- Axon Framework架构概述
CQRS本身是一个非常简单的模式.它只规定了处理命令的应用程序的组件应该与处理查询 的组件分离. 虽然这种分离本身非常简单,但它与其他模式结合时提供了许多非常强大的功 能.Axon 提供的构建块更容易 ...
- AxonFramework架构概述
2019独角兽企业重金招聘Python工程师标准>>> CQRS本身是一个非常简单的模式.它只规定了处理命令的应用程序的组件应该与处理查询 的组件分离. 虽然这种分离本身非常简单,但 ...
- 经典游戏服务器端架构概述
12 经典游戏服务器端架构概述 架构的分析模型 一. 讨论的背景 现代电子游戏,基本上都会使用一定的网络功能.从验证正版,到多人交互等等,都需要架设一些专用的服务器,以及编写在服务器上的程序.因此 ...
- 软件架构设计杂记: 分层架构 与 PO、VO、DTO、BO、POJO、BO/DO、DAO
软件架构设计杂记: 分层架构 与 PO.VO.DTO.BO.POJO.BO/DO.DAO 原创: 陈光剑 Kotlin 开发者社区 前天 某位计算机大师说过: 计算机科学领域任何问题,都可以间接的通过 ...
最新文章
- RDKit | 基于RDKit的SMILES转canonical SMILES
- 检索数据_15_将空值转成其它值
- 解决C# 7.2中的结构体性能问题
- Java:将条件移至消息文件
- android jni fork()子进程不运行_Android高级面试谈谈Zygote的理解
- 记一次DNS运维排错
- java itext read a pdf file_java - 使用iText7读取PDF时遇到的问题(使用iText5) - 堆栈内存溢出...
- 俄罗斯的程序员工资高吗?
- window10 安装Java11 并可以和Java8进行自由切换
- POP3协议与SMTP协议分析(winmail、Wireshark、ubuntu(QT)、foxmail)
- 计算机组策略怎么显示音量图标,win7系统电源、网络、音量图标不见的解决方法...
- fabs在python中是什么意思_Python fabs() 与 abs() 区别是什么?
- 苹果手机升级13无法开机_苹果11更新ios13.7卡在开机页面
- mysql数据库安全加固_数据库安全加固系统
- canvas圆形进度条
- ac9260网卡linux,#Linux# 在OpenSUSE下安装9260AC驱动
- Revit MEP 平面视图中(立管)怎么设置二维表达?
- 在excel中用VBA生成PPT图表
- 关于shell脚本的一些理解和基础
- obs windows 编译 obs browser
热门文章
- 「递归算法」看这一篇就够了|多图
- 我写了10年博客,却被人说“不火”?我是这样怼回去的?
- asp.net 取windows的所有进程
- 一起玩Docker之1——Ubuntu配置安装Docker运行环境并安装(Ubuntu、Centos)镜像
- 什么是JSON? 以及jackson的使用
- SQL Server更新某一列中多个字典码对应内容(sql示例)
- mysql 回滚失败_Mysql非事务表回滚失败的现象
- mysql系统属性_mysql 显示表字段及mysql系统信息
- 时分秒 java_JAVA 时分秒累加
- python入门小游戏之跳一跳_从零基础开始,用python手把手教你玩跳一跳小游戏,直接打出高分...