【Spring Cloud】服务容错中间件Sentinel进阶——五大规则

news2024/12/28 18:57:40

文章目录

  • Sentinel的概念和功能
    • 基本概念
      • 资源
      • 规则
    • 重要功能
      • 流量控制
      • 熔断降级
      • 系统负载保护
  • SentineI 规则
    • 流控规则
      • 简单配置
      • 配置流控模式
        • 直接流控模式
        • 关联流控模式
        • 链路流控模式
      • 配置流控效果
    • 熔断规则
      • 慢调用比例
      • 异常比例
      • 异常数
    • 热点规则
      • 热点规则简单使用
      • 热点规则增强使用
    • 授权规则
    • 系统规则
      • 扩展:自定义异常返回
  • 总结

我们在上一篇文章中对 Sentinel 已经有了基本的了解,接下来,我们一起对它的进阶进行学习吧!

Sentinel的概念和功能

基本概念

资源

所谓资源就是 Sentinel 要保护的东西,资源是 Sentinel 的关键概念。它可以是Java应用程序中的任何内容,可以是一个服务,也可以是一个方法,甚至可以是一段代码。

我们入门案例中的 message1 方法就可以认为是一个资源。

规则

规则就是用来定义如何进行保护资源的。规则作用在资源之上,定义以什么样的方式保护资源,主要包括流量控制规则、熔断降级规则以及系统保护规则

我们入门案例中就是为 message1 资源设置了一种流控规则,限制了进入message1的流量。

重要功能

在这里插入图片描述

Sentinel 的主要功能就是容错,主要体现为:

流量控制

流量控制在网络传输中是一个常用的概念,它用于调整网络包的数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状。

熔断降级

当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障。

Sentinel对这个问题采取了两种手段:

  • 通过并发线程数进行限制:Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
  • 通过响应时间对资源进行降级:除了对并发线程数进行控制以外, Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

Sentinel和Hystrix对熔断降级处理的区别
两者的原则是一致的,都是当一个资源出现问题时,让其快速失败,不要波及到其它服务。但是在限制的手段上,却采取了完全不一样的方法:

  • Hystrix 采用的是线程池隔离的方式,优点是做到了资源之间的隔离,缺点是增加了线程切换的成本。
  • Sentinel 采用的是通过并发线程的数量和响应时间来对资源做限制。

系统负载保护

Sentinel 同时提供系统维度的自适应保护能力。当系统负载较高的时候,如果还持续让请求进入可能会导致系统崩溃,无法响应。

在集群环境下,会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候, Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

总之一句话:我们需要做的事情,就是在 Sentinel 的资源上配置各种各样的规则,来实现各种容错的功能。

SentineI 规则

流控规则

流量控制,其原理是监控应用流量的QPS(每秒查询率)或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。

点击簇点链路,我们就可以看到访问过的接口地址,然后点击对应的流控按钮,进入流控规则配置页面。新增流控规则界面如下:
在这里插入图片描述

  1. 资源名:唯一名称,默认是请求路径,可自定义。
  2. 针对来源:指定对哪个微服务进行限流,默认指default,意思是不区分来源,全部限制。
  3. 阈值类型单机阈值:
    • QPS(每秒请求数量):当调用该接口的QPS达到阈值的时候,进行限流;
    • 线程数:当调用该接口的线程数达到阈值的时候,进行限流;
  4. 是否集群:暂不需要集群。

接下来我们以QPS为例来研究限流规则的配置。

简单配置

我们先做一个简单配置,设置阈值类型为QPS,单机阈值为3。即每秒请求量大于3的时候开始限流。接下来,在流控规则页面就可以看到这个配置。

在这里插入图片描述

配置流控模式

点击上面设置流控规则的编辑按钮,然后在编辑页面点击高级选项,会看到有流控模式一栏

在这里插入图片描述

sentinel 共有三种流控模式,分别是:

  • 直接(默认):接口达到限流条件时,开启限流。
  • 关联:当关联的资源达到限流条件时,开启限流(适合做应用让步)。
  • 链路:当从某个接口过来的资源达到限流条件时,开启限流。

