Dubbo消费端调用全过程实现分析-负载均衡与集群容错

深入理解Dubbo服务调用与集群容错机制 本篇博客深入解析了Dubbo框架中服务调用的核心机制,包括服务提供者与消费者之间的连接管理、集群容错策略、以及服务路由的动态更新。通过对关键代码和时序图的分析,揭示了服务调用流程和远程过程调用(RPC)的实现细节,为读者提供了对Dubbo服务端和消费端启动流程的全面理解。 阅读详情

本文将对调用过程中涉及到核心的负载均衡、集群容错的实现进行分析。

一、负载均衡

负载均衡的目的是保证服务提供者被调用的流量能够平均的分布,避免流量倾斜导致某些节点负载过高而影响可用性。简单的说,在存在多个服务提供者的情况下,消费端在每次发起调用时要通过合适的策略选择一个节点进行调用,而这种合适的选择策略就是所说的负载均衡策略。要注意的是,我们在说负载均衡时,有一个前提就是要存在1个以上的服务提供者。

Dubbo提供了五种常见的负载均衡策略,分别是随机、轮询、最少活跃调用、一致性Hash、最快响应,同时,使用者也可以自行扩展实现负载均衡策略。下面对Dubbo提供的四种负载均衡实现方案进行说明。

2.1 随机-Random LoadBalance

Dubbo默认的负载均衡机制是随机,随机负载均衡的实现可以在RandomLoadBalance类中查看。

假定存在n个可用的节点,则实现的步骤:

  • 为每一个节点生成权重weight,分别记为w1,w2....wn
  • 如果w1=w2=...=wn,或sum(w1+w2+...+wn)=0,则通过ThreadLocalRandom.current().nextInt(n)随机获取节点,每个节点被选中的概率是相同的
  • 反之(所有节点的权重不是全部一样并且总权重累计值大于0),所有权重之和记为totalWeight,则通过ThreadLocalRandom.current().nextInt(totalWeight)生成一个随机数offset,然后循环遍历节点依次使用offset减去各节点的权重值,直至offset被减至小于0时,就选取该节点

下面举例说明,假设存在3个提供者节点,最终计算出的权重分别为w1=100,w2=150,w3=200,如下图:

最终,会在范围内[0,450)生成一个随机数,随机数落在[0,100)范围内则取节点1,落在[100,250)则取节点2,落在[250,450)则取节点3。

那么,每个节点的权重值怎么来的?

首先是配置的权重weight,权重值的配置是在服务提供方,可通过API配置ServiceConfig.setWeight(xxx)、xml配置<dubbo:Service weight="xxx">等方式进行设置。如果没有主动配置,默认的权值就是100。

其次是预热时间warmup,默认的为10分钟,或者通过配置服务提供方的warmup(单位毫秒)。

最后是,启动的时间uptime,通过当前时间减去提供者启动的时间(provider的url里的参数timestamp)。

最终权重的计算公式为:

如果最终计算的finalWeight小于1时为兜底取1。

基于Dubbo随机负载均衡策略的实现,我们可以通过合理的权重配置来达到流量分配的效果,同时,基于服务启动的预热时间,避免让服务在启动之初就处于高负载状态,来提升调用的稳定性。

2.2 轮询-RoundRobin LoadBalance

轮询策略,即依次请求各节点,Dubbo实现的方式可在RoundRobinLoadBalance类中查看。

实现的关键是RoundRobinLoadBalance的内部类WeightedRoundRobin,该类存在三个成员变量:

  • weight:节点权值
  • current:节点当前的权重,用于选择执行节点,选择最大的current的节点用于执行
  • lastUpate:最近更新时间,当节点数量变化时,用于判断是否从节点map中移出

选择过程如下:

  • 轮询所有节点,计算所有节点的current = current + weight,过程中会累积计算节点总权重totalWeight
  • 选取节点中cur最大的节点用于调用候选节点
  • 更新选中节点的current值,即current=current-totalWeight

轮询策略存在一个缺点是当其中某个节点响应时间较长时,请求还是会轮流的到此节点继续请求。要注意的是,轮询策略对各节点的权重计算与随机策略的权重计算方式是一样的。所以,本质上来说轮询与随机两种负载均衡的策略可以归为同一类。

针对这类策略存在的问题,就有最少活跃调用策略。

2.3 最少活跃调用数-LeastActive LoadBalance

最少活跃调用数,从字面意思就很好理解,即选择节点时会优先选择正在被调用的数量最少的节点。

