浅析Dubbo 原理:架构、通信与调用流程
一、Dubbo 简介
Dubbo 是阿里巴巴开源的高性能、轻量级的 Java RPC(Remote Procedure Call,远程过程调用)框架,旨在实现不同服务之间的远程通信和调用。在分布式系统中,不同服务可能部署在不同的服务器上,Dubbo 能够让这些服务像本地调用一样方便,极大地提升了系统的可扩展性和可维护性。
二、Dubbo 架构核心组件
2.1 服务提供者(Provider)
服务提供者是指暴露服务的一方,它将自己的服务接口和实现注册到注册中心,等待消费者调用。服务提供者通常是业务逻辑的具体实现者,负责处理消费者的请求并返回结果。
2.2 服务消费者(Consumer)
服务消费者是指调用服务的一方,它从注册中心获取服务提供者的地址信息,然后根据这些信息发起远程调用。服务消费者通常是业务流程的发起者,通过调用服务提供者的接口来完成特定的业务功能。
2.3 注册中心(Registry)
注册中心是 Dubbo 架构中的核心组件之一,它负责服务的注册和发现。服务提供者将自己的服务信息注册到注册中心,服务消费者从注册中心订阅所需的服务信息。注册中心可以使用 ZooKeeper、Nacos、Etcd 等,其作用是维护服务提供者和消费者之间的映射关系,确保消费者能够找到合适的服务提供者。
2.4 监控中心(Monitor)
监控中心负责收集和统计服务的调用信息,如调用次数、调用时间、成功率等。通过监控中心,开发人员可以实时了解服务的运行状态,及时发现和解决性能问题。
2.5 容器(Container)
容器是服务运行的环境,它负责启动、加载和管理服务提供者。Dubbo 提供了多种容器实现,如 Spring Container、Jetty Container 等,开发人员可以根据实际需求选择合适的容器。
三、Dubbo 通信机制
3.1 远程调用协议
Dubbo 支持多种远程调用协议,如 Dubbo 协议、HTTP 协议、RESTful 协议等。其中,Dubbo 协议是 Dubbo 框架默认的协议,它基于 TCP 协议,采用 NIO 异步通信方式,具有高性能、低延迟的特点。
3.2 序列化与反序列化
在远程调用过程中,需要将对象转换为字节流进行传输,这个过程称为序列化;在接收端,需要将字节流转换为对象,这个过程称为反序列化。Dubbo 支持多种序列化方式,如 Java 序列化、Hessian 序列化、JSON 序列化等,开发人员可以根据实际需求选择合适的序列化方式。
3.3 网络传输
Dubbo 使用 Netty 作为底层网络传输框架,Netty 是一个高性能的 NIO 网络编程框架,它提供了异步、事件驱动的网络编程模型,能够高效地处理大量的并发连接。
四、Dubbo 服务调用流程
4.1 服务注册
服务提供者启动时,会将自己的服务信息(包括服务接口、实现类、地址等)注册到注册中心。注册中心会将这些信息存储在内存中,并提供给服务消费者查询。
4.2 服务订阅
服务消费者启动时,会从注册中心订阅所需的服务信息。注册中心会将服务提供者的地址信息推送给服务消费者,服务消费者会将这些信息缓存到本地。
4.3 远程调用
服务消费者在需要调用服务时,会根据本地缓存的服务提供者地址信息,选择一个合适的服务提供者进行调用。调用过程中,服务消费者会将请求信息进行序列化,然后通过网络传输到服务提供者。服务提供者接收到请求后,会将请求信息进行反序列化,然后调用相应的服务方法,并将结果进行序列化后返回给服务消费者。
4.4 结果返回
服务消费者接收到服务提供者返回的结果后,会将结果进行反序列化,然后将结果返回给调用者。
五、Dubbo 负载均衡策略
5.1 Random LoadBalance
随机负载均衡策略是 Dubbo 默认的负载均衡策略,它根据服务提供者的权重随机选择一个服务提供者进行调用。
5.2 RoundRobin LoadBalance
轮询负载均衡策略按照服务提供者的顺序依次选择服务提供者进行调用,每个服务提供者被调用的机会均等。
5.3 LeastActive LoadBalance
最少活跃调用数负载均衡策略会选择当前活跃调用数最少的服务提供者进行调用,这样可以保证性能较好的服务提供者能够处理更多的请求。
5.4 ConsistentHash LoadBalance
一致性哈希负载均衡策略根据请求的参数计算哈希值,然后根据哈希值选择服务提供者。这样可以保证相同参数的请求总是被路由到同一个服务提供者。
六、Dubbo 集群容错机制
6.1 Failover Cluster
失败自动切换集群容错机制是 Dubbo 默认的集群容错机制,当调用失败时,会自动切换到其他服务提供者进行重试,重试次数可以通过配置指定。
6.2 Failfast Cluster
快速失败集群容错机制在调用失败时,会立即抛出异常,不会进行重试。
6.3 Failsafe Cluster
失败安全集群容错机制在调用失败时,会忽略异常,返回一个默认值。
6.4 Failback Cluster
失败自动恢复集群容错机制在调用失败时,会记录失败的请求,然后在后台定时重试。
6.5 Forking Cluster
并行调用多个服务提供者,只要有一个成功就返回结果。
七、总结
Dubbo 作为一款优秀的 Java RPC 框架,通过注册中心、通信机制、负载均衡和集群容错等核心组件和机制,实现了高效、可靠的远程服务调用。它在分布式系统中发挥着重要的作用,能够帮助开发人员快速构建可扩展、高性能的分布式应用。随着微服务架构的广泛应用,Dubbo 的应用场景也越来越广泛,值得开发人员深入学习和掌握。
相关文章:
浅析Dubbo 原理:架构、通信与调用流程
一、Dubbo 简介 Dubbo 是阿里巴巴开源的高性能、轻量级的 Java RPC(Remote Procedure Call,远程过程调用)框架,旨在实现不同服务之间的远程通信和调用。在分布式系统中,不同服务可能部署在不同的服务器上,D…...
03垃圾回收篇(D3_垃圾收集器的选择及相关参数)
目录 学习前言 一、收集器的选择 二、GC日志参数 三、垃圾收集相关的常用参数 四、内存分配与回收策略 1. 对象优先在Eden分配 2. 大对象直接进入老年代 3. 长期存活的对象将进入老年代 4. 动态对象年龄判定 5. 空间分配担保 学习前言 本章主要学习垃圾收集器的选择及…...
一、引论,《组合数学(第4版)》卢开澄 卢华明
零、前言 发现自己数数题做的很烂,重新学一遍组合数学吧。 参考卢开澄 卢华明 编著的《组合数学(第4版)》,只打算学前四章。 通过几个经典问题来了解组合数学所研究的内容。 一、幻方问题 据说大禹治水之前,河里冒出来一只乌龟,…...
Vue3+TS 实现批量拖拽文件夹上传图片组件封装
1、html 代码: 代码中的表格引入了 vxe-table 插件 <Tag /> 是自己封装的说明组件 表格列表这块我使用了插槽来增加扩展性,可根据自己需求,在组件外部做调整 <template><div class"dragUpload"><el-dialo…...
二叉树的所有路径(力扣257)
因为题目要求路径是从上到下的,所以最好采用前序遍历。这样可以保证按从上到下的顺序将节点的值存入一个路径数组中。另外,此题还有一个难点就是如何求得所有路径。为了解决这个问题,我们需要用到回溯。回溯和递归不分家,每递归一…...
Python OrderedDict 实现 Least Recently used(LRU)缓存
OrderedDict 实现 Least Recently used(LRU)缓存 引言正文 引言 LRU 缓存是一种缓存替换策略,当缓存空间不足时,会移除最久未使用的数据以腾出空间存放新的数据。LRU 缓存的特点: 有限容量:缓存拥有固定的…...
LabVIEW项目中的工控机与普通电脑选择
工控机(Industrial PC)与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异,并为LabVIEW项目中的选择提供指导。 硬件设…...
Ansys Speos | Speos Meshing 网格最佳实践
概述 网格划分是在各种计算应用中处理3D几何的基本步骤: 表面和体积:网格允许通过将复杂的表面和体积分解成更简单的几何元素(如三角形、四边形、四面体或六面体)来表示复杂的表面和体积。 模拟和渲染:网格是创建离散…...
elasticsearch segment数量对读写性能的影响
index.merge.policy.segments_per_tier 是一个配置选项,用于控制 Elasticsearch 中段(segment)合并策略的行为。它定义了在每一层的段合并过程中,允许存在的最大段数量。调整这个参数可以优化索引性能和资源使用。 假设你有一个索…...
全同态加密理论、生态现状与未来展望(中2)
《全同态加密理论、生态现状与未来展望》系列由lynndell2010gmail.com和mutourend2010gmail.com整理原创发布,分为上中下三个系列: 全同态加密理论、生态现状与未来展望(上):专注于介绍全同态加密理论知识。全同态加密…...
鸿蒙UI(ArkUI-方舟UI框架)-开发布局
返回主章节 → 鸿蒙UI(ArkUI-方舟UI框架) 开发布局 1、布局概述 1)布局结构 2)布局元素组成 3)如何选择布局 声明式UI提供了以下10种常见布局,开发者可根据实际应用场景选择合适的布局进行页面开发。 …...
RPC是什么?和HTTP区别?
RPC 是什么?HTTP 是什么? 作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。 此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不…...
Linux C\C++编程-建立文件和内存映射
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…...
行政纠错——pycorrector学习
pycorrector是一个开源中文文本纠错工具,它支持对中文文本进行音似、形似和语法错误的纠正。此工具是使用Python3进行开发的,并整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型来实现文本纠错功能。pycorrector官方仓库…...
Go的defer原理
Go 的 defer 原理 defer 是 Go 语言中的一个关键字,用于延迟执行一个函数调用。它通常用于处理资源释放、连接关闭等操作,确保这些操作在函数返回之前执行。 1. 什么是 defer? defer 关键字用于延迟执行一个函数调用,直到包含它…...
Windows 下本地 Docker RAGFlow 部署指南
Windows 下本地 Docker RAGFlow 部署指南 环境要求部署步骤1. 克隆代码仓库2. 配置 Docker 镜像加速(可选)3. 修改端口配置(可选)4. 启动服务5. 验证服务状态6. 访问服务7. 登录系统8. 配置模型8.1 使用 Ollama 本地模型8.2 使用在线 API 服务9. 开始使用10. 常见问题处理端…...
专题三_穷举vs暴搜vs深搜vs回溯vs剪枝_全排列
dfs解决 全排列&子集 1.全排列 link:46. 全排列 - 力扣(LeetCode) 全局变量回溯 code class Solution { public:vector<vector<int>> ans;vector<int> cur;vector<bool> used;vector<vector<int>> permute…...
【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)
重要信息 会议时间地点:2025年6月13-15日 中国深圳 会议官网:http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台…...
华为E9000刀箱服务器监控指标解读
美信监控易内置了数千种常见设备监测器,能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统,从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块,对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…...
【LC】2544. 交替数字和
题目描述: 给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号: 最高有效位 上的数字分配到 正 号。剩余每位上数字的符号都与其相邻数字相反。 返回所有数字及其对应符号的和。 示例 1: 输入:n 521 输出&…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
