第十二章 Spring Cloud Alibaba Sentinel

简介: 第十二章 Spring Cloud Alibaba Sentinel

前言


Sentinel 是由阿里巴巴中间件团队开发的开源项目,是一种面向分布式微服务架构的轻量级高可用流量控制组件。
Sentinel 主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度帮助用户保护服务的稳定性。


1、简介


Sentinel 主要由以下两个部分组成:

  • Sentinel 核心库:Sentinel 的核心库不依赖任何框架或库,能够运行于 Java 8 及以上的版本的运行时环境中,同时对 Spring Cloud、Dubbo 等微服务框架提供了很好的支持。
  • Sentinel 控制台(Dashboard):Sentinel 提供的一个轻量级的开源控制台,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。


1.1、基本概念


Sentinel 的基本概念有两个,它们分别是:资源和规则。

基本概念 描述
资源 资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如由应用程序提供的服务或者是服务里的方法,甚至可以是一段代码。

我们可以通过 Sentinel 提供的 API 来定义一个资源,使其能够被 Sentinel 保护起来。通常情况下,我们可以使用方法名、URL 甚至是服务名来作为资源名来描述某个资源。 |

| 规则 | 围绕资源而设定的规则。Sentinel 支持流量控制、熔断降级、系统保护、来源访问控制和热点参数等多种规则,所有这些规则都可以动态实时调整。 |


2、Sentinel控制台


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

放到D:盘的sentinel目录里面,并将其启动

java -jar sentinel-dashboard-1.8.5.jar

启动后,访问地址:http://localhost:8080/

用户名和密码:sentinel/sentinel


3、Sentinel开发流程


引进sentinel依赖 -> 定义资源 -> 定义规则 -> 校验规则


3.1、 app-api消费端工程引进依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.0.4.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.5</version>
</dependency>


3.1.1、yml新加配置(跟nacos同级)

sentinel:
  transport:
    #配置 Sentinel dashboard 地址
    dashboard: localhost:8080
    #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
    port: 8719


3.2、定义资源


  • 适配主流框架自动定义资源
  • 注解方式定义资源 (推荐)

@SentinelResource(value=“user-userInfoList”)

@SentinelResource(value = "tiger-test",blockHandler = "userInfoListBlockHandler")
public List<UserInfo> userInfoList(){
    return this.userService.userInfoList();
}

public List<UserInfo>   userInfoListBlockHandler(BlockException blockException){
    log.info("#########################################userInfoListBlockHandler");
    return null;
}


3.3、定义规则


3.3.1、流量控制

属性 说明 默认值
资源名 流控规则的作用对象。 -
阈值 流控的阈值。 -
阈值类型 流控阈值的类型,包括 QPS 或并发线程数。 QPS
针对来源 流控针对的调用来源。 default,表示不区分调用来源
流控模式 调用关系限流策略,包括直接、链路和关联。 直接
流控效果 流控效果(直接拒绝、Warm Up、匀速排队),不支持按调用关系限流。 直接拒绝


3.3.2、流控模式


  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流

使用场景:

a、两个有竞争关系的资源

b、一个优先级较高,一个优先级较低

  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
    例如有两条请求链路:
  • /test1 --> /common
  • /test2 --> /common

说明:Sentinel默认会将Controller方法做context整合,导致链路模式的流控失效,需要修改application.yml,添加配置:

spring:
  cloud:
    sentinel:
      web-context-unify: false # 关闭context整合


3.3.3、流控效果


快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。

排队等待:让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长


当请求超过QPS阈值时,快速失败和warm up

会拒绝新的请求并抛出异常。而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout =

2000,意味着预期等待超过2000ms的请求会被拒绝并抛出异常

打开命令行窗口,执行以下命令查看资源的实时统计信息。

curl http://localhost:8719/cnode?id=userInfolist

idx id                thread    pass      blocked   success    total    aRt   1m-pass   1m-block   1m-all   exceptio
2   userInfoList      0        0.0       0.0       0.0        0.0      0.0   10        16         26       0.0

