Dubbo 关键知识点解析:负载均衡、容错、代理及相关框架对比

1.Dubbo 负载均衡策略?

Dubbo 是一个分布式服务框架,它提供了多种负载均衡策略来分发服务调用。在 Dubbo 中,负载均衡的实现是基于客户端的,即由服务消费者(Consumer)端决定如何选择服务提供者(Provider)。以下是 Dubbo 支持的一些常见的负载均衡策略:

Random LoadBalance (随机)

默认情况下,Dubbo 使用的是加权随机算法。所谓加权随机,就是根据每个服务提供者的权重配置,按照比例随机选取服务提供者。
RoundRobin LoadBalance (轮询)

按照顺序循环调用,当有多个提供者时,每次请求会按序轮流调用不同的提供者,如果某个提供者不可用,则跳过。
LeastActive LoadBalance (最少活跃调用)
这个策略会选择当前活跃调用数最小的服务提供者。这里的“活跃调用”是指未完成的调用数量。对于权重较高的服务提供者,会有更高的几率被选中。

ConsistentHash LoadBalance (一致性哈希)

根据参数进行哈希,保证相同参数的请求总是发送到同一个提供者上。这对于需要保持会话状态的应用非常有用。可以通过指定hash.arguments参数来设置参与哈希计算的方法参数位置。

ShortestResponse LoadBalance (最短响应时间)

选择历史平均响应时间最短的服务提供者。这个策略不是默认提供的,可能需要通过扩展点机制自行实现。
使用这些策略时,可以在服务消费者的配置文件或代码中指定想要使用的负载均衡策略。例如,在 XML 配置文件中,可以通过 < dubbo:reference > 标签的loadbalance属性来设置。

<dubbo:reference id="demoService" interface="com.alibaba.demoservice.DemoService" loadbalance="leastactive"/>

此外,Dubbo 的负载均衡策略是可插拔的,这意味着你可以通过实现自己的负载均衡算法并注册为 Dubbo 的 SPI 扩展来添加自定义的负载均衡策略。

2. Dubbo 容错策略

Dubbo 提供了多种容错策略(Fault Tolerance Strategy)来确保服务调用的高可用性和稳定性。这些策略决定了当服务调用失败时,Dubbo 将如何处理。以下是 Dubbo 支持的主要容错策略:

Failover Cluster (重试)

这是默认的容错策略。如果调用失败,则会从注册中心获取的服务列表中选择其他服务提供者进行重试,直到达到最大重试次数(默认为2次)。对于幂等性操作来说,这是一个不错的选择。

Failfast Cluster (快速失败)

只发起一次调用,如果调用失败立即报错。适用于非幂等性的操作,如新增记录,避免重复执行带来的问题。

Failsafe Cluster (安全失败)

即使出现异常也不会抛出,而是直接忽略异常。适用于写入审计日志等操作,即使失败也不影响主流程。

Failback Cluster (失败自动恢复)

如果调用失败,它不会立刻抛出异常,而是在后台定时重试。通常用于消息通知、日志收集等场景,允许一定程度上的延迟处理。

Forking Cluster (并行调用多个服务器)

同时调用多个服务提供者,并发数可以指定(默认为2),只要一个成功即返回。适用于对响应时间敏感但又要求高可用性的场景。

Broadcast Cluster (广播调用所有服务器)

调用所有提供者,逐个调用,任意一台报错则报错。常用于需要将数据同步到所有节点的情况,例如缓存更新或配置更新。
这些策略可以在服务消费者的配置文件或代码中通过dubbo:reference标签的cluster属性来设置。例如:

< dubbo:reference id="demoService" interface="com.alibaba.demoservice.DemoService" cluster="failover"/>

除了上述内置策略外,Dubbo 还支持自定义集群容错策略。你可以通过实现com.alibaba.dubbo.rpc.cluster.Cluster接口,并通过 SPI 机制注册你的自定义策略。

