Spring Cloud Alibaba 限流与熔断 — Sentinel 限流入门案例

前面我们降解了Netflix 的限流与熔断组件Hystrix,了解了熔断与限流的基本概念与Hystrix的基本使用方式,本篇我们介绍Alibaba开源的熔断限流组件Sentinel。Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。

限流在网络传输中是一个常用的概念,它用于调整网络包的发送数据。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量(请求)进行控制。Sentinel 可以作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

Spring Cloud Alibaba 限流与熔断 — Sentinel 限流入门案例_第1张图片

 如上图所示:如果平台1秒内最多接受100个请求,但是当前1秒过来了200请求,这个时候就容易造成因为请求过多造成系统宕机,通过Sentinel的处理,让系统只处理100个请求,而其他的请求做丢弃处理,而达到流量限制的目的。这里面涉及到的一些规则和算法这里不再讲述,后续会专门的讲述这部分内容。一般流量控制有以下几个角度:资源的调用关系,例如资源的调用链路,资源和资源之间的关系;运行指标,例如 QPS、线程池、系统负载等;控制的效果,例如直接限流、冷启动、排队等。Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

Sentinel的使用比较简单,可以单独的使用,也可以继承Spring,Spring Boot,Spring Cloud等 ,单独使用Sentinel时只需要引入Sentinel的jar包即可,如下为maven依赖:


    com.alibaba.csp
    sentinel-core
    1.4.0

下面我们以一个简单的Java应用介绍Sentinel的使用,说是一个应用其实就是一个main方法而已,在Sentinel中被保护的内容被称为资源,被保护的内容也就是有一定限制的访问,在Java中,它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。如下代码所示,我们以方法的形式定义了一个资源:

public static void doSomething() {
    try {
        //判断是否能访问doSomething资源
	SphU.entry("doSomething");
    } catch (BlockException e) {
	//异常处理
    }finally{
        if (entry != null){
            entry.exit();
        }
    }
}

如上代码我们在代码块定义了一个doSomething的资源,SphU.entry("doSomething");用于判断该资源是否可用,如果可用则执行try里的其他代码,否则,try里的代码不再执行,Sentinel是如何判断资源是否可用的呢,在Sentinel中被称为规则,围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。如下我们为上面的资源定义一个规则:

private static void initFlowRules() {
    //规则列表
    List rules = new ArrayList<>();
    //定义一个规则实例
    FlowRule rule = new FlowRule();
    //为规则设置资源,表示该规则对哪个资源有效
    rule.setResource("doSomething");
    //规则级别,其他规则参考RuleConstant源码
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
    //设置QPS为20
    rule.setCount(20);
    rules.add(rule);
    //将规则添加到规则管理器
    FlowRuleManager.loadRules(rules);
}

如上我们为doSomething资源定义了一个规则,规则为QPS为20。也就是说每秒只能有20个访问,我下我们在main方法中测试上面的示例:

public static void main(String[] args) {
    initFlowRules();
    while (true) {
	doSomething();
    }
   }

我们可以在日志中查看具体的访问情况,具体日志如下:

1598241038000|2020-08-24 11:50:38|doSomething|20|157388|0|0|0
1598241039000|2020-08-24 11:50:39|doSomething|20|376334|0|0|0
1598241040000|2020-08-24 11:50:40|doSomething|20|400516|0|0|0
1598241041000|2020-08-24 11:50:41|doSomething|20|432549|0|0|0

上面的内容分别为,时间戳,时间,资源名称,允许访问的个数,拒绝访问的个数。这里只是Sentinel的一个简单的使用,后续我们会更加深入的介绍Sentinel的使用以及与Spring Cloud的集成。

你可能感兴趣的:(微服务技术栈,Spring,Cloud,Alibaba,Sentinel,熔断,限流)