下面呢分别演示三种模式:

直接流控模式

直接流控模式是最简单的模式,当指定的接口达到限流条件时开启限流。上面案例使用的就是直接流控模式。

关联流控模式

关联流控模式指的是,当指定接口关联的接口达到限流条件时,开启对指定接口开启限流。

第1步:配置限流规则,将流控模式设置为关联,关联资源设置为的 /order/message2

在这里插入图片描述

第2步:通过 Apache JMeter 软件向 /order/message2 连续发送请求,注意QPS一定要大于3

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

第3步:通过浏览器访问/order/message1,会发现已经被限流

在这里插入图片描述

链路流控模式

链路流控模式指的是,当从某个接口过来的资源达到限流条件时,开启限流。它的功能有点类似于【针对来源配置项】,区别在于:针对来源是针对上级微服务,而链路流控是针对上级接口,也就是说它的粒度更细。

第1步:编写一个Service,在里面添加一个方法 message

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, ShopOrder> implements IOrderService {

    @Override
    @SentinelResource("message")
    public void message() {
        System.out.println("message");
    }
}

第2步:在Controller中声明两个方法,分别调用service中的方法message

@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController3 {

    @Autowired
    private IOrderService orderService;

    @RequestMapping("/message1")
    public String message1() {
        orderService.message();
        return"message1";
    }
    @RequestMapping("/message2")
    public String message2() {
        orderService.message();
        return"message2";
    }
}

第3步:禁止收敛URL的入口context

从1.6.3版本开始,SentinelWebFluxFilter默认收敛所有URL的入口context,因此链路限流不生效。

1.7.0版本开始(对应SCA的2.1.1.RELEASE),官方在CommonFilter引入了WEB_CONTEXT_UNIFY参数,用于控制是否收敛 context 。将其配置为 false 即可根据不同的URL 进行链路限流。

SCA 2.1.1.RELEASE之后的版本,可以通过配置spring.cloud.sentinel.web-context-unify=false即可关闭收敛。我们当前使用的版本是Spring Cloud Alibaba 2.1.0.RELEASE,无法实现链路限流。

目前官方还未发布SCA 2.1.2.RELEASE,所以我们只能使用2.1.1.RELEASE,需要写代码的形式实现
(1)暂时将Spring Cloud Alibaba的版本调整为2.1.1.RELEASE,如果引入的依赖加了版本号也记得改一下

<spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version>
<dependency>
   <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

(2)配置文件中关闭 sentinel 的 CommonFilter 实例化

spring:
  cloud:
    sentinel:
      filter:
        enabled: false

(3)添加一个配置类,自己构建CommonFilter实例

@Configuration
public class FilterContextConfig {

    @Bean
    public FilterRegistrationBean sentinelFilterRegistration(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new CommonFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        //入口资源关闭聚合
        filterRegistrationBean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY,"false");
        filterRegistrationBean.setName("sentinelFilter");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}

第4步:控制台配置限流规则

在这里插入图片描述

第5步:分别通过/order/message1/order/message2访问,发现2没问题,1的被限流了

在这里插入图片描述

配置流控效果

  • 快速失败(默认):直接失败,抛出异常,不做任何额外的处理,是最简单的效果。
  • Warm Up:它从开始阈值到最大QPS阈值会有一个缓冲阶段,一开始的阈值是最大QPS阈值的1/3,然后慢慢增长,直到最大阈值,适用于将突然增大的流量转换为缓步增长的场景。
  • 排队等待:让请求以均匀的速度通过,单机阈值为每秒通过数量,其余的排队等待;它还会让设置一个超时时间,当请求超过超时时间还未处理,则会被丢弃。

熔断规则

熔断规则就是设置当满足什么条件的时候,对服务进行熔断。Sentinel提供了三个衡量条件

慢调用比例

在1000ms内,请求至少有10个的情况下,出现了大于等于10%的请求调用时间大于100毫秒,则在3秒内会自动熔断,触发降级。

在这里插入图片描述