选择合适的容错策略对于构建稳定可靠的服务非常重要,应根据具体的业务需求和场景来决定采用哪种策略。

3. Dubbo 动态代理策略有哪些?

Dubbo 支持多种动态代理策略,允许开发者根据需求选择最适合的代理方式。动态代理机制在 Dubbo 中主要用于创建服务接口的代理实例,以便在调用这些接口时可以透明地执行远程过程调用(RPC)。以下是 Dubbo 支持的一些主要动态代理策略:

Javassist 动态字节码生成

这是 Dubbo 默认使用的动态代理方式。Javassist 是一个用于编辑 Java 字节码的库,它可以在运行时生成新的类和方法,因此非常适合用来创建动态代理。

JDK 动态代理

JDK 自带的动态代理机制依赖于接口,通过反射机制为接口生成代理对象。如果服务提供者实现了接口,则可以使用此方式来创建代理。

CGLIB 动态代理

CGLIB(Code Generation Library)是一个强大的高性能代码生成库,它可以在运行时扩展 Java 类和实现接口。与 JDK 动态代理不同的是,CGLIB 不需要目标类实现接口即可生成代理。

ByteBuddy 动态代理

ByteBuddy 是另一个流行的字节码操作库,它可以用来生成、转换和加载 Java 类。它比 Javassist 和 CGLIB 更加现代,并且提供了更简洁的 API。

基于 SPI 的动态代理

Dubbo 通过 SPI(Service Provider Interface)机制支持自定义动态代理策略。用户可以通过实现 ProxyFactory 接口来自定义代理逻辑,并将其注册到 Dubbo 的扩展点中。

Spring AOP 动态代理

虽然这不是 Dubbo 内置的功能,但可以通过集成 Spring 框架利用 Spring AOP 来进行动态代理。这使得可以在不修改原有代码的情况下,通过拦截方法调用来实现额外功能。

基于注解的动态代理

Dubbo 支持通过注解指定代理方式。例如,可以使用特定注解如 @ProxyBean 或 @Service 来指示 Dubbo 使用 JDK 或 CGLIB 等方式进行代理。

选择哪种动态代理策略取决于具体的应用场景和技术要求。默认情况下,Dubbo 使用 Javassist 进行动态代理,因为它通常能提供较好的性能和灵活性。然而,在某些情况下,比如当项目已经广泛使用了 CGLIB 或者想要避免引入额外依赖时,可能会选择其他的代理方式。此外,通过 SPI 扩展机制,还可以轻松添加或切换不同的代理实现。

4.说说 Dubbo 与 Spring Cloud 的区别?

Dubbo 和 Spring Cloud 都是用于构建分布式系统和服务治理的框架,但它们在设计理念、架构背景、通信协议、服务调用方式、注册中心支持以及适用场景等方面存在显著差异。以下是两者的主要区别:

架构背景和定位

  • Dubbo:起源于 SOA(面向服务的架构)时代,主要聚焦于服务的调用、流量管理和监控等功能。它旨在提供高效的 RPC(远程过程调用)解决方案。
  • Spring Cloud:诞生于微服务架构时代,涵盖了微服务治理的方方面面,关注服务注册与发现、配置管理、断路器、路由等。它建立在 Spring 和 Spring Boot 的生态之上,提供了更全面的微服务解决方案。

通信协议和服务调用

  • Dubbo:使用 Netty 等 NIO 框架,基于 TCP 协议进行通信,配合 Hessian 序列化实现高效的二进制传输。RPC 调用方式意味着服务消费者和提供者之间存在较强的代码依赖关系。
  • Spring Cloud:通常基于 HTTP 协议和 REST 接口进行通信,虽然 HTTP 请求的带宽占用较大,但 REST 的灵活性使得服务提供者和消费者之间的依赖关系相对松散,依赖契约而非代码,这在强调快速演化的微服务环境下更为合适。

