浅析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 输出&…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...