分布式微服务 - 3.降级熔断 - 3.Sentinel

news/2024/7/24 11:17:49 标签: 分布式, 微服务, sentinel, 后端, spring cloud

分布式微服务 - 3.降级熔断 - 3.Sentinel

项目示例:

  • 项目示例 - 3.降级熔断 - 2.Sentinel

内容提要:

  • 下载启动
  • 注册、持久化、资源配置
  • 流控、热点、系统规则
  • 熔断、授权

文档:

  • 官网
  • 官网文档
  • github

下载启动

  1. 下载jar包
  2. 在其所在目录中打开命令窗口,输入java -jar jar包名称 启动sentinel dashboard
  3. 浏览器中输入localhost:8080 打开首页,账号和密码皆为sentinel登录(sentinel dashboard默认是懒加载模式,即只有访问过一次微服务接口后,才会在sentinel中显示)

sentinel_22">注册到sentinel

  1. 导入依赖
        <!--Sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. application.yml配置
spring:
  cloud:
    sentinel:
      # 取消控制台懒加载
      eager: true
      transport:
        # 配置sentinel dashboard地址
        dashboard: localhost:8080
        # sentinel客户端启动的端口,默认8719端口(占用时会依次+1找未占用端口)
        port: 8719

持久化配置

sentinel dashboard上配置的规则会存储在sentinel客户端的内存中,因此在微服务重启后,配置的规则会消失。sentinel可以更改数据源,将规则持久化到其他数据源中(以下以nacos为例)。进行持久化配置后,配置规则的流程是:在数据源上修改,之后会自动同步到sentinel并应用于微服务(直接在sentinel dashboard上增删改规则并不会同步到数据源上,因此修改只是临时的,重启微服务后便会丢失)

配置步骤:(涉及配置中心的知识,可结合后续的配置中心nacos知识)

  1. 注册到nacos配置中心(详见后续配置中心的知识)
  2. 引入持久化依赖
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
  1. application.yml配置:rule-type对应sentinel的不同配置,flow 流控、degrade 降级熔断、param-flow 热点、system 系统保护规则、authority 授权
spring:
  cloud:
    sentinel:
      datasource:
        # 配置的数据源名称,可任意起名
        flow:
          # 数据源类型
          nacos:
            # nacos地址
            server-addr: ${spring.cloud.nacos.config.server-addr}
            # 配置文件名称
            data-id: ${spring.application.name}-flow
            # namespace(默认用public命名空间时不需要显示声明)和groupId
            group-id: DEFAULT_GROUP
            data-type: json
            # 读取来的json字符串用于sentinel的哪项配置
            rule-type: flow
  1. nacos配置中心新增配置:在nacos配置列表(对应的namespace)中新建dataId为sentinel-provider-flow(对应上述配置),groupId为DEFAULT_GROUP(对应上述配置),配置格式为json的配置文件。配置文件内容最外层是[] ,内部为多个属性组成的对象{ "key": value }

配置资源

在类或者API方法上用@SentinelResource注解修饰可以配置资源。当资源触发流控降级规则时,抛出BlockException,若有配置blockHandler,则由该Handler处理。fallbackHandler会处理所有异常(包括BlockException)。同时配置blockHandler和fallbackHandler时,前者优先级更高。

通过配置blockHandler和fallbackHandler,可以自定义流控、降级、异常时的返回信息。

注解属性

  • value:自定义资源名,用于sentinel配置规则时区分资源,必需项。
  • blockHandlerClass/blockHandler:blockHandlerClass为函数所在类的Class对象(此时要求函数是static)。blockHandler为函数名字符串,且函数要求满足以下条件:
    • 方法访问范围要求是public
    • 返回类型要求与原方法相同
    • 参数列表要求与原方法相同且最后加一个类型为BlockException的参数(接收异常信息)
  • fallbackClass/fallback:fallbackClass为函数所在类的Class对象(此时要求函数是static)。fallback为函数名字符串,且函数要求满足以下条件:
    • 返回值类型必须与原函数返回值类型一致;
    • 方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
  • exceptionsToIgnore:用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

流量控制(流控)

流量控制(也称流控,同限流)分为对单机微服务请求的控制和对集群微服务请求的控制(倘若只针对集群每个节点配置单机流控,则有可能因为流量不均匀导致单机达到阈值触发流控但集群整体没达到阈值)。

