Dubbo 核心知识全解析:原理、流程与关键机制
1.说说一次 Dubbo 服务请求流程?
Dubbo 是一个分布式服务框架,它简化了基于 SOA(面向服务架构)的应用程序的开发。一次典型的 Dubbo 服务请求流程如下:
-
服务提供者启动:
- 服务提供者启动后,会向注册中心注册自己提供的服务,包含服务名称、版本号、分组等信息。
- 注册中心可以是多种实现,比如 ZooKeeper, Nacos 等。
-
服务消费者启动:
- 服务消费者启动时,会订阅所需的服务,并从注册中心获取服务提供者的地址列表。
- 消费者与注册中心保持心跳检测,以确保其获取的服务提供者列表是最新的。
-
发起远程调用:
- 当服务消费者需要调用远程服务时,它会根据负载均衡策略选择一个服务提供者进行调用。
- 消费者将方法名、参数等信息打包成网络请求发送给选中的服务提供者。
-
序列化和反序列化:
- 在客户端和服务端之间传输的数据需要被序列化为字节流在网络上传输。
- 接收到数据的一方需要将字节流反序列化为对象以便处理。
-
服务提供者接收请求并处理:
- 服务提供者接收到消费者的请求后,解析出方法名和参数,然后在本地调用对应的方法执行业务逻辑。
- 执行完毕后,服务提供者将结果返回给服务消费者。
-
响应结果:
- 服务提供者把处理结果通过网络传输回给服务消费者。
- 服务消费者接收到结果后,继续后续的业务逻辑。
-
监控和日志:
- 整个调用过程通常会被监控系统记录下来,包括调用耗时、成功与否等信息。
- 监控数据可以帮助运维人员了解服务健康状态,及时发现和解决问题。
-
容错机制:
- 如果调用失败,Dubbo 提供了多种容错机制,如重试、熔断等,来保证系统的高可用性。
这个流程中涉及到多个组件协同工作,包括但不限于:注册中心、监控中心、配置中心等,它们共同确保了服务间的高效通信和管理。
2.说说 Dubbo 工作原理
Dubbo 的工作原理涉及多个方面,包括服务的注册与发现、远程调用机制、负载均衡、集群容错等。以下是 Dubbo 工作原理的详细说明:
1. 服务注册与发现
服务提供者:当一个服务提供者启动时,它会将自身提供的服务信息(如服务接口名称、版本号、分组等)以及自身的网络地址(IP 和端口)注册到注册中心。
服务消费者:服务消费者在启动时订阅所需的服务,并从注册中心获取服务提供者的地址列表。每当有新的服务提供者加入或有服务提供者下线时,注册中心都会通知相关的服务消费者。
2. 远程调用机制
Dubbo 使用了基于代理的远程调用模式,即在客户端生成服务接口的动态代理对象。当服务消费者调用服务接口的方法时,实际上是通过这个代理对象进行的。代理对象负责将方法调用转化为网络请求,并发送给服务提供者。服务提供者接收到请求后,执行相应的方法并将结果返回给服务消费者。
3. 序列化和反序列化
为了能够在网络上传输数据,Dubbo 支持多种序列化方式(如 Hessian, JSON, FastJSON 等),以将对象转换为字节流进行传输,接收方再将字节流转回对象。
4. 负载均衡
Dubbo 内置了几种负载均衡策略,例如随机选择、轮询、最少活跃调用数等。当服务消费者需要调用远程服务时,它会根据配置的负载均衡策略选择最合适的服务提供者来发起调用。
5. 集群容错
Dubbo 提供了多种集群容错机制,比如 Failover(失败自动切换)、Failfast(快速失败)、Failsafe(安全失败)等,以保证即使部分服务实例不可用,整个系统仍能稳定运行。
6. 动态路由
Dubbo 允许通过条件匹配的方式定义服务调用的路由规则,可以实现更灵活的服务治理,如灰度发布、流量分割等。
7. 监控和统计
Dubbo 提供了一个监控中心,用于收集和展示服务调用的数据,如调用量、响应时间、错误率等。这有助于了解系统的性能瓶颈和服务质量。
8. 配置管理
Dubbo 支持从配置中心加载配置,使得配置可以集中管理和实时更新,无需重启服务即可生效。
Dubbo 的这些特性共同作用,形成了一个高效、可靠的分布式服务框架,适用于构建大规模的微服务架构应用。
3. Dubbo 支持哪些协议?
Dubbo 支持多种通信协议,以满足不同场景下的需求。以下是 Dubbo 支持的主要协议:
Dubbo 协议:
这是 Dubbo 自带的二进制 RPC 协议,具有高性能和高效率的特点。
使用 TCP 传输协议进行通信,并默认采用 Hessian 序列化协议。
特别适合大并发小数据量的服务调用,以及服务消费者远大于提供者的情况。
HTTP 协议:
包括 REST 风格的 HTTP 协议和 SOAP 协议。
REST 风格通常使用 JSON 或 XML 格式的数据交换格式。
SOAP 则使用 XML 进行消息传递。
Hessian 协议:
Hessian 是一种轻量级的二进制通信协议,支持跨语言调用。
数据以二进制形式通过 TCP 传输,并且有较好的性能表现。
RMI 协议:
基于 Java RMI 实现,使用标准的 Java 序列化机制。
它使用多个短连接,适用于常规远程服务调用,但存在安全漏洞风险(Java 反序列化问题),需要确保使用的库版本是最新的以避免安全隐患。
Webservice 协议:
基于 WebService 的远程调用协议,提供了与原生 WebService 的互操作性。
使用多个短连接和基于 HTTP 的同步传输,适合系统集成和跨语言调用。
Thrift 协议:
Thrift 是 Facebook 开发的一种高效的二进制通信协议,支持多语言。
它扩展了额外的头信息,但在某些情况下不支持传输 null 值。
Memcache 和 Redis 协议:
这些是基于特定存储系统的协议,主要用于缓存相关的场景。
Triple 协议:
基于 HTTP/1 和 HTTP/2 的高性能通信协议,完全兼容 gRPC。
支持 Unary 和 Streaming 等通信模式,也支持发布 REST 风格的 HTTP 服务。
任意协议扩展:
通过扩展 protocol 接口,可以集成其他任何 RPC 协议,如官方生态提供的 JsonRPC、Thrift 等。
选择哪种协议取决于具体的业务需求、性能要求、网络环境等因素。开发者可以根据实际应用场景来决定最适合的协议。
4.注册中心挂了, consumer 还能不能调用 provider?
当注册中心挂掉时,Dubbo 的服务消费者(consumer)和服务提供者(provider)之间的调用行为取决于几个因素:
缓存机制:如果服务消费者之前已经成功从注册中心获取了服务提供者的地址列表,并且这些信息被本地缓存,那么即使注册中心暂时不可用,服务消费者仍然可以使用缓存的服务提供者列表来继续调用服务。这种情况下,现有服务调用不会立即受到影响。
心跳检测:在正常情况下,服务消费者和服务提供者之间会保持心跳检测,以确保连接的有效性。如果注册中心挂掉,心跳检测可能会受到影响,具体影响取决于配置和实现方式。一些实现可能允许短暂时间内继续通信,而不需要通过注册中心确认。
重试机制:某些场景下,如果首次尝试失败,服务消费者可能会有重试机制。如果是在短时间内注册中心恢复,重试可能会成功。
持久化订阅关系:一些注册中心(如 ZooKeeper)支持持久化的订阅关系,即服务消费者与注册中心的连接断开后,一旦注册中心恢复正常,它会自动重新建立连接并更新订阅信息。这意味着服务消费者可以在注册中心恢复后快速同步最新的服务提供者列表。
集群模式下的容错能力:如果注册中心是以集群模式部署的,并且具备高可用性和容灾能力,那么即使单个节点故障,整个注册中心的服务依然可用,从而不影响消费者的调用。
静态配置:对于某些关键服务,也可以采用静态配置的方式,在配置文件中直接指定服务提供者的地址。这种方式不受注册中心状态的影响,但缺乏灵活性,不便于动态管理服务。
综上所述,虽然注册中心挂掉会对新加入的服务发现造成阻碍,并且长期来看会影响服务治理和维护,但在短期内,通过上述措施,服务消费者还是有可能继续调用服务提供者的。不过,建议尽快修复或恢复注册中心的服务,以保证系统的稳定运行和服务治理的有效性。
5.怎么实现动态感知服务下线的呢?
在 Dubbo 中,动态感知服务下线(即服务提供者不可用)是通过心跳检测和注册中心的通知机制来实现的。以下是具体实现方式:
1. 心跳检测机制
服务提供者与消费者之间的心跳:Dubbo 在服务提供者和服务消费者之间设置了心跳检测机制。默认情况下,服务提供者会定期向服务消费者发送心跳包,以确认连接是否正常。如果连续几次心跳都未能得到回应,服务消费者将认为该服务提供者已经下线,并将其从可用的服务列表中移除。
服务提供者与注册中心之间的心跳:同样地,服务提供者也会定期向注册中心发送心跳信息。注册中心利用这些心跳信息来监控服务提供者的健康状态。如果某个服务提供者长时间未发送心跳,则注册中心可以判定该提供者已下线,并更新其内部的服务提供者列表。
2. 注册中心通知机制
订阅/发布模式:当服务提供者上线或下线时,它会通知注册中心,而注册中心则负责向所有订阅了该服务的服务消费者发送最新的服务提供者列表。这种方式确保了服务消费者的地址列表始终保持最新。
事件驱动架构:注册中心通常采用事件驱动的方式处理服务变化。例如,在 ZooKeeper 中,当节点的状态发生变化时(如临时节点被删除),会触发相应的事件,通知监听的服务消费者进行相应的处理。
3. 消费者端的处理
本地缓存更新:服务消费者接收到注册中心的通知后,会更新其本地缓存的服务提供者列表。对于已经被标记为下线的服务提供者,消费者不会再尝试发起调用。
负载均衡策略调整:服务消费者根据新的服务提供者列表重新计算负载均衡策略,避免将请求分配给已经下线的服务提供者。
4. 容错机制
集群容错策略:Dubbo 提供了多种集群容错策略,比如 Failover(失败自动切换)、Failfast(快速失败)等。即使部分服务提供者下线,合理的容错策略也可以保证系统整体的稳定性,尽量减少对用户体验的影响。
5. 配置选项
检查间隔和超时设置:可以通过配置来调整心跳检测的时间间隔以及服务提供者被认为下线前的最大无响应时间,以适应不同的应用场景。
通过上述机制,Dubbo 实现了对服务提供者上下线的动态感知,确保了服务调用的高效性和可靠性。这种设计不仅增强了系统的容错能力,还提高了服务治理的灵活性。
相关文章:

Dubbo 核心知识全解析:原理、流程与关键机制
1.说说一次 Dubbo 服务请求流程? Dubbo 是一个分布式服务框架,它简化了基于 SOA(面向服务架构)的应用程序的开发。一次典型的 Dubbo 服务请求流程如下: 服务提供者启动: 服务提供者启动后,会向注册中心注册…...

时间序列预测算法---LSTM
目录 一、前言1.1、深度学习时间序列一般是几维数据?每个维度的名字是什么?通常代表什么含义?1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路?1.4、RNN存在哪些问题? 二、…...

二十三种设计模式-建造者模式
建造者模式(Builder Pattern)是一种创建型设计模式,它提供了一种分步骤构建复杂对象的方法。这种模式允许你通过相同的创建过程构建不同的表示。建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的对象…...

MarkDown 的 mermaid gantt(甘特图)、mermaid sequenceDiagram (流程图) 语法解析和应用
简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MarkDown 的 mermaid gantt、mermaid sequenceDiagram 语法解析和应用前言mermaid gan…...

git submodule的使用:将别人的git仓库作为自己的子仓库
git的基本操作在该篇中展示:git的基本操作在日常开发中,我们经常会碰到需要将别人的仓库作为自己的子仓库来进行开发。下面将介绍具体将如何操作。 1、添加Submodule至自己的git仓库 1.1、创建自己的Git仓库 (1)在github中创建自…...