第一个关键点是怎么去获取每个提供端节点的正在被调用的数量?

在LeastActiveLoadBalance类中可以看到获取active的代码为:

int active = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName()).getActive();

由上可知活跃连接数量active是在RpcStatus中,通过查找发现在ActiveLimitFilter中会在调用前将RpcStatus中将连接数量加1,请求结束后会减1。具体可以查看ActiveLimitFilter代码,此处不详细展开介绍。

因此,我们在使用LeastActive LoadBalance这种负载均衡策略时,需要在消费端配置filter="activelimit"。如果没有配置,实际上还是根据权重随机选择策略。

Dubbo实现最少活跃调用数的说明:

  • 如果存在最少活跃调用数的节点,则选择此节点
  • 如果存在多个相同的最少活跃调用数的节点,则通过权重加随机值计算选择其中一个

2.4 一致性Hash-ConsistentHash LoadBalance

我们对Hash并不陌生,比如常见的HashMap,分库分表中使用Hash对数据进行分片等。简单来说,通过对给定的参数进行hash函数求值得到hash值,然后对节点进行取模选择。其特点是对于相同的参数,最后都能找到同一个目标节点,而且效率较高。但使用普通的Hash方式做负载均衡策略存在一个缺点,当集群进行扩容或缩容时,集群节点数发生变化,请求分布可能会发生剧烈抖动,也就是大部分请求都会改变请求的目的节点。如下所示:

现有4个服务提供节点,四个请求假设通过hash函数得出的值分别是100,101,102,103,然后与4取模就分别映射到node0,node1,node2,node3,此时如果节点node3挂掉了,则会出现如下情况

可见在hash值不变的情况下,每一个请求的请求节点都发生变化,这样就不符合hash要达到的预期效果。

那么,什么是一致性Hash?一致性Hash是指将各节点和数据都映射到一个首尾相连的哈希环上。将存储节点和数据都映射到一个首尾相连的哈希环上,计算出的Hash值依照顺时针方向找到相应的节点。为了避免节点变化时导致发生数据倾斜,通常会增加虚拟节点,Dubbo在实现时默认设置160个虚拟节点,也可通过hash.nodes进行设置。 关于一致性hash的介绍已有很多,此处不展开。

2.5 最短响应时间-ShortestResponseLoadBalance

最短响应时间策略可以说是在最少活跃连接的基础上衍生出来的,这里的响应时间指的是某一个提供方节点处理完当前活跃的请求所需要的时间。这两种策略的实现方式也基本一致,区别就在于最短响应策略需要关注节点响应的值是怎么计算的。以下为ShortestResponseLoadBalance类中关于计算节点响应时间的代码:

// ShortestResponseLoadBalance.java
​
 RpcStatus rpcStatus = RpcStatus.getStatus(invoker.getUrl(), invocation.getMethodName());
 // Calculate the estimated response time from the product of active connections and succeeded average elapsed time.
 long succeededAverageElapsed = rpcStatus.getSucceededAverageElapsed();
 int active = rpcStatus.getActive();
 long estimateResponse = succeededAverageElapsed * active;

基本的数据来源还是最少活跃连接中提到的RpcStatus,通过历史的数据计算平均每次成功请求的耗时,然后再与活跃连接数active相乘得出的值就是节点的预估响应时间,然后在所有节点的预估响应时间中选择一个最小值。如果存在相同的就根据权重加随机选择,与最少活跃连接处理的方式一致。

2.6 粘滞连接

在负载均衡之前会去判断是否已配置了粘滞连接,如果配置了就会选择已调用过的invoke进行调用。

粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。

粘滞连接将自动开启延迟连接,以减少长连接数。

可通过如下配置:

<dubbo:reference id="xxxService" interface="com.xxx.XxxService" sticky="true" />

以上就是关于Dubbo负载均衡的相关学习内容,在集群环境下,有了负载均衡选择调用节点后,并不能保证每一次调用都能成功,由于网络总是存在不确认性、服务也存在故障的可能,那么就需要用对调用异常的情况进行容错处理的机制。

下面来介绍Dubbo的集群容错机制。

二、集群容错

Dubbo实现的集群容错有6种,从代码实现及思想来看都不算复杂,此处就不详细展开。总结如下:

容错模式特点使用场景
Failover调用失败后,默认重试2次通常用于读操作,但重试会带来更长延迟
Failfast调用1次,异常时会往上抛出异常通常用于非幂等的写入操作
Failsafe调用1次,当调用失败时,打印错误日志,并返回一个空的结果一般用于写入审计日志等
Failback调用失败时,会记录失败请求并使用定时器去重试,默认间隔5s,重试3次通常用于消息通知操作
Forking并行调用多个服务器,只要一个成功即返回通常用于实时性要求较高的读操作,但需要浪费更多服务资源
Broadcast广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息
【机器学习概率统计】11 贝叶斯统计推断:最大后验 这一节,我们来介绍另外一种统计推断方法:贝叶斯统计推断方法。 1.回顾贝叶斯定理 首先,我们先来复习一下贝叶斯定理: p(Θ∣X)=p(X∣Θ)p(Θ)p(X)p(\Theta|X)=\frac{p(X|\Theta)p(\Theta)}{p(X)}p(Θ∣X)=p(X)p(X∣Θ)p(Θ)​ 在这个简简单单的式子当中,蕴含了我们要掌握的很多重要内容: 贝叶斯定理当中的四个概率表达式,他们都非常重要,在这一节的内容中将反复出现,我们来一一解析一下: p(Θ)p(\Theta)p(Θ):先验分布。 反映的是在 阅读详情

相关推荐

超越数据手册:深入Zynq XADC的DRP接口与PL端自定义采样逻辑

本文深入探讨Zynq-7000系列XADC模块的DRP接口机制与PL端自定义采样逻辑实现。通过硬件级多通道轮询、触发采样和实时校准技术,突破传统软件驱动限制,为高精度电压测量和通讯应用提供极致灵活性和响应速度。

xxx12的博客 770

dubbo的服务调用与负载均衡原理、Java如何实现dubbo的服务调用与负载均衡

2.启动服务消费者项目,服务消费者将从注册中心获取可用的服务提供者列表,并进行负载均衡选择服务提供者进行调用。2.也可以自定义负载均衡策略,实现LoadBalance接口,并在配置文件中配置使用自定义的负载均衡器。1.在服务消费者的配置文件中配置Dubbo的负载均衡策略,如随机、轮询等。1.在服务消费者中通过Dubbo的注解或配置方式定义需要调用的服务接口。2.在配置文件中配置Dubbo的相关信息,如注册中心地址、服务端口等。1.启动服务提供者项目,服务提供者将注册服务到Dubbo的注册中心。

DKPT的博客 418

SimpleITK图像基础(一)——3D Resampling

文章目录前言基于SimpleITK进行实现 前言 进入深度学习网络之前需要进行统一数据集,这个时候需要对这些数据集进行重新采样,即假设各向同性体素并重新定向它们,以便可以读取所有图像的像素矩阵。 在将方位变换成一致时,可以用DICOMOrientImageFilter过滤器,可以将 DesiredCoordinateOrientation设置为你想要变换的方位,它将计算出所需的置换顺序并根据需要执行翻转以接近所需方向。 基于SimpleITK进行实现 workflow如下: step 1:首先运行DICOM

YYY_77的博客 2019

【Dubbo】Dubbo负载均衡实现解析

本文讲解了Dubbo负载均衡的作用,如何配置Dubbo负载均衡策略,以及Dubbo提供5种负载均衡实现和原理。

小明的Java问道之路 1565

别再乱改基础库了!手把手教你搞定uni-app小程序上传图片报错(chooseAndUploadFile权限篇)

本文详细解析了uni-app开发微信小程序时遇到的`chooseAndUploadFile`权限报错问题,并提供了四步解决方案。从隐私协议与API权限的关联入手,指导开发者正确配置后台声明、双重提交策略和版本管理,避免降级基础库等常见误区,确保小程序合规运行。

weixin_33709364的博客 276

数据结构:五岔路口交通管理红绿灯设计

我们可以知道这是一个“图”的着色问题,首先要考虑,为什么可行路线是13条?当然可以通过穷举得出,如果用公式:则是: 或者 因为一条路线必须包括一出一进两个方向 第一种答案的解法: 一、固定E为入口,则有C_4^1=4的可能; 二、除去E(因为E只有一个入向),剩下ABCD四个路口,然后因为C只有一个出方向,所以从剩下 的ABD中选择一个入口,即C_3^1; 三、再从剩下的三个出口任选

潘猫猫的世界 1万+

buddo源码分析-transport组件之Netty(一)

dubbo 2.5.10 版本,netty仍然使用的是netty的3.10.5版本,我们从下面的代码可以看出,SPI默认使用的是“netty”,而不是“netty4”。 package com.alibaba.dubbo.remoting; import com.alibaba.dubbo.common.Constants; import com.alibaba.dubbo...