规则因素

  • 资源名[resource]
    • 该限流规则作用的对象
    • String类型值,资源名或者api路径,必须唯一
  • 针对来源[limitApp]
    • 可以只对指定的服务调用者起效
    • String类型值,默认为default,微服务名,default时所有来源都有效
  • 阈值类型[grade]
    • 指定是统计QPS(每秒钟请求数量)还是线程数达到阈值时进行限流
    • 数值类型,0表示线程数、1表示QPS,默认为1
  • 单机阈值[count]
    • 指定阈值大小,达到阈值后触发流控
    • 数值类型
  • 流控模式[strategy]
    • 直接:触发规则后直接限流;关联:关联资源达到本规则的阈值后,限流本资源;链路:对到来的请求筛选,只统计从入口资源到来的流量,达到阈值后,限流本资源(与针对来源相似,但针对来源是微服务级别,该配置项是api级别)。
    • 数值类型,0表示直接、1表示关联、2表示链路,默认为0,关联和链路时需要配置关联/入口资源(否则json配置读取失败)
  • 关联/入口资源[refResource]
    • 流控规则是关联和链路时,配置的资源名
    • String类型值,资源名或者api路径,必须唯一
  • 流控效果[controlBehavior]
    • 快速失败:限流时,直接失败并抛出异常;Warm Up:根据codeFactory(冷加载因子,默认为3)从阈值/codeFactory经预热时长,逐渐达到设置的阈值;排队等待:控制请求间隔,使其匀速到来。
    • 数值类型,0表示快速失败、1表示Warm Up、2表示排队等待,默认为0
  • 预热时长[warmUpPeriodSec]
    • 流控效果为Warm Up时,配置预热时长,单位秒
    • 数值类型,默认为10
  • 超时时间[maxQueueingTimeMs]
    • 流控效果为排队等待时,配置超时时间,单位毫秒
    • 数值类型,默认为500
  • 是否集群[clusterMode]
    • 是否要对集群进行流控
    • 布尔值,false表不对集群进行流控、true表对集群流控,默认为false

降级熔断

无论哪个熔断策略,都要求一个最小请求数目,即在一个统计时长内,请求数量必须大于等于设置的最小请求数目,然后再考虑是否达到其他熔断策略,否则不会触发熔断。

达到熔断策略的条件(即触发熔断),资源被熔断后,接下来的一个熔断时长内请求会自动被熔断。经过熔断时长后,熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求不会触发熔断策略的条件则结束熔断,否则会再次被熔断。

规则因素

  • 资源名[resource]
    • 该熔断规则作用的对象
    • String类型值,资源名或者api路径,必须唯一
  • 熔断策略[grade]
    • 慢调用比例:当一个请求的响应时间大于设置的最大RT时,则统计为慢调用。在设置的一个统计时长内,请求数量大于设置的最小请求数目,且慢调用的比例大于阈值时,触发熔断。
    • 异常比例:在设置的一个统计时长内,请求数量大于设置的最小请求数目,且响应为异常的请求比例大于阈值时,触发熔断
    • 异常数:与异常比例类似,只不过统计的是异常数目,而不是异常比例。
    • 数值类型,0表示慢调用比例、1表示异常比例、2表示异常数,默认为0
  • 最大RT/比例阈值/异常数[count]
    • 慢调用比例时,表示最大RT(Response Time,响应时间),单位毫秒;异常比例时,表示比例(注意:此时范围必须在0.0与1.0之间);异常数时,表示数目。
    • 数值类型,默认为0
  • 比例阈值[slowRatioThreshold]
    • 仅慢调用时有效
    • 数值类型,默认为1,范围必须在0.0与1.0之间
  • 熔断时长[timeWindow]
    • 资源被熔断后,接下来的一个熔断时长内请求会自动被降级。
    • 数值类型,单位为S
  • 最小请求数[minRequestAmount]
    • 在一个统计时长内,请求数量必须大于等于设置的最小请求数目,否则不会触发熔断
    • 数值类型,默认为5
  • 统计时长[statIntervalMs]
    • 熔断策略在一个统计时长内,统计请求是否会触发熔断
    • 数值类型,单位ms,默认为1000

热点参数

热点参数限流可以看做是一种特殊的流量控制,仅对包含指定参数的请求生效。

规则因素

  • 资源名[resource]
    • 该限流规则作用的对象
    • String类型值,注意 必须是资源名 ,必须唯一
  • 参数索引[paramIdx]
    • 资源对应的接口方法中的第几个参数
    • 数值类型,从0开始
  • 单机阈值[count]
    • 指定阈值大小,达到阈值后触发限流
    • 数值类型,默认为0
  • 统计窗口时长[durationInSec]
    • 统计一次的时长
    • 数值类型,单位s,默认为1
  • 是否集群[clusterMode]
    • 是否要对集群进行流控
    • 布尔值,false表不对集群进行流控、true表对集群流控,默认为false
  • 参数例外项[paramFlowItemList]
    • 可对参数的某些特定值单独配置阈值
    • 数组,数组中的每一项是一个对象,对象包含以下属性
      • 参数类型[classType]
        • 参数值的数据类型
        • String类型,仅可选基本类型和字符串类型
      • 限流阈值阈值[count]
        • 指定阈值大小,达到阈值后触发限流
        • 数值类型,默认为0
      • 参数值[object]
        • 要单独配置的参数值
        • 根据参数类型确定值类型