注册中心和支持

  • Dubbo:最初仅支持 ZooKeeper 作为注册中心,后来扩展支持了 Nacos 等其他注册中心。它的设计更专注于服务治理功能。
  • Spring Cloud:支持多种注册中心,如 Eureka, Consul, Zookeeper 等,并且通过 Spring Boot 提供了一套简化配置和使用的工具集。

生态系统

  • Dubbo:由于其高性能和轻量级特性,适合对性能有高要求的应用场景,特别是在电商领域有着广泛的应用。
  • Spring Cloud:拥有更加丰富的生态系统,包括但不限于配置管理、熔断机制、智能路由、微代理、控制总线、一次性 token、全局锁、选主、分布式会话和集群状态等,适用于广泛的微服务架构需求。

监控和管理

  • Dubbo:提供了 Dubbo Monitor 等工具用于监控和管理微服务。
  • Spring Cloud:除了上述提到的各种子项目外,还提供了 Spring Boot Admin 等工具用于监控和管理微服务。

总结

选择 Dubbo 还是 Spring Cloud 取决于具体的业务需求和技术栈偏好。如果项目需要高性能的远程调用并且对服务间的耦合度较高,Dubbo 是一个很好的选择;而对于那些追求灵活的服务定义、解耦的服务间通信以及完整的微服务治理方案,则 Spring Cloud 更具优势。在实际应用中,也可以根据项目的不同部分选择不同的框架组合使用,以达到最佳效果。

5.Zookeeper 和 Dubbo 的关系?

ZooKeeper 和 Dubbo 之间的关系主要体现在服务注册与发现上。Dubbo 是一个高性能的 Java RPC 框架,而 ZooKeeper 则是一个分布式协调服务,通常被用作 Dubbo 的服务注册中心。以下是它们之间关系的具体说明:

服务注册与发现

  • 服务提供者注册:当一个服务启动时,它会将自己提供的服务接口信息(如服务名、版本号、地址等)注册到 ZooKeeper 中。这些信息会被存储为 ZooKeeper 中的节点(znode),并且可以设置为临时节点,以便在服务不可用或宕机时自动从注册表中移除。
  • 服务消费者订阅:服务消费者启动后,会向 ZooKeeper 订阅它感兴趣的服务接口。一旦有新的服务提供者加入或已有提供者下线,ZooKeeper 会通知订阅了该服务的所有消费者,从而保证服务列表的实时更新。

动态路由和负载均衡

  • 使用 ZooKeeper 作为注册中心,可以帮助实现动态路由规则和服务权重配置等功能。例如,可以根据不同的条件(如地理位置、服务器性能等)来调整流量分配策略,或者对某些服务提供者设置更高的权重以增加其被选中的概率。

配置管理

  • ZooKeeper 还可以用来集中化管理配置信息。Dubbo 的一些配置项可以通过 ZooKeeper 来进行动态调整,比如超时时间、重试次数等,而无需重启应用。

高可用性

  • ZooKeeper 自身具有高可用性和一致性保障,通过复制日志、选举机制等手段确保集群内所有节点的数据一致。这使得即使单个 ZooKeeper 节点出现故障,整个注册中心仍然能够正常工作,进而提高了基于 ZooKeeper 的 Dubbo 服务调用的可靠性。

版本控制

  • 在某些情况下,ZooKeeper 可用于维护不同版本的服务定义,帮助实现平滑升级和回滚。例如,在新版本服务上线前,可以在 ZooKeeper 中预先发布新版本的服务信息,并逐步引导流量到新版本上来。

综上所述,ZooKeeper 在 Dubbo 架构中扮演着至关重要的角色,不仅实现了高效的服务注册与发现,还支持了诸如配置管理、动态路由等高级特性,增强了系统的灵活性和可扩展性。不过值得注意的是,虽然 ZooKeeper 是 Dubbo 默认的服务注册中心之一,但并不是唯一选择。随着技术的发展,Nacos、Consul 等其他注册中心也逐渐成为 Dubbo 生态的一部分,提供了更多的选择和功能。

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

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

