分享

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

 码农9527 2022-01-11

热点参数限流指的是,在流控规则中指定对某参数的 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;
}12345678910111213复制代码类型:[java]

  在启动了消费者工程后,再设置 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;
    }
}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455复制代码类型:[java]

  系统自适应限流

  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:///javainfamily/spring-cloud-alibaba

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多