热点参数限流与系统自适应限流

开课吧樵夫2022-01-11 16:55

  热点参数限流指的是,在流控规则中指定对某参数的 QPS,当所有对该资源的请求 URL中携带有指定参数的请求QPS 达到了阈值,则发生限流。

  复制 consumer-nacos-sentinel-degrade 工程,重命名为 consumer-paramflow。在PetsController处理器中添加如下两个方法:

/**
 * 热点参数限流 * @param id * @param name * @return
 */
@GetMapping("/complux")
@SentinelResource(value = "paramFlowRule", fallback = "getCompluxFallback")
public String getCompluxHandle(Integer id, String name) {
    return "complux : " + id + " , " + name;
}

//降级处理方法 
public String getCompluxFallback(Integer id, String name) {
    return "complux Fallback : " + id + " , " + name;
}

  在启动了消费者工程后,再设置 Sentinel 控制台。

热点参数限流与系统自适应限流

  参数例外项

  参数例外项是指,对于热点参数中某个或某些特殊值单独设置规则。参数类型仅支持基本数据类型或其对应的包装类型,及String类型。

  直接在consumer-paramflow工程上进行修改,在启动类中添加如下代码:

package com.javafamily;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

import java.util.ArrayList;
import java.util.List;

// 配置开启feign
@EnableFeignClients
@SpringBootApplication
public class ParamflowConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ParamflowConsumerApplication.class, args);
        initRule();
    }

    // 初始化规则
    public static void initRule() {
        List<ParamFlowRule> rules = new ArrayList<>();
        ParamFlowRule rule = ParamflowConsumerApplication.paramFlowRule();
        rules.add(rule);
        ParamFlowRuleManager.loadRules(rules);
    }

    //配置热点参数限流
    private static ParamFlowRule paramFlowRule() {
        ParamFlowRule rule = new ParamFlowRule();
        rule.setResource("/complux");
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule.setLimitApp("default");
        rule.setCount(2);
        rule.setParamIdx(1);
        rule.setDurationInSec(10);
        List<ParamFlowItem> items = new ArrayList<>();
        items.add(nameParamItem("human", 100));
        items.add(nameParamItem("administrative", 100));
        rule.setParamFlowItemList(items);
        return rule;
    }

    //创建参数流控对象
    private static ParamFlowItem nameParamItem(String paramValue, int count) {
        ParamFlowItem item = new ParamFlowItem();
        item.setClassType(String.class.getName());
        item.setObject(String.valueOf(paramValue));
        item.setCount(count);
        return item;
    }
}

  系统自适应限流

  Sentinel 系统自适应限流对应用级别入口流量进行整体控制,结合应用的 Load、CPU 使用率、平均RT、入口 QPS 和入口并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。由于该限流方式中阈值的设置需要很多系统软硬件相关的数据,而与代码关系不大,所以这种限流方式一般是由运维来设置的。

  系统规则目前支持五种模式:

热点参数限流与系统自适应限流

  系统负载 Load

  该模式仅对Linux/Unix-like 系统生效。当系统 CPU 最近一分钟的负载量load1 超过了设置的阈值时会触发系统保护,即对再来的请求进行限流处理。这个阈值就是系统负载容量,系统容量可以由maxQps *minRt 估算得出。不过,也可以通过 CPU cores * 2.5 计算出其参考数值。

  CPU 使用率

  当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。

  平均响应时间 RT

  当对当前应用上所有入口流量的平均RT 达到阈值时触发系统保护,单位是毫秒。

  并发线程数

  当对当前应用的所有入口流量进行处理的所有线程数量达到阈值时触发系统保护。

  入口 QPS

  当对当前应用的所有入口流量的总 QPS 达到阈值时触发系统保护。

  gitee:

  https://gitee.com/javainfamily/spring-cloud-alibaba

  以上就是开课吧小编为大家整理发布的“热点参数限流与系统自适应限流”一文,更多相关内容尽在开课吧广场Java教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论(共 1 条评论)
登录 后可发表观点…
发表
  • 。。。
    很详细
    2022-01-11 18:29:34
高并发编程训练营