相关文章

TI毫米波雷达原始数据解析之Lane数据交换

TI毫米波雷达原始数据解析之Lane数据交换 背景Lane 定义Lane 确认确认LVDS Lane 数量的Matlab 代码数据格式参考 背景 解析使用mmWave Studio 抓取的ADC Data Lane 定义 芯片与DCA100之间的数据使用LVDS接口传输&#xff0c;使用mmWave Studio 配置过程中有一个选项是LVDS L…

redis7基础篇3 redis的集群模式3

一 集群模式 1.1 redis的集群模式 Redis集群模式&#xff0c;实现数据集在多个节点进行共享&#xff0c;支持多个master节点。 Redis集群支持多个master&#xff0c;每个master节点又可以挂载多个slave&#xff1b;由于cluster自带sentinel的故障转移机制&#xff0c;内置高…

【嵌入式硬件】直流电机驱动相关

项目场景&#xff1a; 驱动履带车&#xff08;双直流电机&#xff09;前进、后退、转弯 问题描述 电机驱动MOS管烧毁 电机驱动采用IR2104STRH1R403NL的H桥方案&#xff08;这是修改之后的图&#xff09; 原因分析&#xff1a; 1.主要原因是4路PWM没有限幅&#xff0c;修改…

部署项目添加工程名的步骤

1.首先要在router下进行工程名添加 2.其次在vue.config.js中添加publicpath 3.在nginx配置文件中 location /my-app/ {try_files $uri $uri/ /my-app/index.html; }

SCAU期末笔记 - 数据库系统概念往年试卷解析

数据库搞得人一头雾水&#xff0c;题型太多太杂&#xff0c;已经准备摆烂了。就刷刷往年试卷&#xff0c;挂不挂听天由命。 2019年 Question 1 选择题 1. R ∩ S R∩S R∩S等于一下哪个选项&#xff1f; 画个文氏图秒了 所以选A. R ∩ S R − ( R − S ) R∩SR-(R-S) R∩…

【竞技宝】CS2:HLTV 2024 TOP11-w0nderful

北京时间2025年1月4日&#xff0c;HLTV年度选手排名正在持续公布中&#xff0c;今日凌晨正式公布了今年的TOP11为NAVI战队的w0nderful。 选手简介 w0nderful是一名来自于乌克兰的CS选手&#xff0c;现年20岁&#xff0c;目前在比赛中司职狙击手。w0nderful于2020年开启了自己的…

基层医联体医院患者历史检验检查数据的快速Python编程分析

​​​​​​​ 一、引言 1.1 研究背景与意义 在当今数字化医疗时代,医疗数据呈爆炸式增长,涵盖患者的基本信息、病史、检验检查结果、治疗方案等各个维度。这些海量且复杂的数据蕴含着巨大价值,为精准医疗决策提供了关键依据。通过对患者历史检验检查数据的深入对比分析…

Java SpringBoot使用Apache POI导入导出Excel文件

点击下载《Java SpringBoot使用Apache POI导入导出Excel文件(源代码)》 1. Apache POI 简介 Apache POI 是一个强大的 Java 库&#xff0c;用于处理 Microsoft Office 文档&#xff0c;包括 Excel 文件&#xff08;.xls 和 .xlsx&#xff09;。在 Java Spring Boot 项目中&am…

AWS 申请证书、配置load balancer、配置域名

申请AWS证书 点击 request 申请完证书&#xff0c;AWS 会验证你对于域名的所有权&#xff0c;有两种方式&#xff0c;DSN 验证和邮箱验证。 这里说一下DSN 验证&#xff0c;上图中 Domains 中有CNAME name 和 CNAME value 。 在domain 网站中添加一个CNAME DSN 项&#xff0c;…