参数解释:

  • 最大RT:调用接口的最大时间。
  • 比例阈值:超过了最大RT调用时间的请求的比例。
  • 熔断时长:触发熔断后,熔断的时间。
  • 最小请求数据:每秒最少的请求数量,只有大于等于这个数量,才会触发熔断策略。
  • 统计时长:时间窗口的概念。

注意 Sentinel 默认统计的RT上限是 4900 ms,超出此阈值的都会算作4900ms,若需要变更此上限可以通过启动配置项-Dcsp.sentinel.statistic.max.rt=xxx来配置。

异常比例

如图所示,即/order/message2接口,在1000ms内,请求至少有5个的情况下,出现了大于等于10%的请求抛出了异常,则在3秒内会自动熔断,触发降级。

在这里插入图片描述

第1步:首先模拟一个异常

int i = 0;
@RequestMapping("/message2")
public String message2() {
    i++;
    if(i%3==0){
        throw new RuntimeException();
    }
    return"message2";
}

第2步:设置异常比例为0.25

在这里插入图片描述
不想用 Apache JMeter 进行测试的小伙伴,可以直接使用 Apifox 进行测试,首先选中左侧tab中的【自动化测试】,然后选择【添加测试场景】

在这里插入图片描述
【添加步骤】选择【添加自定义请求】

在这里插入图片描述
添加自己的请求,保存并返回,在右侧设置好运行参数,然后点击【运行】按钮。

在这里插入图片描述
此时再在浏览器去访问/order4/message2接口就会出现Blocked by Sentinel (flow limiting)信息。

异常数

在一秒内,请求至少有5个的情况下,出现了大于等于一个的请求抛出了异常,则在3秒内会自动熔断,触发降级。

在这里插入图片描述

热点规则

热点参数流控规则是一种更细粒度的流控规则,它允许将规则具体到参数上。

热点规则简单使用

  1. 编写代码
@RequestMapping("/message3")
//注意这里必须使用这个注解标识,否则热点规则不生效
@SentinelResource("message3")
public String message3(String name,String age) {
    return name + age;
}
  1. 配置热点规则

在这里插入图片描述

  1. 分别用两个参数访问,会发现只对第一个参数限流了

在这里插入图片描述

热点规则增强使用

【参数例外项】允许对一个参数的具体值进行流控。编辑刚才定义的规则,增加【参数例外项】

在这里插入图片描述

参数值为zha,限流阈值为10,这样当访问路径上第一个参数name的值为zha时,在一秒(统计窗口时长)内访问超过10次(单机阈值)才会发生限流,如果第一个参数name的值不是zha时,限流的阈值还是1,如果不带参数name不会触发限流,注意指定的参数类型要与方法的参数类型保持一致。

授权规则

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用Sentinel的来源访问控制的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过:

  • 若配置白名单,则只有请求来源位于白名单内时才可通过;
  • 若配置黑名单,则请求来源位于黑名单时不通过,其余的请求通过。

在这里插入图片描述

上面的资源名和授权类型不难理解,但是流控应用怎么填写呢?

其实这个位置要填写的是来源标识,Sentinel 提供了 RequestOriginParser 接口来处理来源。只要 Sentinel 保护的接口资源被访问,Sentinel 就会调用 RequestOriginParser 的实现类去解析访问来源。

  1. 自定义来源处理规则
@Service
public class RequestOriginParserDefinition implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        String serviceName = httpServletRequest.getParameter("serviceName");
        return serviceName;
    }
}
  1. 授权规则配置
    这个配置的意思是只有serviceName=pc不能访问(黑名单)

在这里插入图片描述

  1. 访问
    访问 http://localhost:8091/order4/message1?serviceName=pc 返回Blocked by Sentinel (flow limiting)

系统规则

