手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级

Posted IT挖掘机y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级相关的知识,希望对你有一定的参考价值。

这 种 日 子 该 到 头 了 {这种日子该到头了}

在这里插入图片描述

代码来自:https://blog.csdn.net/Kevinnsm/article/details/117520719?spm=1001.2014.3001.5501
在这里插入图片描述


1 、 为 什 么 要 进 行 服 务 降 级 ? {1、为什么要进行服务降级?} 1

现在的微服务架构是分布式的,由许多服务组成。服务之间的调用是错综复杂的,比如A调B,B调C,C调D等等;一旦某个模块出现了问题,可能就会出现级联效应,最终导致整个链路的不可用是。通过服务降级,将不稳定的服务进行熔断降级,避免整个链路的雪崩。这个降级是配置在客户端!

官网文档地址:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html


2 、 熔 断 策 略 之 慢 调 用 比 例 {2、熔断策略之慢调用比例} 2

慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

以上是官网提供的,经过我的分析需要满足两个条件就会进行服务熔断降级!

1、请求的响应时间大于RT(设置的最大响应时间
2、单位统计时长内请求数目大于最小请求数目

实例分析
在这里插入图片描述
设置最大RT为200ms,意味着一旦请求响应超过这个时间就会被统计为慢调用,如果在统计时长1000ms内慢调用的数量大于了最小请求数5,则会进行服务的熔断降级(熔断时长为2s,过了两秒后会进行进入探测状态,若接下来的一个请求的响应时间小于RT,则结束熔断;否则继续进入熔断状态)

@GetMapping("/good")
    public String good() throws InterruptedException {
        Thread.sleep(1000);
        log.info("---------->"+Thread.currentThread().getName());
        return "good";
    }

设置线程暂停1s,那么由于我上面设置的RT为0.2s,所以每次都会超时。100%会进行熔断降级

使用JMeter进行测试

零基础带你入门JMeter-模拟高并发接口测试,小白教程!:https://blog.csdn.net/Kevinnsm/article/details/117302197?spm=1001.2014.3001.5501

在这里插入图片描述
在这里插入图片描述
开始测试
在这里插入图片描述
由于我设置的是一直循环访问,所以可以得出只要不关闭JMeter,那么/good接口将一直处于熔断状态,怎么得出来呢?同时通过浏览器访问
在这里插入图片描述
当结束JMeter,然后通过浏览器访问
在这里插入图片描述
在这里插入图片描述



3 、 熔 断 策 略 之 异 常 比 例 {3、熔断策略之异常比例} 3

异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

也就是满足两个条件就会发生熔断降级

1、请求数大于设置得最小请求数目
2、异常得比例大于设置得阈值

如下图分析
在这里插入图片描述
当在1000ms统计时长内,如果异常比例大于0.8,且请求数大于5,则进行熔断降级

代码模拟

    @GetMapping("/good")
    public String good() {
        int a = 1 / 0;
        log.info("---------->"+Thread.currentThread().getName());
        return "good";
    }

我 故 意 将 其 1 / 0 报 异 常 ! {我故意将其1/0报异常!} 1/0

使用JMeter测试
在这里插入图片描述
每 次 10 个 请 求 数 , 一 直 循 环 访 问 {每次10个请求数,一直循环访问} 10访
在这里插入图片描述
运行
在这里插入图片描述
从响应数据可以看出已经进入了熔断状态!
循环访问过程中从浏览器进行访问
在这里插入图片描述
当结束JMeter循环访问,然后浏览器访问,发现已经结束了熔断状态!
在这里插入图片描述

4 、 熔 断 策 略 之 异 常 数 {4、熔断策略之异常数} 4

异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

1、单位统计时长内异常数超过设置的异常数阈值
2、请求数大于设置得最小请求数

在这里插入图片描述
如上图所示,在1000ms内,如果异常数大于3,且请求数大于5;则发生熔断降级!

JMeter进行测试,一直循环访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出已经熔断降级,当我停掉JMeter之后,浏览器访问该API报出异常!
在这里插入图片描述
在这里插入图片描述

以上是关于手把手带你领略双十一背后的核心技术Sentinel之服务的熔断降级的主要内容,如果未能解决你的问题,请参考以下文章

手把手带你领略双十一背后的核心组件Sentinel之流控规则

简单几行代码带你快速了解淘宝双十一的强大技术支撑点Sentinel+Nacos

女朋友问阿里双十一实时大屏如何实现,我惊呆一会,马上手把手教她背后的大数据技术

阿里weex校园行,带你领略开发的魅力

揭秘String类型背后的故事——带你领略汇编语言魅力

揭秘String类型背后的故事——带你领略汇编语言魅力