实时统计信息各列名说明如下:


  • thread: 代表当前处理该资源的并发数;
  • pass: 代表一秒内到来到的请求;
  • blocked: 代表一秒内被流量控制的请求数量;
  • success: 代表一秒内成功处理完的请求;
  • total: 代表到一秒内到来的请求以及被阻止的请求总和;
  • RT: 代表一秒内该资源的平均响应时间;
  • 1m-pass: 则是一分钟内到来的请求;
  • 1m-block: 则是一分钟内被阻止的请求;
  • 1m-all: 则是一分钟内到来的请求和被阻止的请求的总和;
  • exception: 则是一秒内业务本身异常的总和


3.3.4、熔断降级


Sentinel 的熔断将机制会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),暂时切断对这个资源的调用,以避免局部不稳定因素导致整个系统的雪崩。

Sentinel 提供了 3 种熔断策略

熔断策略 说明
慢调用比例(SLOW_REQUEST_RATIO)
异常比例 (ERROR_RATIO) 当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目且异常的比例大于阈值,则在接下来的熔断时长内请求会自动被熔断。

经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。 |

| 异常数 (ERROR_COUNT) | 当单位统计时长内的异常数目超过阈值之后会自动进行熔断。


经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。 |

状态 说明 触发条件
熔断关闭状态(CLOSED)

处于关闭状态时,请求可以正常调用资源。

满足以下任意条件,Sentinel 熔断器进入熔断关闭状态:
- 全部请求访问成功。
- 单位统计时长(statIntervalMs)内请求数目小于设置的最小请求数目。
- 未达到熔断标准,例如服务超时比例、异常数、异常比例未达到阈值。
- 处于探测恢复状态时,下一个请求访问成功。

熔断开启状态 (OPEN)

处于熔断开启状态时,熔断器会一定的时间(规定的熔断时长)内,暂时切断所有请求对该资源的调用,并调用相应的降级逻辑使请求快速失败避免系统崩溃。

满足以下任意条件,Sentinel 熔断器进入熔断开启状态:

- 单位统计时长内请求数目大于设置的最小请求数目,且已达到熔断标准,例如请求超时比例、异常数、异常比例达到阈值。

- 处于探测恢复状态时,下一个请求访问失败。

探测恢复状态(HALF-OPEN)

处于探测恢复状态时,Sentinel 熔断器会允许一个请求调用资源。则若接下来的一个请求成功完成(没有错误)则结束熔断,熔断器进入熔断关闭(CLOSED)状态;否则会再次被熔断,熔断器进入熔断开启(OPEN)状态。

在熔断开启一段时间(降级窗口时间或熔断时长,单位为 s)后,Sentinel 熔断器自动会进入探测恢复状态。

Sentinel 熔断规则属性

属性 说明 默认值 使用范围
资源名 规则的作用对象。 - 所有熔断策略
熔断策略 Sentinel 支持3 中熔断策略:慢调用比例、异常比例、异常数策略。 慢调用比例 所有熔断策略
最大 RT 请求的最大相应时间,请求的响应时间大于该值则统计为慢调用。 - 慢调用比例
熔断时长 熔断开启状态持续的时间,超过该时间熔断器会切换为探测恢复状态(HALF-OPEN),单位为 s。 - 所有熔断策略
最小请求数 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)。 5 所有熔断策略
统计时长 熔断触发需要统计的时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)。 1000 ms 所有熔断策略
比例阈值 分为慢调用比例阈值和异常比例阈值,即慢调用或异常调用占所有请求的百分比,取值范围 [0.0,1.0]。 - 慢调用比例 、异常比例
异常数 请求或调用发生的异常的数量。 - 异常数


3.3.5、通过Nacos配置规则