系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口QPS、CPU使用率和线程数五个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量(进入应用的流量)生效。

  • Load (仅对Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps*minRt 计算得出。设定参考值一般是 CPU cores*2.5
  • RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。
  • CPU使用率:当单台机器上所有入口流量的CPU使用率达到阈值即触发系统保护。

扩展:自定义异常返回

@Component
public class ExceptionHandlerPage implements UrlBlockHandler {
    @Override
    public void blocked(HttpServletRequest httpServletRequest,
                        HttpServletResponse httpServletResponse,
                        //BlockException 异常接口,包含Sentinel的五个异常
                        // @SentinelResource 用于定义资源,并提供可选的异常处理和fallback 配置项。其主要参数如下:
                        // FlowException 限流异常
                        // DegradeException 降级异常
                        // ParamFlowException 参数限流异常
                        // AuthorityException 授权异常
                        // SystemBlockException 系统负载异常
                        BlockException e) throws IOException {
        httpServletResponse.setContentType("application/json;charset=utf-8");
        ResponseData data = null;
        if(e instanceof FlowException) {
            data = new ResponseData(-1, "接口被限流了…");
        }else if (e instanceof DegradeException){
            data= new ResponseData(-2, "接口被降级了…");
        }
        httpServletResponse.getWriter().write(JSON.toJSONString(data));
    }
}


@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResponseData {
    private int code;
    private String message;
}

总结

到这儿,服务容错中间件Sentinel的概念和功能以及五大规则就已经介绍完了。下一篇将为大家带来容错组件 Sentinel 的规则持久化的文章,敬请期待吧!

后续的文章,我们将继续完善我们的微服务系统,集成更多的Alibaba组件。想要了解更多JAVA后端知识,请点击文末名片与我交流吧。留下您的一键三连,让我们在这个寒冷的东西互相温暖吧!

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

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

相关文章

请编写函数fun,该函数的功能是:移动字符串中的内容,移动的规则如下:把第1到第m个字符,平移到字符串的最后,把第m+l到最后的字符移到字符串的前部。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

Ai-WB2 系列模组SDK接入亚马逊

文章目录 前言一、准备二、亚马逊云物模型建立1. 注册亚马逊账号&#xff0c;登录AWS IoT控制台&#xff0c;[注册地址](https://aws.amazon.com/cn/)2. 创建好之后点击登录3. 创建物品以及下载证书 三、连接亚马逊云demo获取以及配置1. 下载源码2. 按照顺序执行下面指令3. 修改…

2024接口自动化测试高频面试题【建议收藏】

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b;以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格式…

buuctf——[CISCN2019 华北赛区 Day2 Web1]Hack World

buuctf——[CISCN2019 华北赛区 Day2 Web1]Hack World 1.根据提示&#xff0c;说明flag在表里 2.那就猜测存在sql注入&#xff0c;反手测试一波id1 3.尝试使用1--进行注释 4.直接丢进salmap里吧&#xff0c;不出意外多半是跑不出来 5.直接放入fuzz里进行测试 6.发现当我…

Springboot 结合PDF上传到OSS

目录 一、首先注册阿里云OSS&#xff08;新用户免费使用3个月&#xff09; 二、步骤 2.1 将pdf模板上传到oos 2.2 这里有pdf地址,将读写权限设置为共工读 ​编辑 三、代码 3.1 pom.xml 3.2 配置文件 3.3 oss model 3.4 配置类(不需要修改) 3.5 将配置类放入ioc容器 3.…

Linux之rocky8操作系统安装

一、rocky系统简介 CentOS宣布停止开发后&#xff0c;CentOS的原创始人Gregory Kurtzer在CentOS网站上发表评论宣布&#xff0c;他将再次启动一个项目以实现CentOS的最初目标。它的名字被选为对早期CentOS联合创始人Rocky McGaugh的致敬。rocky系统一个开源、社区拥有和管理、免…

VForm3的文件上传方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

快排非递归与计数排序

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 收入专栏:初阶数据结构_LaNzikinh篮子的博客-CSDN博客 文章目录 前言一.快速排序非递归二.数据结构栈与内存栈…

“电子商务”的红利还能存在多久?我想抖音回答了这个问题

哈喽~我是电商月月 互联网的发展有目共睹&#xff0c;网上交易&#xff0c;电子支付已经遍及每个人身边&#xff0c;两者结合&#xff0c;特别是电商行业&#xff0c;利用这个时期真的赚的盆满钵满 每年都有大批商家涌入电商这个赛道&#xff0c;但发展了那么多年&#xff0c…

B端界面:除了蓝色外,四条搞定清新明快的界面设计。

一、什么是清新明快风格 清新明快的设计风格是指在B端系统中使用明亮、清淡的色彩、简洁的布局和自然元素&#xff0c;以及轻快的动效&#xff0c;营造出轻松、愉悦的界面氛围。 二、哪些行业适用 这种设计风格适用于多个行业&#xff0c;特别是那些与创意、娱乐、健康、旅游…

Python turtle海龟绘制美国队长盾牌

使用Python中的turtle模块绘制美队盾牌 具体思路如下&#xff1a; 导入海龟库第1个圆&#xff1a;半径 200&#xff0c;红色填充第2个圆&#xff1a;半径 150&#xff0c;白色填充第3个圆&#xff1a;半径 100&#xff0c;红色填充第4个圆&#xff1a;半径 50&#xff0c;蓝色…

动态Web项目讲解+Demo

web流程演示 请求路径 请求路径明确要请求的是哪个servlet 请求方式 servlet含有两种请求方式&#xff1a;doGet和doPost doGet&doPost 返回数据就是httpResponse&#xff0c;返回给success 参数 包含在request当中 成功 上述流程任何一步都没出问题&#xff0c;就会…

Java学习笔记26(枚举和注解)

1.枚举和注解 1.1 枚举 ​ 1.枚举(enumeration) ​ 2.枚举是一组常量的集合 ​ 3.枚举属于一种特殊的类&#xff0c;里面只包含一组有限的特定的对象 1.枚举应用案例 ​ 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读 ​ 2.对枚举对象/属性使用final st…

完成学校官网页面制作

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>教务系统</title> <style> .wap{ margin:0 auto; width:955px; } .top{ height:150px; padding-left:85px; …

【PCI】PCIe EP标准配置空间(十)

本文参考PCIe协议 5.0&#xff1a;https://download.csdn.net/download/zz2633105/89204842 PCIe配置空间 EP标准配置空间 Vendor ID Register (Offset 00h) PCIe设备厂商ID&#xff0c;比如Intel的Vendor ID通常是0x8086。需要注意的是&#xff0c;厂商的ID不是厂商随意定的…

人人可拥有刘强东同款数字人分身!

每个人都可以拥有东哥同款数字人分身直播间进行直播带货&#xff0c;怎样克隆自己的数字人形象&#xff1f; 青否数字人克隆源码的克隆效果媲美真人&#xff1a; 仅需将真人录制的2-6分钟视频上传至克隆端后台&#xff0c;系统便会自动启动自动克隆。3-5小时后&#xff0c;即可…

Python从0到100(十五):函数的高级应用

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

地图图源#ESRI ArcGIS XYZ Tiles系列(TMS)

目录 1、前言 2、地图图源网址 2.1、Satellite 卫星图源 2.2、Terrain 地形图源 2.3、Street 路网/标注图源 2.4、Specifity 特色设计图源 3、专业推荐”穿搭“ 4、图源配置下载及使用 图源名称图层类别特别注意谷歌 Google①地形 ②影像 ③矢量及标注 ④特色图源国内大…

迭代加深搜索(图的路径查找)

目录 概念 优点 缺点 如何剪枝&#xff08;八数码&#xff09; 剪枝策略&#xff1a; 深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09; 深度优先搜索&#xff08;DFS&#xff09; 广度优先搜索&#xff08;BFS&#xff09; 比较 应…

Facebook账号运营要用什么IP?

众所周知&#xff0c;Facebook封号大多数情况都是因为IP的原因。Facebook对于用户账号有严格的IP要求和限制&#xff0c;以维护平台的稳定性和安全性。在这种背景下&#xff0c;海外IP代理成为了一种有效的解决方案&#xff0c;帮助用户避免检测&#xff0c;更加快捷安全地进行…