6

Sentinel流控和降级方案

 2 years ago
source link: https://perkins4j2.github.io/posts/28431/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Sentinel流控和降级方案

发表于

2020-04-14

| 分类于 架构

| 阅读次数:

本文字数: 4.2k

|

阅读时长 ≈ 4 分钟

Sentinel介绍

  • 阿里巴巴中间件,负责流量控制和熔断降级。
  • 适配Spring类框架
  • 可原生开发

引入pom

<sentinel.version>1.7.1</sentinel.version>

<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>${sentinel.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>${sentinel.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>${sentinel.version}</version>
</dependency>
  • sentinel-core核心包
  • sentinel-annotation-aspectj适合spring切面和注解
  • sentinel-transport-simple-http便于接入console控制台

    SpringBoot配置

    @Configuration
    public class SentinelAspectConfiguration {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
    return new SentinelResourceAspect();
    }
    }
  • 负责切面拦截

    @SentinelResource(value = "action")
    public boolean action(String str){
    return "Hi";
    }
  • SentinelResource为Sentinel的注解

  • value为资源标识
@Data
@ToString
public static class Flow {
private String resource;
private int count;
private int grade;
}
  • Flow为自定义的配置文件
  • resource为资源名称
  • count为流控的阈值,线程数或QPS
  • grade流控类型,0-线程,1-QPS

    /**
    * 刷新Flow
    */
    public synchronized void reloadFlow() {
    List<FlowRule> rules = new ArrayList<>(20);

    flows.forEach(e -> {
    if (StringUtils.isEmpty(e.getResource()) || e.getCount() == 0) {
    return;
    }
    log.warn(e.toString());

    FlowRule rule = new FlowRule();
    rule.setResource(e.getResource());
    //qps
    rule.setCount(e.getCount());
    rule.setGrade(e.getGrade());
    rules.add(rule);
    });

    if (rules.size() > 0) {
    FlowRuleManager.loadRules(rules);
    log.warn("Sentinel reloadFlow success!");
    }
    }
  • 导入自定义的流控配置

    @Data
    @ToString
    public static class Degrade {
    private String resource;
    private int count;
    private int grade;
    private int window;
    }
  • Degrade为自定义的降级配置文件

  • resource为资源名称
  • window为降级后持续的窗口时长,平均响应时间-秒、异常百分比-秒或异常数量-秒
  • count为降级的参考指标,qps=5时的平均响应时间(最大为4.9s)、qps>=5时异常百分比或默认1分钟的异常数量
  • grade降级类型,平均响应时间-0、异常百分比-1或异常数量-2

    /**
    * 刷新Degrade
    */
    public synchronized void reloadDegrade() {
    List<DegradeRule> rules = new ArrayList<>(20);

    degrades.forEach(e -> {
    if (StringUtils.isEmpty(e.getResource()) || e.getCount() == 0 || e.getWindow() == 0) {
    return;
    }
    log.warn(e.toString());
    DegradeRule rule = new DegradeRule();
    rule.setResource(e.getResource());
    //rt,ms
    rule.setCount(e.getCount());
    rule.setGrade(e.getGrade());
    //secs
    rule.setTimeWindow(e.getWindow());
    rules.add(rule);
    });

    if (rules.size() > 0) {
    DegradeRuleManager.loadRules(rules);
    log.warn("Sentinel reloadDegrade success!");
    }
    }
  • 导入自定义的流控配置

  • 慎重配置降级策略,若降级,影响范围是window时间内的请求都处于自动降级中

Fallback和BlockHandler

  • Fallback,当异常时的处理策略,即有异常的容错方案;Fallback参数要和业务方法保持一致
  • BlockHandler,被流控或降级时,指定窗口内的降级方案;BlockHandler参数要和业务方法保持一致,同时新增一个BlockException参数
  • sentinel:
    flows[0]: #流控
    resource: action
    count: 1000 #number
    grade: 1 #thread-0,qps-1
    degrades[0]: # 降级
    resource: action
    window: 120 #rt-s,exceptionRatio-s,exceptionCount-s
    count: 100 #rt-art,exceptionRatio-[0.0,1.0],exceptionCount-number
    grade: 2 #RuleConstant:rt-0,exceptionRatio-1,exceptionCount/m-2
  • @SentinelResource(value = "action",fallback = "defaultFallback", blockHandler = "defaultBlockHandler")
    public boolean action(String str){
    return "Hi";
    }
public boolean defaultBlockHandler(String str, BlockException ex){
return "Hi1";
}
public boolean defaultFallback(String str){
return "Hi2";
}
  • 下载源码启动即可
  • 控制台可浏览和配置资源策略,基于内存
  • 建议对接DB或Nacos
  • 集群限流略微复杂,需要注意业务适配度及集群本身对应用的影响
------ 本文结束------

本文标题:Sentinel流控和降级方案

文章作者:Perkins

发布时间:2020年04月14日

原始链接:https://perkins4j2.github.io/posts/28431/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK