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 实现了对服务提供者上下线的动态感知,确保了服务调用的高效性和可靠性。这种设计不仅增强了系统的容错能力,还提高了服务治理的灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维码文件在线管理系统-收费版

需求背景 如果大家想要在网上管理自己的文件,而且需要生成二维码,下面推荐【草料二维码】,这个系统很好。特别适合那些制造业,实体业的使用手册,你可以生成一个二维码,贴在设备上,然后这个二维码…

【C语言程序设计——循环程序设计】枚举法换硬币(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 一、循环控制 / 跳转语句的使用 1. 循环控制语句(for 循环) 2. 循环控制语句(while 循环) 3. 跳转语句(break 语句) 4. 跳转语句(continue 语句&…

【Multisim用74ls92和90做六十进制】2022-6-12

缘由Multisim如何用74ls92和90做六十进制-其他-CSDN问答 74LS92、74LS90参考

计算机的错误计算(二百)

摘要 用三个大模型计算 exp(123.456). 结果保留10位有效数字。三个大模型的输出均是错误的,虽然其中一个给出了正确的 Python代码。 例1. 计算 exp(123.456). 保留10位有效数字。 下面是与第一个大模型的对话。 以上为与一个大模型的对话。 下面是与另外一个大模…

自行下载foremos命令

文章目录 问题描述其他小伙伴的成功解决方案,但对我不适用解决思路失败告终 最终解决成功解决思路解决步骤 问题描述 在kali系统终端中输入foremost,显示无此命令 其他小伙伴的成功解决方案,但对我不适用 解决思路 正常来说使用命令 apt-g…

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录:http://192.168.31.135:8086,首次登录设置用户名密码:admin/admin1…

Leetcode打卡:我的日程安排表II

执行结果:通过 题目 731 我的日程安排表II 实现一个程序来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。 当三个日程安排有一些时间上的交叉时(例如三个日程安排都在同一时间内)&#…

创龙3588——debian根文件系统制作

文章目录 build.sh debian 执行流程build.sh源码流程 30-rootfs.sh源码流程 mk-rootfs-bullseys.sh源码流程 mk-sysroot.sh源码流程 mk-image.sh源码流程 post-build.sh 大致流程系统制作步骤 build.sh debian 执行流程 build.sh 源码 run_hooks() {DIR"$1"shiftf…

拟声 0.60.0 | 拟态风格音乐播放器,支持B站音乐免费播放

「拟声」是一款音乐播放器,不仅支持音视频的本地播放,还提供了账号注册功能,登录后可享受自动同步歌单、歌词等。它支持播放绝大多数音频格式,具备固定输出采样率、独占输出、内置均衡器和音调调整等功能。同时,它也支…

计算机网络 (16)数字链路层的几个共同问题

一、封装成帧 封装成帧是数据链路层的一个基本问题。数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。封装成帧就是在一段数据的前后分别添加首部和尾部,构成了一个帧。接收端在收到物理层上交的比特流后…

Linux Shell 脚本编程基础知识篇—awk的条件判断(3)

ℹ️大家好,我是练小杰,今天周五了,又是一周过去了😆 本文是有关Linux shell脚本编程的awk命令的条件语句,后续我会不断增加相关内容 ~~ 回顾:【awk字符串函数和内置变量】 更多Linux 相关内容请点击👉【Li…

小程序学习07—— uniapp组件通信props和$emit和插槽语法

目录 一 父组件向子组件传递消息 1.1 props (a)传递静态或动态的 Prop (b)单向数据流 二 子组件通知父组件 2.1 $emit (a)定义自定义事件 (b)绑定自定义事件 三 插槽语法…

【深度学习进阶】基于CNN的猫狗图片分类项目

介绍 基于卷积神经网络(CNN)的猫狗图片分类项目是机器学习领域中的一种常见任务,它涉及图像处理和深度学习技术。以下是该项目的技术点和流程介绍: 技术点 卷积神经网络 (CNN): CNN 是一种专门用于处理具有类似网格结构的数据的…

【pytorch-lightning】架构一览

pytorch-lightning是基于pytorch的一个套壳项目,适配pytorch的版本同步更新速度很快。 它将训练的几个主要流程模块化,减少重复工作,同时让支持分布式训练,不同平台的训练迁移变得更加简单。 官网链接

AWS K8s 部署架构

Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…

【Vue】vue项目中命名规范(结合上一篇项目结构)

组件命名规范: 多单词命名: 避免使用单个单词命名组件,因为这可能会导致命名冲突。相反,应该使用描述性的多单词命名,如 UserProfile、SettingsPanel 等。 使用帕斯卡命名法: 组件名称应该以大写字母开头&…

node.js之---事件循环机制

事件循环机制 Node.js 事件循环机制(Event Loop)是其核心特性之一,它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O,使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…

信息科技伦理与道德1:绪论

1 问题描述 1.1 信息科技的进步给人类生活带来的是什么呢? 功能?智能?陪伴?乐趣?幸福? 基于GPT-3的对话Demo DeepFake 深伪技术:通过神经网络技术进行大样本学习,将个人的声音、面…

uniapp 自定义类微信支付键盘 (微信小程序)

效果图 代码: <view class"popups popupsB"><view class"appreciatePrice"><view class"appreciatePriceTitle">赞赏金额</view><view class"appreciatePriceInput flex ac">&#xffe5;<input typ…

电子电气架构 --- 中央处理器HPC及软件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…