Spring Cloud Alibaba Sentinel 实现熔断与限流

本文详细介绍了阿里巴巴开源的微服务流量控制组件Sentinel,包括核心库与控制台功能,流控规则如关联限流、WarmUp限流、排队等待,降级规则如异常数熔断策略,热点key规则及系统自适应限流策略。同时,提供了@SentinelResource注解的深入解读和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载地址:github.com/alibaba/Sentinel/releases

文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html

Sentinel 分为两个部分:

1.核心库(java客户端)不依赖任何框架/库,能够运行于所有Java运行环境,同时对Dubbo/Spring Cloud等框架由较好的支持。

2.控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用。

 

3.流控规则

    参数解释:

流控模式 -> 关联 :例如A 调用B,当B的QPS达到阈值时,就对A进行限流。以减轻B的压力。

流控效果 -> warm Up: 例如 单机阈值为9 ,预热时间为10,即请求从 9/3(冷加载因子)开始,经预热时长逐渐升至设定的QPS阈值。预热方式就是为了保护系统,可以慢慢将流量放进来,慢慢的把阈值增长到设置的阈值。

 流控效果 -> 排队等待:这种方式主要用于间隔性突发的流量,比如在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

流控规则中资源名可使用 URL 亦可使用 @SentinelResource(value="sentinelresource") 中value属性的值。

 

4.降级规则

Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。

当资源被降级后,在接下来的降级时间窗口内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)

Sentinel熔断器是没有半开状态的。HystrIx 有半开状态。半开状态下,系统会自动检测此时过来的请求是否请求成功,如果成功则关闭断路器,失败则打开断路器

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

选择异常数熔断策略时间窗口一定要设置为大于等于60s

5.热点key规则

参数索引栏传入参数索引,从0开始。当请求带有这个参数时,QPS超过阈值则进行限流,可通过参数例外项指定参数进行限流。

可在代码中通过@SentinelResource注解的blockHandler配置当请求失败后调用的降级方法,该配置仅处理控制台配置的违规情况,不处理代码中出现的运行时异常。

    @GetMapping(value = "test2")
    @SentinelResource(value = "test2", blockHandler = "block_test2", fallback = "fallback_test2")
    String test2() {
        return "test2";
    }

    String block_test2() {
        return "block_test2";
    }

    String fallback_test2() {
        return "fallback_test2";
    }

 

6.系统规则

Sentinel系统自适应限流从整体维度对应用入口流量进行控制,结合应用的Load,CPU使用率,总体平均RT,入口QPS和线程并发数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能地跑在最大吞吐量的同时保证系统整体的稳定性。

这相当于是一个总的配置,可管理系统中所有的url。例如配置入口QPS 阈值为 1,则该系统中所有地址的QPS 阈值都设置为1

7.@SentinelResource 

示例:

@SentinelResource(value = "test2", blockHandlerClass=SentinelBlockHandler .class ,blockHandler = "testHandlerException", fallback = "fallback_test2")

  value :指定该配置的名称,一般是当前方法URL 去掉/

  blockHandlerClass:指定该方法违背限流规则后,在哪个类中去找 blockHandler属性配置的方法名:

  blockHandler:兜底方法名。

例如:

@SentinelResource(value = "test2", blockHandlerClass=SentinelBlockHandler .class ,blockHandler = "testHandlerException")

  例如这个方法的QPS超过配置的阈值后,就回去执行下面那个类中的testHandlerException方法。

public class SentinelBlockHandler {
    public static String testHandlerException() {
        return "这是自定义限流处理方法";
    }
}

当@SentinelResource 配置了blockHandler 属性会使用blockHandler 配置的方法进行限流,没配会返回Sentinel自带的限流处理结果。

@SentinelResource 更多属性解释:

8.服务熔断功能

示例:

@GetMapping("server/port/{id}")
    @SentinelResource(value = "blockHandler",
            blockHandler = "blockHandler",
            blockHandlerClass = SentinelBlockHandler.class,
            fallback = "fallbackHandler",
            fallbackClass = FallbackHandler.class)
    String serverPort(@PathVariable(value = "id") int id) {
        String forObject = restTemplate.getForObject(SERVER_URI + "/payment/nacos/{id}", String.class, id);
        if (id == 4) {
            throw new NullPointerException();
        }
        return forObject;
    }
public class FallbackHandler {
    public static String fallbackHandler(@PathVariable(value = "id") int id, Throwable e) {
        return "this is fallbackHandler," + e.getMessage() + id;
    }
}
public class SentinelBlockHandler {
    public static String blockHandler(@PathVariable(value = "id") int id, BlockException e) {
        return "这是自定义限流处理方法" + e.getMessage() + id;
    }
}

上面的示例表示当 serverPort 方法QPS超过阈值时 调用blockHandler 方法 ,当serverport方法抛出异常时调用fallbackaHandler方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值