Dubbo服务降级

news2025/2/24 0:14:14

Dubbo服务降级

1. 为什么需要服务降级

RPC 是解决分布式系统通信问题的一大利器,而分布式系统的一大特点就是高并发,所以说 RPC 也会面临高并发的场景。在这样的情况下,我们提供服务的每个服务节点就都可能由于访问量过大而引起一系列的问题,比如业务处理耗时过长、CPU 飘高、频繁 Full GC 以及服务进程直接宕机等等。但是在生产环境中,我们要保证服务的稳定性和高可用性,这时我们就需要业务进行自我保护,从而保证在高访问量、高并发的场景下,应用系统依然稳定,服务依然高可用。

2. 服务端的自我保护

先说个结论,服务端自我保护的方式就是限流,包括服务端的限流和客户端的限流。

也就是说,如果某个服务节点的负载压力高,那么就让该服务节点不再接收太多的服务请求就好。等接收和处理的请求数量下来后,这个节点的负载压力自然就下来了。

简单来说,就是让刚启动的服务提供方应用不承担全部的流量,而是让它被调用的次数随着时间的移动慢慢增加,最终让流量缓和地增加到跟已经运行一段时间后的水平一样。

如下:

在这里插入图片描述

Dubbo限流的方式

Dubbo 中的并发控制

样例 1

限制 com.foo.BarService 的每个方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:

<dubbo:service interface="com.foo.BarService" executes="10" />

样例 2

限制 com.foo.BarService 的 sayHello 方法,服务器端并发执行(或占用线程池线程数)不能超过 10 个:

<dubbo:service interface="com.foo.BarService">
    <dubbo:method name="sayHello" executes="10" />
</dubbo:service>

样例 3

限制 com.foo.BarService 的每个方法,每客户端并发执行(或占用连接的请求数)不能超过 10 个:

<dubbo:service interface="com.foo.BarService" actives="10" />
连接控制

样例1 服务端连接控制

限制服务器端接受的连接不能超过 10 个:

<dubbo:provider protocol="dubbo" accepts="10" />

样例2 客户端连接控制

限制客户端服务使用连接不能超过 10 个 2:

<dubbo:reference interface="com.foo.BarService" connections="10" />

Dubbo限流源码分析

通过以上的分析,我们知道在Dubbo可以通过多种的方式进行服务端的限流。实际上,上面的每一种限流的逻辑都是
一个个Filter,所有的Filter会连接成一个过滤器链,每次请求都会经过整个链路中的每一个Filter。后面会出一篇文章详细介绍Dubbo Filter了,这里就不再展开了。

3. 调用端的自我保护

熔断

以上分析了服务端的自我保护,那么调用端是否也需要进行自我保护呢?答案是肯定的。

举个例子。

有服务A, 服务B, 服务C 三个服务方。它们之间存在如下的调用链关系:

服务A -> 服务B -> 服务C。

也就是服务A 依赖于服务B,服务B依赖于服务C。当一个服务 A 来调用服务 B 时,服务 B 的业务逻辑调用服务 C,而这时服务 C 响应超时了,由于服务 B 依赖服务 C,C 超时直接导致 B 的业务逻辑一直等待,而这个时候服务 A 在频繁地调用服务 B,服务 B 就可能会因为堆积大量的请求而导致服务宕机。

如下图所示:

在这里插入图片描述

所以说,在一个服务作为调用端调用另外一个服务时,为了防止被调用的服务出现问题而影响到作为调用端的这个服务,这个服务也需要进行自我保护。而最有效的自我保护方式就是熔断。

在这里插入图片描述

关于熔断,可以看下面的这篇文章:

熔断

但是Dubbo中主要是通过Dubbo Mock来实现的,不能说是真正的熔断。

Dubbo Mock配置

  1. 服务消费者注册url的mock属性

可以通过服务降级功能临时屏蔽某个出错的非关键服务,并定义降级后的返回策略。

向注册中心写入动态配置覆盖规则:

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));

其中:

  • mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。

  • 还可以改为 mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。

  1. @DubboReference注解或者dubbo:reference标签的mock属性

这个标签的作用主要是用于本地伪装。比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。

例子:
mock=“return null”,即当服务提供者出现异常(宕机或者业务异常),则返回null给服务消费者。