Springboot 下载附件
GetMapping("/download") public void download(RequestParam String fileId, HttpServletResponse response) throws IOException {// 查询文件信息SysFileEntity sysFileEntity fileService.queryFileById(fileId);response.setContentType("application/oct…...

MySQL 延迟复制:确保数据安全与系统稳定的秘诀
MySQL 延迟复制:确保数据安全与系统稳定的秘诀 在 MySQL 主从复制架构中,数据的同步通常是实时的。然而,在一些特定场景下,我们可能不希望从库立刻同步主库的所有更新。特别是在高风险操作或者主库出现故障时,实时复制…...

ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana
前言 你知道对于一个系统的上线考察,必备的几样东西是什么吗?其实这也是面试中考察求职者,是否真的做过系统开发和上线的必备问题。包括:服务治理(熔断/限流) (opens new window)、监控 (opens new window)和日志,如果…...

python实现自动登录12306抢票 -- selenium
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 python实现自动登录12306抢票 -- selenium 前言其实网上也出现了很多12306的代码,但是都不是最新的,我也是从网上找别人的帖子,看B站视频&…...

使用Diffusion Models进行图像超分辩重建
Diffusion Models专栏文章汇总:入门与实战 前言:图像超分辨率重建是一个经典CV任务,其实LR(低分辨率)和 HR(高分辨率)图像仅在高频细节上存在差异。通过添加适当的噪声,LR 图像将变得与其 HR 对应图像无法区分。这篇博客介绍一种方式巧妙利用这个规律使用Diffusion Mod…...

吾杯网络安全技能大赛——Misc方向WP
吾杯网络安全技能大赛——Misc方向WP Sign 题目介绍: 浅浅签个到吧 解题过程: 57754375707B64663335376434372D333163622D343261382D616130632D3634333036333464646634617D 直接使用赛博橱子秒了 flag为 WuCup{df357d47-31cb-42a8-aa0c-6430634ddf4a} 原神启动…...

Web安全 - “Referrer Policy“ Security 头值不安全
文章目录 概述原因分析风险说明Referrer-Policy 头配置选项1. 不安全的策略no-referrer-when-downgradeunsafe-url 2. 安全的策略no-referreroriginorigin-when-cross-originsame-originstrict-originstrict-origin-when-cross-origin 推荐配置Nginx 配置示例 在 Nginx 中配置 …...

C#OPC(上)
OPC(OLE for Process Control),用于过程控制的OLE,是一个工业标准,管理这个标准的国际组织是OPC基金会,OPC基金会现有会员以超过220家。遍布全球,包括世界上所有主要的自动化控制系统、仪器仪表及过程控制系统的公司。基于微软的O…...

Imgui + Cmake + OpenGL + GLFW 隐藏控制台窗口
网上一般是VS,如何在属性里面把控制台改为窗口 本文,使用Clion Cmake,实现如何隐藏控制台窗口 环境:OpenGL3 GLFW 添加头文件#include <windows.h>把main函数入口改为int WinMain(HINSTANCE hInstance, HINSTANCE hPrevI…...

Spring Boot(七):Swagger 接口文档
1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…...

RabbitMQ - 4 ( 22000 字 RabbitMQ 入门级教程 )
一: RabbitMQ 高级特性 前面主要讲解了 RabbitMQ 的概念和应用。RabbitMQ 实现了 AMQP 0-9-1 规范,并在此基础上进行了多项扩展。在 RabbitMQ 官方网站中详细介绍了其特性,我们将其中一些重要且常用的特性挑选出来进行讲解。 1.1 消息确认 …...

印象笔记07——试一试PDF标注
印象笔记07——试一试PDF标注 [!CAUTION] 根据第六期,我再次查询了资料,印象笔记还是有一些可圈可点的功能的(当然部分有平替),针对会员作用,开发使用场景虽然是逆向的,但我坚信这是一部分人的现…...

Vue3实战教程》24:Vue3自定义指令
如果您有疑问,请观看视频教程《Vue3实战教程》 自定义指令 介绍 除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (Custom Directives)。 我们已经介绍了两种在 Vue 中重用代码的方式:组件和组…...

【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向
【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向 【2025优质学术推荐】征稿控制科学、仪器、智能系统、通信、计算机、电子信息、人工智能、大数据、机器学习、软件工程、网络安全方向 文章目…...

【ArcGIS Pro/GeoScene Pro】可视化时态数据
可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据...

Linux buildroot和ubuntu的异同点
Buildroot 和 Ubuntu 都是 Linux 系统的操作环境,但它们的设计理念和使用场景有很大的不同。 一、定义与目标 Buildroot Buildroot 是一个用于生成嵌入式 Linux 系统的工具集,专注于交叉编译和构建嵌入式设备的最小 Linux 环境。它的目标是为嵌入式系统提供定制化和优化的…...

k8s系列--通过docker拉取的镜像导入到 containerd中
要将通过 docker pull 拉取的镜像导入到 containerd 中,可以按照以下步骤操作: 步骤 1:使用 docker 将镜像保存为 tar 文件 docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.11.1 docker save registry.cn-ha…...

Spring Boot(快速上手)
Spring Boot 零、环境配置 1. 创建项目 2. 热部署 添加依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> </dependency&…...

note 41:账务系统开发规范
目录 系统设计 防重控制 流量控制 并发控制 异常处理 备份机制 系统开发 前端队列操作 外系统交互 系统设计 防重控制 对于进入到系统中的数据(文件导入、手工录入、系统直连等)以及本系统发往外…...

基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于嵌入式无人机UAV通信系统的实时最优资源分配算法matlab仿真。具体参考文献: 考虑使用UAV作为中继辅助节点的设备到设备(D2D)无线信息和…...

《Vue3实战教程》35:Vue3测试
如果您有疑问,请观看视频教程《Vue3实战教程》 测试 为什么需要测试 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…...

【Java设计模式-3】门面模式——简化复杂系统的魔法
在软件开发的世界里,我们常常会遇到复杂的系统,这些系统由多个子系统或模块组成,各个部分之间的交互错综复杂。如果直接让外部系统与这些复杂的子系统进行交互,不仅会让外部系统的代码变得复杂难懂,还会增加系统之间的…...

log4j2的Strategy、log4j2的DefaultRolloverStrategy、删除过期文件
文章目录 一、DefaultRolloverStrategy1.1、DefaultRolloverStrategy节点1.1.1、filePattern属性1.1.2、DefaultRolloverStrategy删除原理 1.2、Delete节点1.2.1、maxDepth属性 二、知识扩展2.1、DefaultRolloverStrategy与Delete会冲突吗?2.1.1、场景一:…...

super_vlan
Super VLAN产生的背景 就经典的酒店例子来说,若是将101房和102房的网络划分在同一个vlan下面,那么101房出现了一个懂得某些安全技术的大佬,就会使得102房的隐私得到严重的隐患 所以这时我们就需要将二层给隔离开,但又要去保证10…...

前端CSS3学习
学习菜鸟教程 火狐-moz- 谷歌 Safari -webkit- 前面都加这个,可能才生效 边框 border: 1px solid #ddd 粗细 样式 样色 经常和border-radius 一块用 border-radius: 50px 20px 第一个左右 第二个右左 border-top-left-radius … box-shadow: 10px 5px 10px 0 #88…...