weixin_30662849的博客 300

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 923

Dubbo学习(三)——dubbo实现负载均衡、智能容错功能

Dubbo是一种高性能的分布式服务框架,它提供了一套完整的服务治理解决方案。其中,负载均衡是Dubbo框架的重要特性之一,它可以帮助我们实现服务调用的负载均衡,提高系统的性能和可靠性。在本文中,我们将介绍Dubbo框架中负载均衡的概念和原理,并展示如何使用Dubbo实现负载均衡功能。Dubbo框架提供了强大的负载均衡功能,可以帮助我们实现服务调用的负载均衡。通过配置文件或编程方式,我们可以灵活地配置和使用Dubbo的负载均衡策略。这些功能可以提高系统的性能和可靠性,是构建分布式系统的重要工具。

杨思默 1712

Python爬虫实战:基于最新技术爬取国家企业信用信息公示系统数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的国家企业信用信息公示系统爬虫。我们将从爬虫基础知识讲起,逐步深入到反爬机制应对、数据解析与存储等高级话题,最终实现一个完整的爬虫系统。文章包含大量实战代码示例,适合中高级Python开发者学习参考。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和商业情报收集等领域。通用爬虫:如搜索引擎爬虫,广泛抓取互联网公开信息聚焦爬虫:针对特定领域或网站的数据采集增量式爬虫:只抓取更新内容,减少资源消耗。

2201_76125261的博客 2405

SEGGER Embedded Studio初体验

先楫HPM5E00EVK开发环境搭建

hywing's blog 1108

Dubbo 分布式服务框架

目录 节点角色说明: 调用关系说明: 1. 给我介绍一下 dubbo 吧? 2. 你们在项目中如何使用 dubbo 的? 3. 你们通过什么方式把服务发布到注册中心的? 4. Dubbo 容错策略有哪些? 5. Dubbo 超时时间设置怎么设置,服务调用超时问题如何解决 6. dubbo 在调用服务不成功时,默认是会重试几次。 7. 负载均衡实现原理是什么? 8. 你们公司的 double 注册中心用的什么? 9. 解释下 dubbo,云服务,和 zookeeper? 10. 为

xinyi_java的博客 1192

MATLAB 控制 E4438C 信号源的研究

通过 MATLAB,我们可以实现对 E4438C 的远程控制,从而实现更高的自动化和可编程性。总结起来,通过使用 MATLAB 和 Instrument Control Toolbox,我们可以轻松地控制 E4438C 信号源并生成各种类型的信号。需要注意的是,以上代码仅为示例,实际应用中可能需要根据具体情况进行更详细的配置和错误处理。此外,MATLAB 还提供了一系列函数和命令,可用于控制 E4438C 信号源的其他功能,如频率调谐、功率设置、调制设置等。您可以根据自己的需求进行相应的配置和控制。

RswtPerl的博客 1012

Dubbo源码分析(四)Dubbo调用链-消费端(集群容错机制)

Dubbo源码分析(一)Dubbo的扩展点机制 Dubbo源码分析(二)Dubbo服务发布Export Dubbo源码分析(三)Dubbo的服务引用Refer Dubbo源码分析(四)Dubbo调用链-消费端(集群容错机制) Dubbo源码分析(五)Dubbo调用链-服务端 Dubbo源码分析(六)Dubbo通信的编码解码机制 Dubbo框架的设计细节 (未完,待续) 这篇来分析Du...

dhwkjr1467的博客 142

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Dubbo面试杀招--Dubbo集群容错负载均衡

dubbo系列终章

敖丙 9723

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Dubbo源码解读-Consumer调用流程解析

消费端依赖代理对象,代理调用的入口为MockClusterInvoker.invoke持有集群容错类Cluster,默认FailOverCluster。MockClusterInvoker实现了Mock调用的原理从Url上获取配置的mock信息如果没有mock走远程RPC。获取服务列表(订阅事件,服务列表本地缓存)获取负载均衡算法。抽象类AbstractClusterInvoker调用子类具体集群容错类的doInvoke(),实现远程服务调用。调用负载均衡算法选择一个Invoker.

胖墩儿没腹肌 2766

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

dubbo源码:dubbo集群容错机制介绍及原理