public class HelloController{
    
    @DubboReference(check = false,lazy = true,retries = 1,mock = "return null")
    private DubboServiceOne dubboServiceOne;
    
    //.....
}

MockClusterInvoker源码分析

com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker ,实现 Invoker 接口,MockClusterWrapper 对应的 Invoker 实现类。

  1. 构造方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rcj4NxkQ-1673527805154)(https://tva1.sinaimg.cn/large/008i3skNgy1gqs6y28rt4j31p60nodkd.jpg)]

  1. invoke

在这里插入图片描述
在这里插入图片描述

从上面的源码分析可知:

  • 在 MockClusterInvoker#invoke 方法里面,如果是业务异常是不会做 mock 做处理的。而其他关于 RPC 的异常,是会做 mock 处理的,例如我们这里拿来测试的服务提供者超时异常和服务提供者不存在;

  • 在 doMockInvoke 方法中,首先会调用 selectMockInvoker 方法会尝试获取 MockInvoker,而默认情况下,都是没有的,所以最后会使用 Dubbo 提供的 MockInvoker。

4. 总结

通过以上的分析,我们可以知道,服务端主要是通过限流来进行自我保护。而调用端主要是通过熔断来进行自我保护。

5. 鸣谢

RPC核心实战与原理

Dubbo服务熔断与降级的深入讲解&代码实战

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Chrome浏览器插件推荐【第一期】

1、Tampermonkey Tampermonkey&#xff08;油猴&#xff09;是一款免费的浏览器扩展和最为流行的用户脚本管理器&#xff0c;它适用于 Chrome, Microsoft Edge, Safari, Opera Next, 和 Firefox。虽然有些受支持的浏览器拥有原生的用户脚本支持&#xff0c;但 Tampermonkey 将在…

Webpack的应用

处理css文件 总共有src目录下的index.css和index.js、同根的index.html和webpack.config.js文件&#xff0c;然后npm init之后生成package.json文件&#xff0c;npm install后生成package-lock.json文件&#xff0c;最后npm run webpack之后有dist目录下各种文件 index.js i…

nodejs使JWT(全)

Token token表示令牌&#xff0c;用户的登录凭证。 基于 Token 的身份验证方法&#xff0c;使用基于 Token 的身份验证方法&#xff0c;在服务端不需要存储用户的登录记录。大概的流程是这样的&#xff1a; 客户端使用用户名跟密码请求登录服务端收到请求&#xff0c;去验证…

css动画效果之transform

transformTransform属性应用于元素的2D或3D转换。这个属性允许你将元素旋转&#xff0c;缩放&#xff0c;移动&#xff0c;倾斜等。旋转rotate、扭曲skew、移动translate、缩放scale、矩阵变形matrix属性名扩展写法属性含义none定义不进行转换。rotaterotateX()&#xff08;3D写…

rabbitmq+netcore6 【5】Topics:主题

文章目录1&#xff09;前言2&#xff09;Topic exchange 主题交换机3&#xff09;举例4&#xff09;总结5&#xff09;综合以上代码准备工作生产者消费者1消费者2结果验证官网参考链接&#xff1a; https://www.rabbitmq.com/tutorials/tutorial-five-dotnet.html其他人的翻译版…

臻图信息搭建智慧水务管理平台,保障供水安全运行

伴随着城市智慧化进程&#xff0c;供水系统也在朝着高度集成化、数字化、智能化的管理模式发展。在2022年&#xff0c;水利部也印发了相关水务保障规划&#xff0c;对供水工程的建设、运行管理、水源保护等管理提出了明确要求&#xff0c;采取物联网、互联网等措施&#xff0c;…

从“以旧换新”送手机看年礼消费新风尚

千门万户曈曈日&#xff0c;总把新桃换旧符。每年的春节&#xff0c;都是中国人辞旧迎新的重要时刻。在新春年礼的选择上&#xff0c;曾经的“烟酒糖茶”老四样正在逐渐被其他新潮年礼所替代&#xff0c;手机等诸多科技好物被纳入到送年礼清单。手机年货很“潮”&#xff0c;让…

Redis整理合集

SQL和NOSQL的区别?SQLNOSQL数据结构结构化非结构化数据关联关联的非关联的查询方式SQL查询非SQL查询事物特性ACID&#xff08;事务&#xff09;BASE存储方式磁盘内存扩展性垂直水平使用场景数据结构固定相对业务对数据的安全性一致性需求较高数据结构不固定对一致性、安全性需…

论文投稿指南——中文核心期刊推荐(地质学 2)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【性能优化】Mybatis Plus:优化查询速度 - SQL替换Service

优化查询速度 - SQL替换Service Service 接口问题 下面是原先的 Service 实现类代码&#xff0c;有门店 ID、订单状态、查询时间段&#xff0c;然后查出了所有的结果&#xff0c;继续使用 java8 的特性获取汇总结果&#xff0c;随着项目的推移&#xff0c;数据量越来越大&…

Webpack 中使用source map 在开发过程中进行调试

我们都知道webpack在打包的时候会将源代码打包成一个bundle文件&#xff0c;bundle文件就是经过了loader转换&#xff0c;还有webpack的一些插件处理&#xff0c;以及webpack构建过程中的一些转换&#xff0c;最后会生成一个大的JS文件&#xff0c;直接去看这个文件是没法调试的…

【React】一.React基本使用

目录 基本介绍 一.React基本使用 安装命令 使用方法 记录问题 使用React脚手架初始化项目 基本介绍 构建用户界面的js库用户界面可以理解为html页面&#xff08;前端&#xff09;react主要用来写html页面或者构建web应用只负责视图层&#xff08;V&#xff09;的渲染。&am…

【ROS2 入门】虚拟机环境 ubuntu 18.04 ROS2 安装

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;做为有别于ROS1的版本&#xff0c;做了很多更新和改变&#xff0c;我还是很期待自己逐步去探索ROS2中的惊喜。在安装过程中我也遇到的一些坑&a…

阿里云服务器安装wireshark图形界面与远程连接配置(使用tigervnc)

tags: Server Ubuntu Wireshark 写在前面 昨天折腾了一下透视HTTP协议这门课的实验环境, 通过阿里云的轻量应用服务器来完成了, 但是还差一步, 那就是wireshark的安装, 虽然通过apt安装好了, 但是打不开实在是烦人, 后来经过各种搜索, 我发现问题出在了tightvnc上, 这个vnc服…

vue2中swiper6不能正常使用的解决

第一步安装swiper6 第二步在main.js中引入swiper6 注意&#xff1a;也可以在其他地方引入&#xff0c;但是在main.js中引入&#xff0c;所有的组件都能用swiper的样式 样式的引入&#xff0c;不是平常的引入&#xff0c;引入代码如下 注意&#xff1a;一定要这样引入样式 …

【自学Python】Python比较运算符

Python比较运算符 Python比较运算符教程 在 Python 中&#xff0c;比较运算符的结果都是 bool 型&#xff0c;也就是要么是 True&#xff0c;要么是 False。关系表达式经常用在 if 结构的条件中或 循环结构 的条件中。 Python比较运算符语法 比较运算符功能说明>大于如果…

正则表达式表单校验实例

描述 一个简单的注册页面&#xff0c;对输入框进行了简单的正则表达式校验 代码 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><link rel"stylesheet" href"css/index2.css" …

深入思考 Schema 管理的几个基本问题

本文作者&#xff1a;王大龙&#xff0c;数据分析领域资深工程师&#xff0c;观远产品中一切数据的风暴降生之主&#xff0c;元数据世界的精神领袖&#xff0c;数据治理的永恒守望者。前言我发现理解某一个具体「事物」最好的方式是先去理解其背后所遵循的「范式」。范式是一个…

java-Spring集成定时器使用方法

文章目录定时器配置文件测试文件配置参数说明SpringBoot集成schedulepom.xml文件启动类运行结果定时器配置文件 spring核心配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans:beans xmlns:xsi"http://www.w3.org/2001/XMLSchema-in…

python笔记之转义问题 字符串前缀 正则表达式

Python的字符串自己也用\转义 s ABC\\-001 # Python的字符串 # 对应的正则表达式字符串变成&#xff1a; # ABC\-001建议使用Python的r前缀&#xff0c;就不用考虑转义的问题了 s rABC\-001 # Python的字符串 # 对应的正则表达式字符串不变&#xff1a; # ABC\-001关于斜杠…