Dubbo架构整体设计

2023-11-16

一、Dubbo调用关系说明

在这里插入图片描述

1.1 组成部分

在这里主要由四部分组成:
● Provider: 暴露服务的服务提供方
Protocol:负责提供者和消费者之间的协议交互数据
Service:真实的业务服务信息,可以理解成接口和实现
Container:Dubbo的运行环境
● Consumer:调用远程服务的服务消费方
Protocol:负责提供者和消费者之间的协议交互数据
Cluster:感知提供者端的列表信息
Proxy:可以理解成提供者的服务调用代理,由它接管Consumer中的接口调用逻辑
● Register:注册中心,用于作为服务发现和路由配置等工作,提供者和消费者都会在这里进行注册
● Monitor:用于提供者和消费者中的数据统计,比如调用频次、成功失败次数等信息

1.2 启动和执行流程说明

● 提供者端启动,容器负责把Service信息加载,并通过Protocol注册到注册中心;
● 消费者端启动,通过监听提供者列表来感知提供者信息,并在提供者发生改变时,通过 注册中心及时通知消费端
● 消费方通过Proxy模块发起请求;
● 消费者端利用Cluster模块选择真实的要调用的提供者;
● 消费者利用Consumer中的Protocol将信息发送给提供者;
● 提供者通过Protocol模块来处理消费者信息;
● 最后由提供者的Service来进行处理

二、整体调用链路

在这里插入图片描述
说明:淡绿色代表服务生产者的范围,淡蓝色代表服务消费者的范围,红色箭头代表调用的方向:业务逻辑层 -> RPC层(远程过程调用)-> Remoting(远程数据传输)
整体调用流程如下:
● 消费者通过Interface进行方法调用,统一交由消费者端的Proxy,通过ProxyFactory来进行代理对象的创建,这里使用jdk的javassist技术
● 交给Filter模块做统一的过滤请求
● 接下来就是最主要的Invoker调用逻辑了
○ 通过Directory去配置中读取信息,最终通过list方法获取所有的Invoker
○ 通过Cluster模块,根据选择的具体路由规则来选取Invoker列表
○ 通过LoadBalance模块,根据负载均衡策略选择一个具体的Invoker来处理请求
○ 如果执行中出现错误,并且Consumer阶段配置了重试机制,则会重新尝试执行
● 继续经过Filter进行执行功能的前后封装,Invoker选择具体的执行协议
● 客户端进行编码和序列化,然后发送数据
● 达到Provider中的Server层进行反编码和发序列化接收到的数据
● 使用Exporter选择执行器
● 交由Filter进行一个提供者端的过滤,到达Invoker执行器
● 通过Invoker调用接口的具体实现,然后返回结果

三、Dubbo整体设计

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

Dubbo源码整体设计与调用链路十分相似。只不过这里可以看到接口的一些具体实现以及左侧也有更为详细的层次划分,我们在后面的源码解析时也会着重介绍其中比较重要的模块实现。

接下来分层进行介绍
1、Business业务逻辑层
● Service业务层:包括业务代码比如接口和实现类
2、RPC层:远程过程调用层
● config配置层,对外提供配置,以ServiceConfig、ReferenceConfig为核心,可以直接初始化配置类,也可解析配置文件
● Proxy服务代理层,无论是生产者还是消费者,框架都会产生一个代理类,整个过程对上层透明,业务层对远程调用无感
● Register注册中心层,封装服务地址的注册与发现,以服务的URL位中心
● Cluster路由层(集群容错层),提供了多个提供者的路由和负载均衡,并且它桥接注册中心以Invoker为中心
● Monitor监控层,RPC调用相关的信息,如调用次数、失败情况、调用时间等统计信息都会在这一层完成统计
● Protocol远程调用层,封装RPC调用,无论是服务的暴露还是服务的引用,都是在Protocol中作为主功能入口负责Invoker的整个生命周期,Dubbo中的所有模型都向Invoker靠拢
3、Rmoting层:远程数据传输层
● Exchange信息交换层,封装请求和响应的模式,把请求由同步转为异步
● Transport网络传输层,统一网络传输的接口,比如Netty和mina统一为一个网络传输接口
● Serialize数据序列化层,负责管理整个框架中的数据传输的序列化和反序列化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dubbo架构整体设计 的相关文章

