【SpringCloudAlibaba】Sentinel熔断限流工具的使用

一、前言

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。

Sentinel 的历史:

  • 2012 年,Sentinel 诞生,主要功能为入口流量控制。
  • 2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
  • 2018 年,Sentinel 开源,并持续演进。
  • 2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。
  • 2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
  • 2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。
  • 2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由/调度、流量染色、流控降级、过载保护/实例摘除等;同时社区将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。

                                                                       --以上来自Sentinel官方文档;introduction | Sentinel

二、Sentinel 基本概念

1、资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

2、规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

三、在Linux下安装 Sentinel

1、安装包下载

https://github.com/alibaba/Sentinel/releases

2、拷贝到Linux服务器上并启动服务

 启动命令:(指定端口号 8849)

nohup java -Dserver.port=8849 -Dcsp.sentinel.dashboard.server=localhost:8849 -Dproject.name=sentinel-dashboard -jar /home/springcloud/sentinel-dashboard-1.7.0.jar &

浏览器登录sentinel前端页面,地址:IP:8849

 【注】访问失败的解决方法:

  • 查看 8849 端口号是否开放:firewall-cmd --query-port=8849/tcp
  • 打开端口:firewall-cmd --zone=public --add-port=8849/tcp --permanent
  • 重启防火墙:firewall-cmd --reload

3、重新登录,用户名密码都是 sentinel

 四、Springcloud 整合 Sentinel

1、pom.xml中引入依赖包

        <properties>
        <java.version>8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring.boot.version>2.3.2.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR9</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.1.RELEASE</spring.cloud.alibaba.version>
        </properties>



       <!-- sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>${spring.cloud.alibaba.version}</version>
        </dependency>

2、在application.yml中添加配置,指定Sentinel的服务地址

spring:
  cloud:
    sentinel:
      transport:
        dashboard: 192.168.1.233:8849

3、创建测试接口

package com.example.springclouduser.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/queryUserInfoById/{userId}")
    public String queryUserInfoById(@PathVariable Long userId) {
         return "接口名:[queryUserInfoById] 调用成功,用户ID:" + userId;
    }

}

4、浏览器调用接口,在 Sentienl 的簇点链路中就会显示

 到此,证明本地已经和 Sentinel 服务连接上了。

五、Sentinel各个功能的使用

1、流控规则

  • 资源名:唯一名称,默认请求路径。
  • 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)。
  • 阈值类型/单机阈值
  •        QPS:每秒钟的请求数量,当调用该API的QPS达到阈值的时候,进行限流。                           线程数:当调用该API的线程数达到阈值的时候,进行限流。
  • 是否集群:不需要集群
  • 流控模式
  •        直接:API达到限流条件时,直接限流。
           关联:当关联的资源达到阈值时,就限流当前资源。
           链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【API级别的针对来源】。
  • 流控效果
  •        快速失败:直接失败,抛出异常
           Warm up:根据Code Factor的值(冷加载因子,默认3),从阈值/code Factor,经过预热时长,才达到设置的QPS阈值。
           排队等待:匀速排队,让请求以匀速通过,阈值类型必须设置为QPS,否则无效。

1.1 QPS + 直接 + 快速失败

当接口 /user/queryUserInfoById 每秒访问数超过3个,直接报错。

测试结果:

当 QPS 超过阈值,报错:

 1.2 QPS + 关联 + 快速失败

当关联的资源 /user/secondMethod 接口每秒访问数超过3个,会使 /user/queryUserInfoById  接口限流。

测试流程:

(1)使用 Jmeter 压测工具,每秒钟并发发送四个请求

此时 接口 /user/secondMethod 的 QPS 阈值超过 3,再访问接口 /user/queryUserInfoById 时被限流:

1.3 QPS + 链路 + 快速失败

只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就可以限流)[api级别的针对来源]

/user/queryUserInfoById 接口属于 sentinel_spring_web_context 链路下,因为入口资源填写 sentinel_spring_web_context。

再次访问 /user/queryUserInfoById 接口发现被限流:

1.4 QPS + 直接 + Warm Up

请求QPS从设定的阈值/3开始,经预热时长逐渐升至设定的QPS阈值

如下图所示,QPS开始时为 3/coldFactor = 3/3 = 1 (冷因子coldFactor默认为3)

经过5秒后,QPS 达到最终设定的阈值3。

1.5 QPS + 直接 + 排队等待

接口 queryUserInfoById 每秒访问1次,多余的请求排队等待,之后匀速访问接口,超时时间为2秒。

为接口queryUserInfoById加上日志,查看日志打印,是否相隔1秒后调用。

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/queryUserInfoById/{userId}")
    public String queryUserInfoById(@PathVariable Long userId) {
         String message = "接口名:[queryUserInfoById] 调用成功,用户ID:" + userId;
         log.info("当前线程:[{}]", Thread.currentThread().getName());
         return message;
    }

}

 测试结果:

 以上每种模式的例子只找了一种,感兴趣的同学可以试试其他的模式;