[
    {
        "resource": "tiger-test",
        "limitApp": "default",
        "grade": 1,
        "count": 5,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]

limitApp:来源应用;

  • 流控规则
  • 熔断规则

    (注:没有RT这个参数哈)
[
    {
        "resource": "user-userInfoList",
        "grade": 0,
        "limitApp": "default",
        "count":2000,
        "slowRatioThreshold": 0.6,
        "timeWindow": 60,
        "minRequestAmount": 5,
        "statIntervalMs":8000,
        "clusterMode": false
    }
]

工程配置读取nacos的限流规则(在sentinel底下,跟web-context-unify同级)


spring:
  cloud:
    sentinel:
      web-context-unify: false # 关闭context整合
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            data-id: user-sentinel
            group-id: DEFAULT_GROUP
            rule-type: flow
/**
     * flow.
     */
    FLOW("flow", FlowRule.class),
    /**
     * degrade.
     */
    DEGRADE("degrade", DegradeRule.class),
    /**
     * param flow.
     */
    PARAM_FLOW("param-flow", ParamFlowRule.class),
    /**
     * system.
     */
    SYSTEM("system", SystemRule.class),
    /**
     * authority.
     */
    AUTHORITY("authority", AuthorityRule.class),

配置多个nacos配置文件

spring:
  cloud:
    sentinel:
      web-context-unify: false # 关闭context整合
      datasource:    
         ds1:
           nacos:
             server-addr: localhost:8848
             data-id: user-sentinel-flow
             group-id: DEFAULT_GROUP
             rule-type: flow
         ds2:
           nacos:
             server-addr: localhost:8848
             data-id: user-sentinel-degrade
             group-id: DEFAULT_GROUP
             rule-type: degrade


4、Sentinel与Gateway的整合


4.1、添加依赖

<!--gateway整合sentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
    <version>2021.0.4.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.5</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
    <version>1.8.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.0.4.0</version>
</dependency>
sentinel:
  transport:
    # 配置Sentinel dashboard地址
    dashboard: localhost:8080
    # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
    port: 8719

4.2、详细配置


接下来对sentinel控制台中对gateway网关链路的流控配置项做详细的介绍,下图所示都是针对网关api附加的。

API类型

我们可以根据某个路由进行流控,也可以根据API分组进行流控,也就是请求访问地址来进行流控

首先创建API分组

选择API分组

然后在进行相应的流控规则。

针对请求属性

参数属性有五种:客户端ip、远程请求地址、请求头、请求url参数、Cookie

这里其实也就是对应的gateway中路由的匹配规则

匹配模式提供了三种:精确、子串、正则

子串匹配模式就是:我们指定127,它会自动再结尾加上%进行模糊匹配——127%

Client IP

测试

Remote Host

因为我们没有远程域名,所以这里就不进行测试了

Header

使用postman请求进行测试,如果请求头不为这个值就不会被限流

URL参数

测试

间隔

这个间隔的意思就是,以前1秒钟请求三次就会抛异常,而现在是两秒内请求三次才会抛异常,也就是说间隔从以前的一秒改变了。

Burst size

Burst size相当于是一个宽容次数,以前是1秒钟请求三次就会报异常,现在会宽容1次,也就是一秒钟请求大于三次才会抛异常

网关流控规则 GatewayFlowRule 的核心属性如下:

① resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route。

② resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称。

③ grade:限流指标维度,同限流规则的 grade 字段

④ count:限流阈值

⑤ intervalSec:统计时间窗口,单位是秒,默认是 1 秒

⑥ controlBehavior:流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败。

⑦ burst:应对突发请求时额外允许的请求数目。

⑧ maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。

⑨ paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段:

parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。

fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称。

pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。

matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)。


降级规则

(resource、grade、count、slowRatioThreshold、timeWindow、minRequestAmount、statIntervalMs)

自定义异常返回结果:

sentinel:  
  scg:
    fallback:
      mode: response
      response-status: 200
      response-body: '{"code":"500","message": "系统忙,请稍候再试"}'

代码实现:

/**
 * 熔断、降级回调
 */