随机推荐

  • (九)kaldi thchs30 三音子模型(line 71-76)

    概览 首先放代码 triphone steps train deltas sh boost silence 1 25 cmd train cmd 2000 10000 data mfcc train data lang exp mono a
  • netty http文件服务器,Netty充当Http服务器简单示例

    Netty的应用场景 RPC 通信框架 长连接服务器 Http服务器 充当Http服务器实例 用户向服务器发送请求 服务器返回给用户Hello World 先介绍几个基础的概念 Channel 通道 相当于一个连接 ChannelHandl
  • Linux TC(Traffic Control) 简介(一)

    众所周知 在互联网诞生之初都是各个高校和科研机构相互通讯 并没有网络流量控制方面的考虑和设计 IP协议的原则是尽可能好地为所有数据流服务 不同的数据流之间是平等的 然而多年的实践表明 这种原则并不是最理想的 有些数据流应该得到特别的照顾 比
  • 关于left join优化not in 导致的长时间查询无数据问题 Using where; Using join buffer (Block Nested Loop)

    一 背景 线上存在业务 需要每天定时整理某个表A未处理的数据 并写入另外一张表B 每天查询出不存在B表中且未处理过的A表数据 A表中的数据主键放入B表中 未设定B表对应索引 数据量初始值大概在几千条 根据网上书籍介绍及多数网友介绍 left
  • 使用LSTM训练分类模型(kreas+tensorflow)

    github链接 https github com fangxiaozhu Classification model 需求描述 基于构建简单的多分类模型需求 使用的是keras深度学习库实现的 实现代码简单可用 模型优点是训练速度快 准确率
  • Latex 报错! Undefined control sequence.

    1 没有添加相应的宏包 2 编译命令不正确 比如应该使用XeLaTex命令却使用了XeTex 3 如果不是上述原因 可以删除 aux文件重新编译 只要代码没问题 命令没问题 突然报错 都可以试试这个方法 亲测有效 XeTeX程序中的命令 用
  • RT-Thread记录(五、RT-Thread 临界区保护与FreeRTOS的比较)

    本文聊聊临界区 以及RT Thread对临界区的处理 通过源码分析一下 RT Thread 对临界区保护的实现以及与 FreeRTOS 处理的不同 目录 前言 一 临界区 1 1 什么是临界区 1 2 RTOS中的临界区 二 RT Thre
  • eclipse中mybatis generator插件的安装及使用

    mybatis也能方向生成代码 能方向生成实体类 pojo mapper接口和Mapper接口映射文件 能减少我们代码的工作量 详细步骤如下 1 https github com mybatis generator releases下载or
  • IDEA的一些有点用的插件

    工欲善其事 必先利其器 想知道你和IDEA还差哪些人机合一的插件么 看文章就对了 1 Key Promoter X Key Promoter X 插件 IDEA 快捷键提示工具 在每次我们使用鼠标进行 IDEA 的某个操作 Key Prom
  • JS 中 delete 与 splice 与 循环

    JS Array 循环5万数据并删除1万数据 对比Delete与Splice 的运行效果 已经很晚了 但是 还是把中午实验的东西码上来吧 不然我就可能要忘记了 快点写完 好休息 趁这几天还有激情研究代码 多写点 充实充实自己 JS 中有 O
  • FastDFS下的storage服务启动卡住

    环境 ubuntu 16 04 STORAGE SERVER的状态通常有七种 FDFS STORAGE STATUS INIT 初始化 尚未得到同步已有数据的源服务器 FDFS STORAGE STATUS WAIT SYNC 等待同步 已
  • java基础面试题系列(21 -30)

    20200708 by 1z 请你解释Object如果不重写hashcode 的话 hashcode 是如何计算出来的 Object的hashcode方法是本地方法 是使用c语言或者c 语言实现的 通常是根据 某种策略而形成的 hashco
  • 春秋云镜 CVE-2022-0410

    春秋云镜 CVE 2022 0410 WordPress plugin The WP Visitor Statistics SQLI 靶标介绍 WordPress plugin The WP Visitor Statistics Real
  • Mysql精华总结01——架构、存储引擎和数据类型

    一 Mysql架构 和其它数据库相比 MySQL有点与众不同 它的架构可以在多种不同场景中应用并发挥良好作用 主要体现在存储引擎的架构上 插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离 这种架构可以根据业务的需求和实
  • 显卡RTX2080 + CUDA10 + win10 + tensorflow配置安装探坑记

    步骤主要参考该博客https blog csdn net mayunhe cs article details 87216299 结合自己探坑经历记录了具体过程 1 安装显卡驱动 先是在微星官网上下载对应显卡的驱动 不知道为啥给的是nvid
  • 前端学习--常用PS方法

    本文使用的软件为ps CC 2019 1 切图 1 打开一张psd文件 2 取消背景色 3 选择切片工具 4 按住 CTRL 键进行切图 切完后自行调整切图宽高 当切好第一张图后同时按住 CTRL 和 ALT 可按照的第一张切图的宽高进行第
  • Redis主从复制失败(master_link_status:down)

    Redis配置主从复制时遇到这个问题 先确认配置文件没有不对后开始苦恼 在网上查这个问题发现说的都一样 根据网上的再排查配置文件还是没有问题 又确认了不是防火墙的问题 陷入了更大的苦恼 后来看到了stackoverflow上一个评论 意识到
  • 数据库设计-简化字典表

    在进行数据库设计时 我们经常会遇到各种各样的业务需求 从而设计出各种各样的表 而想要做好一个数据库 不但需要前期对各种业务需求的深度理解 还需要在后期项目完善的过程中对数据库更新修改从而使得数据库设计的越发完美 对于那些涉及到业务的表或许不
  • 我希望在 25 岁时知道的14件事(现在我已经 38 岁了)

    我在 38 岁生日后不久写作 是反思的时候了 我不得不把我现在所知道的一点点传递出去 1 专注于变得有用 所有这些关于寻找快乐和做你热衷的事情都是一种分心 专注于建立你对世界的价值 当然 首先要尝试很多东西 然后逐渐开始专注于在更少的事情上
  • Dubbo架构整体设计

    一 Dubbo调用关系说明 1 1 组成部分 在这里主要由四部分组成 Provider 暴露服务的服务提供方 Protocol 负责提供者和消费者之间的协议交互数据 Service 真实的业务服务信息 可以理解成接口和实现 Containe