Alibaba Sentinel 二 :Sentinel流控规则

流控是Sentinel核心功能之一,流控指的是流量控制。

Sentinel的流控操作起来非常简单,在控制台进行配置即可看见效,所见即所得。

名词解释

资源名: 唯一名称,默认是请求路径

针对来源: Sentinel可以针对调用者进行限流,填写微服务的名称,默认是default(不区分来源)

阈值类型/单机阈值:可随时更改,无需重启系统

  • QPS:每秒的请求数量,当调用该api的QPS达到阈值的时候进行限流。
  • 线程数: 当调用该api的线程数达到阈值的时候进行限流。

流控模式:

  • 直接:api达到限流条件时,直接限流
  • 关联:当关联的资源达到限流条件时,限流自己
  • 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】

流控效果:

  • 快速失败:直接失败,抛出异常
  • Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
  • 排队等待:匀速排队,让请求以匀速通过,阈值类型必须设置为QPS

QPS直接失败

配置:每秒钟只能有一个请求。浏览器快速刷新请求,会出现下图的效果

Blocked by Sentinel (flow limiting) 是sentinel提供的默认提示语,表示已经被限流了。提示语的修改,后面会进一步讲解。

线程数直接失败

添加新的配置

新增一个接口进行测试,因为通过线程进行限流,便于演示,所以让线程睡眠了2秒钟。

@GetMapping("/testThreadLimit")
public String testThreadLimit() {
    try {
        Thread.sleep(2000);
    } catch (Exception e){
        e.printStackTrace();
    }
    return "----testThreadLimit";
}

打开两个页面,分别快速请求一次,因为其中一个线程会阻塞2秒钟,所以另一个请求就会被限流。


流控模式-关联

上文提到的名称解释,关联就是:当关联的资源达到限流条件时,限流自己。

举例说明:新增两个接口testA,testB,在控制台中将两个接口进行关联,如果testB访问触发限制条件,testA就不能被访问了。

在实际开发中,比如支付接口正在经历着巨大的访问压力,这个时候对下单的接口进行限流就很有必要了。

1. 新增接口

@GetMapping("/testA")
public String testA() {
    return "----testA";
}

@GetMapping("/testB")
public String testB() {
    return "----testB";
}

2. sentinel添加规则

3. 为了持续对testB接口进行访问,我使用postman进行模拟。

4. 当使用postman进行访问testB时,浏览器访问testA,会发现访问testA返回的是限流的信息。等postman访问结束后,再次访问testB,就会发现恢复正常了。

流控效果-Warm Up(预热)

上图是配置的效果图。期望单机每秒限制12次的访问,但是由于预热初始化为3,也就是说5秒后,由每秒3次转化成每秒12次的限制。

实际操作的效果:不停的请求,刚开始会出现限流信息,慢慢的,达到5秒钟后,如果你无法在1秒内请求12次,就无法触发限流规则了。

流控效果-排队等待

排队等待就是在不超时的前提下,按照单机阈值进行执行。

如上图所示,如果一瞬间有10个请求过来,系统会一秒钟处理一个请求。testA稍加修改

@GetMapping("/testA")
public String testA() {
    System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "  ------" + Thread.currentThread().getName());
    return "----testA";
}

使用postman进行测试

得到的结果如下:

 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sentinel 是一款开源的分布式系统防护组件,主要用于服务的流量控制、熔断降级和系统负载保护等。Sentinel 提供了一种基于注解和 API 的自定义限流方式。 自定义限流的主要步骤如下: 1. 定义资源名:在 Sentinel 中,资源是需要受到限流保护的对象。可以使用 `@SentinelResource` 注解来定义资源名。 ```java @SentinelResource(value = "myResource", blockHandler = "handleBlock") public void myMethod() { // 方法逻辑 } // 定义限流规则 private void handleBlock(BlockException ex) { // 处理限流逻辑 } ``` 2. 配置限流规则:通过 Sentinel Dashboard 或者代码方式配置限流规则,即设置每个资源的 QPS 阈值、流控模式等。 3. 触发限流:当资源的访问量超过限流规则中的阈值时,Sentinel 会触发限流,执行 blockHandler 中定义的逻辑。 以上是基于注解的方式,如果希望基于 API 进行自定义限流,可以使用 Sentinel 提供的 `SphU` 和 `Tracer` 等类进行手动埋点和统计。例如: ```java // 定义资源名 String resourceName = "myResource"; // 手动埋点 Entry entry = null; try { entry = SphU.entry(resourceName); // 执行业务逻辑 } catch (BlockException ex) { // 处理限流逻辑 } finally { if (entry != null) { entry.exit(); } } // 手动统计指标 Tracer.traceCount(resourceName, 1); ``` 通过自定义限流,可以灵活地根据业务需要对不同的资源进行限流保护,提高系统的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值