@Configuration
public class SentinelGatewayConfig {
    /**
     * 这里可以写降级逻辑
     */
    public SentinelGatewayConfig() {
        GatewayCallbackManager.setBlockHandler(new BlockRequestHandler() {
            // 网关限制了请求,就会调用此回调 Mono Flux
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                ResponseDTO<Object> objectResponseDTO = new ResponseDTO<>();
                objectResponseDTO.setCode(500);
                objectResponseDTO.setMessage("系统异常,请稍候重试");
                String errJson = JSON.toJSONString(objectResponseDTO);
                Mono<ServerResponse> body = ServerResponse.ok().body(Mono.just(errJson), String.class);
                return body;
            }
        });
    }
}

将路由、限流、降级规则持久化到nacos配置中心

spring:
  application:
    name: gateway-service
  profiles:
    #开发环境dev,测试环境test,生产环境prod
    active: dev
  jackson:
    time-zone: GMT+8
  cloud:
    loadbalancer:
      ribbon:
        enabled: false
    nacos:
      discovery:
        server-addr: localhost:8848  #Nacos server 的地址
      #路由配置
      config:
        server-addr: localhost:8848
        name: gateway-router
        namespace: public
        group: DEFAULT_GROUP
        #file-extension: json #指定yaml格式的配置
        refresh-enabled: true #支持刷新
    #限流熔断配置
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
        port: 8719
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            data-id: user-sentinel
            group-id: DEFAULT_GROUP
            rule-type: flow
相关文章
|
11天前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
2月前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
60 1
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
6天前
|
Java 数据中心 Sentinel
spring boot sentinel 的使用
要实现Spring Boot集成Sentinel的熔断降级,需引入Sentinel依赖并配置Dashboard地址;使用`@SentinelResource`注解定义受保护资源及blockHandler处理降级逻辑;通过Sentinel Dashboard配置熔断规则,如异常比例或响应时间。启动应用后,测试熔断功能,确保Sentinel正常工作。建议动态调整规则以提升系统稳定性。
|
12天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
560 7
|
2月前
|
人工智能 前端开发 Java
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
本文介绍了如何使用 **Spring Cloud Alibaba AI** 构建基于 Spring Boot 和 uni-app 的聊天机器人应用。主要内容包括:Spring Cloud Alibaba AI 的概念与功能,使用前的准备工作(如 JDK 17+、Spring Boot 3.0+ 及通义 API-KEY),详细实操步骤(涵盖前后端开发工具、组件选择、功能分析及关键代码示例)。最终展示了如何成功实现具备基本聊天功能的 AI 应用,帮助读者快速搭建智能聊天系统并探索更多高级功能。
600 2
【实操】Spring Cloud Alibaba AI,阿里AI这不得玩一下(含前后端源码)
|
22天前
|
监控 Java Nacos
SpringCloud基础5——微服务保护、Sentinel
sentinel、雪崩问题、流量控制、隔离和降级、授权规则、规则持久化
SpringCloud基础5——微服务保护、Sentinel
|
9天前
|
人工智能 前端开发 Java
Spring Cloud Alibaba AI,阿里AI这不得玩一下
🏀闪亮主角: 大家好,我是JavaDog程序狗。今天分享Spring Cloud Alibaba AI,基于Spring AI并提供阿里云通义大模型的Java AI应用。本狗用SpringBoot+uniapp+uview2对接Spring Cloud Alibaba AI,带你打造聊天小AI。 📘故事背景: 🎁获取源码: 关注公众号“JavaDog程序狗”,发送“alibaba-ai”即可获取源码。 🎯主要目标:
17 0
|
2月前
|
缓存 NoSQL Java
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
Spring Cache 是 Spring 提供的简易缓存方案,支持本地与 Redis 缓存。通过添加 `spring-boot-starter-data-redis` 和 `spring-boot-starter-cache` 依赖,并使用 `@EnableCaching` 开启缓存功能。JetCache 由阿里开源,功能更丰富,支持多级缓存和异步 API,通过引入 `jetcache-starter-redis` 依赖并配置 YAML 文件启用。Layering Cache 则提供分层缓存机制,需引入 `layering-cache-starter` 依赖并使用特定注解实现缓存逻辑。
355 1
SpringBoot的三种缓存技术(Spring Cache、Layering Cache 框架、Alibaba JetCache 框架)
|
2月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
下一篇
无影云桌面