系统规则

对应用级别的入口流量进行控制。是针对应用整体维度的,而不是资源维度的,并且仅对入口流量(进入应用的流量)生效。

授权规则(黑白名单)

根据请求来源来限制资源是否通过。请求来源的判断需要微服务中自定义类实现RequestOriginParser接口和方法,并@Component注入(注意,要考虑request中没有对应key的情况)。

规则因素

  • 资源名[resource]
    • 该熔断规则作用的对象
    • String类型值,资源名或者api路径,必须唯一
  • 流控应用[limitApp]
    • 要控制的来源
    • String类型值,多个来源时用逗号分隔
  • 授权类型[strategy]
    • 名单的类型,若配置白名单,则仅白名单才可通过;若配置黑名单,则黑名单不通过,其余通过。
    • 数值类型,0表示白名单、1表示黑名单,默认为0

http://www.niftyadmin.cn/n/5424268.html

相关文章

Web 常用的 扩展开发框架

当谈到提升浏览器功能和用户体验时&#xff0c;浏览器扩展成了一股强大的力量&#xff0c;备受用户青睐。在众多的Web扩展开发框架中&#xff0c;WXT和Plasmo凭借其丰富的工具和特性&#xff0c;以及简化的开发流程&#xff0c;成为开发者们的首选。在本文中&#xff0c;我们将…

对话Shopify:平台工程如何帮助其自动化应对流量高峰

本文脱胎于 Obeservability Talk&#xff0c;完整内容请查看&#xff1a; https://www.youtube.com/watch?v6ShtsTTUizI 平台工程是近年来的热门话题。我们已经在 2023 年看到了开发人员们对它的追捧&#xff0c;预计在 2024 年后&#xff0c;我们也许会看到平台工程被广泛应用…

命名空间多线程计时(C++基础)

命名空间 不要在头文件内使用using namespace&#xff0c;一定要确保实在一个足够小的作用域下使用&#xff0c;在哪个范围内&#xff0c;比如函数、if语句等&#xff0c;但一定不要在头文件中使用&#xff01;&#xff01;&#xff01; 上述示例中&#xff0c;会调用orange中…

开源模型应用落地-安全合规篇(二)

一、前言 在前面的“业务优化篇系列文章”的学习中,我们学会了如何使用线程池、Redis和向量数据库等工具。现在,我们要加快学习的速度。一方面,我们会继续改进AI服务的性能瓶颈,另一方面,我们还要学习如何进行合规操作。 接下来,我们将学习如何使用腾讯云的内容安全审核来…

PHP立体安全攻击向量:保护应用程序的关键挑战

PHP立体安全攻击向量&#xff1a;保护应用程序的关键挑战 PHP作为一种广泛使用的服务器端脚本语言&#xff0c;拥有庞大的用户群体和丰富的生态系统。然而&#xff0c;随着互联网的发展&#xff0c;网络安全问题也变得愈发严重。本文将深入探讨PHP的立体安全攻击向量&#xff0…

社交创新的先锋:探秘Facebook背后的故事与智慧

起源与初创阶段 Facebook的故事始于2004年&#xff0c;由马克扎克伯格&#xff08;Mark Zuckerberg&#xff09;、埃迪华索伦&#xff08;Eduardo Saverin&#xff09;、安德鲁麦克卡拉姆&#xff08;Andrew McCollum&#xff09;、克里斯休斯&#xff08;Chris Hughes&#x…

搜索与图论——DFS

深度优先搜索&#xff08;DFS&#xff09; 深搜的过程&#xff1a;从根进入&#xff0c;向下走&#xff0c;走到底&#xff0c;向上走&#xff0c;即绕树兜圈&#xff0c;最后从根退出 深搜的实现&#xff1a;深搜是通过系统栈实现的&#xff0c;因为栈满足先进后出的性质&am…

Flink K8S Operator 离线安装

一 推送镜像 docker pull quay.io/jetstack/cert-manager-cainjector:v1.8.2 docker tag quay.io/jetstack/cert-manager-cainjector:v1.8.2 10.177.85.101:8000/flink/cert-manager-cainjector:v1.8.2 docker push 10.177.85.101:8000/flink/cert-manager-cainjector:v1.8.2d…