文章目录1.概要1.1 dubbo调用主流程1.2 dubbo集群配置2. 集群容错方案2.1 集群容错方案简介AvailableClusterBroadcastClusterFailbackClusterFailfastClusterFailoverCluster(默认)FailsafeClusterForkingClusterMergeableClusterRegistryAwareClust...

聚焦AI技术前沿,深度解析大模型原理与多场景应用,探索最新突破与落地实践,助力行业洞悉趋势,驱动智能转型,赋能千行百业。 1009

dubbo智能集群容错与负载均衡策略解析

目录 1. 集群容错 1.1 五种容错策略 1.2 集群容错源码解析 2. 负载均衡 2.1 四种负载均衡策略 2.2 负载均衡源码解析 1. 集群容错 当集群调用(服务消费方调用服务提供方的服务)失败时,Dubbo提供了多种容错方案,缺省模式为failover,也就是失败重试。 这里的Invoker是Provider的一个可调用Service的抽象,Inv...

zhangm2020的博客 1017

DUBBO负载均衡、集群容错、服务降级有什么区别与联系

欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习 1 文章概述 负载均衡、集群容错、服务降级这三个概念在DUBBO中非常重要,同理其它分布式框架也都有相同或者相近之概念,那么三者分别代表什么含义,有什么联系和区别,解决了什么问题,正是本文需要回答的问题。 从调用顺序角度分析,调用顺序依次是负载均衡、集群容错、服务降级。从解决问题角度分析,负载均衡解决了「选哪一个」问题,集群.

JAVA前线技术专栏 1485

你还不会Dubbo集群容错?源码实现其实很简单

AbstractCluster.join 方法在doJoin 基础上增加拦截器,先忽略拦截器。doJoin 是一个抽象的方法具体有子类实现,返回AbstractClusterInvoker@Override加载对应负载均衡算法(LoadBalance)这里并没有调用负载均衡算法选择一个invoker,虽然AbstractClusterInvoker已经 实现逻辑select / reselect ,调用负载均衡算法选择一个invoker 是在子类中处理的。

happycao123的博客 1007

Dubbo 源码学习 | 消费端引用梳理

本文梳理Dubbo消费端获取引用对象,无感发起远程调用流程,当然限于篇幅,本文只讨论主流程, 一些集群容错、负载均衡等等没有涉及。

happycao123的博客 957

Dubbo的集群容错策略剖析

Dubbo的集群容错策略介绍和源码分析

J_bean的博客 1236

Dubbo集群容错源码剖析

题记: 文章内容输出来源:拉勾教育Java高薪训练营。 本篇文章是 Dubbo 学习课程中的一部分笔记。 Dubbo集群容错源码剖析 在对集群相关代码进行分析之前,这里有必要先来介绍一下集群容错的所有组件。包含 Cluster、Cluster Invoker、Directory、Router 和 LoadBalance 等。 集群工作过程可分为两个阶段,第一个阶段是在服务消费者初始化期间,集群 Cluster 实现类为服务消费者创建 Cluster Invoker 实例,即上图中的 merge 操作。第二

weixin_41018580的博客 2514

Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些?

Dubbo面试 - dubbo 负载均衡策略和集群容错策略都有哪些? 面试题 dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 面试官心理分析 继续深问吧,这些都是用 dubbo 必须知道的一些东西,你得知道基本原理,知道序列化是什么协议,还得知道具体用 dubbo 的时候,如何负载均衡,如何高可用,如何动态代理。 说白了,就是看你对 dubbo 熟悉不...

YunWisdom 1036

Dubbo集群容错与负载均衡策略

一、 Dubbo集群容错策略概述当我们进行系统设计时候,不仅要考虑正常逻辑下代码该如何走,还要考虑异常情况下代码逻辑应该怎么走。当服务消费方调用服务提供方的服务出现错误时候,Dubbo ...

技术原始积累 389

dubbo集群容错

为了避免单点故障,现在的应用通常至少会部署在两台服务器上。对于一些负载比较高的服务,会部署更多的服务器。这样, 在同一环境下的服务提供者数量会大于1。对于服务消费者来说,同一环境下出现了多个服务提供者。这时会出现一个问题, 服务消费者需要决定选择哪个服务提供者进行调用。另外服务调用失败时的处理措施也是需要考虑的,是重试呢,还是抛出异常,亦或是只打印异常等。为了处理这些问题,Dubbo 定义了集群接...

qq_24095055的博客 611
上一篇: Spring Data JPA渐进式学习--Repostory
下一篇: 爆了,阿里架构师手写MySQL数据库指南,带你轻松年入百万
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值