三甲医院等级评审八维数据分析应用(五)--数据集成与共享篇

一、引言 1.1 研究背景与意义 随着医疗卫生体制改革的不断深化以及信息技术的飞速发展,三甲医院评审作为衡量医院综合实力与服务水平的重要标准,对数据集成与共享提出了更为严苛的要求。在传统医疗模式下,医院内部各业务系统往往各自为政,形成诸多“信息孤岛”,使得数据…

RIP配置实验

RIP配置实验 案例简介 天一公司下属三个分公司&#xff0c;属于不同的地区&#xff0c;三个公司之间用路由器连接&#xff0c;路由器名称分别为分别为 Router0、Router1、Router2&#xff0c;请把一公司的部门pc0,通过二公司路由器&#xff0c;连接三公司的部门pc1,公司之间通…

从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)

此文为系列文章&#xff0c;此系列主要讲解RTSP客户端的拉流及播放&#xff0c;文章持续更新&#xff0c;会从rtsp的基本协议讲起&#xff0c;如何一步步实现音视频的拉流过程&#xff0c;包括一系列涉及到的协议&#xff0c;rtsp&#xff0c;sdp&#xff0c; rtp&#xff08;本…

大数据系列之:深入理解学习使用腾讯COS和COS Ranger权限体系解决方案,从hdfs同步数据到cos

大数据系列之&#xff1a;深入理解学习使用腾讯COS和COS Ranger权限体系解决方案&#xff0c;从hdfs同步数据到cos 对象存储COS对象存储基本概念COS Ranger权限体系解决方案部署组件COS Ranger Plugin部署COS-Ranger-Service部署COS Ranger Client部署 COSN 从hdfs同步数据到co…

docker Error response from daemon

问题 Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": read tcp 192.168.50.233:54354->54.198.86.24:443: read: connection reset by peer Unable to find image redis:latest locally docker: Error response from d…

域上的多项式环,整除,相通,互质

例1.已知 (R,,x)为域&#xff0c;请选出正确的说法:(A)(R,,x)也是整区; ABCD (B)R中无零因子; C)R在x运算上满足第一、二、三指数律; (D)R只有平凡理想; (E)R只有平凡子环。 域的特征&#xff1a; 域中&#xff0c;非0元素的加法周期 思考、在模7整数环R,中&#xff0c;…

登录的几种方式

使用Session完成登录 1. 手机号发送验证码 逻辑步骤&#xff1a; 校验手机号格式是否正确。生成验证码&#xff08;例如使用Hutool工具类&#xff09;。将手机号和验证码存入Session。返回验证码发送成功的响应。 2. 用户登录逻辑 逻辑步骤&#xff1a; 从Session中获取存…

电子电气架构 --- 中央HPC架构

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

SMTP发送邮件的过程

&#xff08;1&#xff09;SMTP客户端首先请求与服务器端的25号端口建立TCP连接(1分)。&#xff08;2&#xff09;连接建立成功后&#xff0c;客户端和服务器通过握手阶段验证双方身份(1分)。&#xff08;3&#xff09;验证成功后&#xff0c;客户端首先向服务器端通告邮件发送…

数据挖掘——神经网络分类

神经网络分类 神经网络分类人工神经网络多层人工神经网络 误差反向传播&#xff08;BP&#xff09;网络后向传播算法 神经网络分类 人工神经网络 人工神经网络主要由大量的神经元以及它们之间的有向连接构成。包含三个方面&#xff1a; 神经元的激活规则 主要是指神经元输入…

MySQL 【多表查询】

一 . 概述 多表关系&#xff1a; 一对多(多对一) &#xff0c; 多对多 &#xff0c;一对一 1&#xff09; 一对一 案例: 用户 与 用户详情的关系 关系: 一对一关系&#xff0c;多用于单表拆分&#xff0c;将一张表的基础字段放在一张表中&#xff0c;其他详情字段放在另 一张表…