2、降级规则

2.1 RT:平均响应时间

当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。如果接下来 1s 内持续进入 5 个请求(即 QPS >= 5),它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。

【注】RT默认最大4900ms,超过此阈值的也会算作 4900ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置

测试过程:

(1)创建降级规则:当RT= 3000ms,时间窗口为 5s 。

(2)修改接口,添加 6s的响应时间

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/queryUserInfoById/{userId}")
    public String queryUserInfoById(@PathVariable Long userId) {
        try {
            Thread.sleep(6000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String message = "接口名:[queryUserInfoById] 调用成功,用户ID:" + userId;
         log.info("当前线程:[{}]", Thread.currentThread().getName());
         return message;
    }
}

(3)jmeter模拟每秒10个请求的并发环境,调用接口,发现接口返回报错:Blocked by Sentinel(flow limiting)

(4)注释掉响应时间6s,同样使用jmeter调用接口,发现接口返回正常。

 2.2 异常比例

当资源的每秒异常总数占通过量的比值超过阈值(阈值范围是 [0.0, 1.0],代表 0% - 100%。)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。

2.3 异常数

当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

3、热点规则

热点规则限流只支持 QPS 模式,也只有 QPS模式下才叫热点;

参数索引:调用方法所传参数的索引,0代表第一个参数,1代表第二个参数,以此类推;

单机阈值以及统计窗口时长表示在此窗口时间内,访问数超过阈值数量就触发限流。

4、系统规则

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

    系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

    系统规则支持以下的模式:

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt估算得出。设定参考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【docker】修改docker的数据目录

背景 主节点是分配了较少内存和存储的低配机器&#xff0c;因为我们系统的rancher是用docker镜像启动的&#xff0c;而rancher和docker的默认目录都放在/var/lib下面&#xff0c;而这个/var目录目前只分配10G的存储&#xff0c;导致节点存储报警。因此想修改docker的数据目录&…

Ubuntu 18.04配置NFS服务器以及配置时遇到NFS问题

1.安装相关软件 sudo apt-get install nfs-kernel-server sudo apt-get install nfs-common 2.配置共享目录 2.1修改exports文件 sudo vi /etc/exports在最后添加如下并保存退出 /home/xiaowu/nfs 192.168.31*(rw,sync,no_root_squash,no_subtree_check) /home/xiaowu/nfs…

半夜三更的,Proxmox VE集群的ceph OSD磁盘挂了

这几天centreon监控频频报警&#xff0c;提示ceph pg 错误&#xff0c;用 ceph health detail 确定不一致的pgs&#xff0c;然后用指令 ceph pg repair pg_num 进行修复&#xff0c;通过查看系统日志&#xff0c;有IO错误&#xff0c;修复一次&#xff0c;能管半天&#xff0c;…

【Qt之Quick模块】1. 概述及Quick应用程序创建流程

概述 Qt的Quick模块是用于创建现代化、动态和响应式用户界面的工具集。它是基于QML&#xff08;Qt Meta-Object Language&#xff09;和JavaScript的。 QML是一种声明性的语言&#xff0c;用于描述用户界面的结构和行为。它使用层叠样式表&#xff08;CSS&#xff09;的语法来…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近维护一个老项目时遇到的问题。说起这老项目我就有点头疼&#xff0c;一个快十年前的项目&#xff0c;这么说你可能不觉得有什么&#xff0c;但是你想想Swift也才发布不到十年&#xff08;2014年6月发布&#xff0…

OpenCV-8RGB和BGR颜色空间

一. RGB和BGR 最常见的色彩空间就是RGB&#xff0c;人眼也是基于RGB的色彩空间去分辨颜色。 OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同。 二.HSV, HSL和YUV 1.HSV(HSB) OpenCV用的最多的色彩空间是HSV. Hue&#xff1a;色相&…

Android-----AndroidManifests.xml 之meta-data

一、概念 meta-data&#xff1a;元数据、文件元数据。主要用来定义一些组件相关的配置值。 metadata是一组供父组件使用的名值对&#xff08;name-value pair&#xff09;&#xff0c;一个组件元素可以包含任意数量的meta-data子元素。这些子元素的值存放在一个 Bundle 对象中…

汽车UDS诊断——SecureDataTransmission 加密数据传输(0x84)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的84服务SecureDataTransmission,在常规诊断通信中,数据极易被第三方获取,所以在一些特殊的数据传输时,标准定义了加密数据传输的服务。 简而言之,就是在发送诊断数据时,发送方先把数…

svn 安装

安装系统 ubuntu 22 安装命令&#xff1a; sudo apt-get install subversion 创建第一个工程&#xff1a; 创建版本库、项目 1、先创建svn根目录文件夹 sudo mkdir /home/svn 2、创建项目的目录文件夹 sudo mkdir /home/svn/demo_0 svnadmin create /home/svn/demo_0 配置&a…

C#拼接JSON

一、业务背景 最近项目需要与U8c对接&#xff0c;实现增删改查&#xff0c;借此机会&#xff0c;梳理一下C#解析Json字符串的问题。 这篇文章&#xff0c;先以新增接口为例。 二、新增接口 查看需要传入的json格式。 拼接json&#xff0c;无非就是{}和[]的来回嵌套。 首先&am…

数据可视化(附带操作实例)

一、主要目的&#xff1a; 数据可视化是关于图形或表格的数据展示&#xff0c;旨在借助图形化手段&#xff0c;清晰有效的传达与沟通信息。通过直观地传达关键内容与特征&#xff0c;从而实现对相当稀疏而又复杂的数据集的深入洞察。熟悉在Python开发环境中支持数据可视化环节…

【基础篇】1.2 认识STM32(二)

3.3 VREF/VREF-引脚 VREF和VREF-是STM32中用于提供参考电压的引脚。如下图&#xff1a; VREF引脚可以连接一个单独的外部参考电压&#xff0c;范围在2.0V&#xff5e;VDDA&#xff0c;但不能超过VDDA&#xff0c;否则就超过了模拟器件的最大供电电压。在100引脚的封装中&#…

微服务实战系列之ZooKeeper(实践篇)

前言 关于ZooKeeper&#xff0c;博主已完整的通过庖丁解牛式的“解法”&#xff0c;完成了概述。我想掌握了这些基础原理和概念后&#xff0c;工作的问题自然迎刃而解&#xff0c;甚至offer也可能手到擒来&#xff0c;真实一举两得&#xff0c;美极了。 为了更有直观的体验&a…

分布式链路追踪 —— 基于Dubbo的traceId追踪传递

文章目录 原文链接RpcContext 上下文对象Dubbo 过滤器&#xff08;Filter&#xff09;对象基于Dubbo的traceId追踪传递实现 原文链接 RpcContext 上下文对象 在实现 Dubbo 调用之间的链路跟踪之前&#xff0c;先简单了解 RpcContext 上下文对象和 Filter 过滤器对象&#xff…

vue使用xlsx和xlsx-style导出xlsx文件并修改样式

1.下载依赖 npm install xlsx --save npm install file-saver --save npm install xlsx-style --save2.先修改xlsx-style的源码&#xff0c;一旦引入xlsx-style则会报错 在\node_modules\xlsx-style\dist\cpexcel.js 807行 的 var cpt require(’./cpt’ ‘able’); 改成 v…

接口测试的工具(3)----postman+node.js+newman

1.安装newman&#xff1a;输入命令之后 一定注意 什么都不要操作 静静的等待结束就行了。 2.安装失败的对此尝试不行 在用下面的方法 解压一下就行了 3.验证是否成功 多次尝试是可以在线安装成功的

开发企业展示小程序的关键步骤和技巧

随着移动互联网的快速发展&#xff0c;小程序已经成为企业展示形象、推广产品和服务的重要工具。拥有一个优秀的小程序可以帮助企业提高品牌知名度&#xff0c;吸引更多潜在客户&#xff0c;提升用户体验。以下是拥有一个展示小程序的步骤&#xff1a; 确定需求和目标 首先&am…

21、同济、微软亚研院、西安电子科技大提出HPT:层次化提示调优,独属于提示学习的[安妮海瑟薇]

前言&#xff1a; 本论文由同济大学、微软亚洲研究院、西安电子科技大学&#xff0c;于2023年12月11日中了AAAI2024 论文&#xff1a; 《Learning Hierarchical Prompt with Structured Linguistic Knowledge for Vision-Language Models》 地址&#xff1a; [2312.06323]…

操作系统习题

操作系统习题 一&#xff0e;选择题二&#xff0e;判断题三&#xff0e;PV操作题 学习完操作系统以后也要做题巩固一下&#xff0c;下面是我收集到的一些题目&#xff0c;如有问题欢迎大家一起讨论&#xff01; 题目较多&#xff0c;可以选择自己需要的来做&#xff0c;答案仅供…

干货教学!!!RHEL8中ansible中常用模块的使用

内容很长各位大老爷耐心观看 本章主要介绍ansible中最常见模块的使用 文件管理模块软件包管理模块服务管理模块磁盘管理模块用户管理模块防火墙管理模块 ansible的基本用法如下 ansible 机器名 -m 模块x -a “模块的参数” 对被管理机器执行不同的操作&#xff0c;只需要调…