Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用

目录

1. 微服务依赖

2. Sentinel集成

2.1 pom文件

2.2 application.properties 增加配置

2.3 启动微服务

3. Sentinel基本应用

3.1 注解定义资源

3.2 定义限流规则 

3.3 进行流控测试

4. 流控设计参数

4.1 资源名

4.2 针对来源

4.3 阈值类型

4.4 QPS流量控制效果

4.5 基于调用关系的流量控制


观博有逻辑,导航来相助《Spring Cloud Alibaba系列-目录导航》 


1. 微服务依赖

微服务依旧使用前面搭建的生产者(provider-7001)与消费者(consumer-8001)服务,如果还没搭建,请参照以前的博文。

2. Sentinel集成

2.1 pom文件

在生产者(provider-7001)与消费者(consumer-8001)服务 的pom文件引入sentinel依赖包

        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-sentinel
        

2.2 application.properties 增加配置

# sentinel dashboard ip和端口
spring.cloud.sentinel.transport.dashboard=localhost:8080

 

2.3 启动微服务

应首先将sentinel启动,然后启动生产者(provider-7001)(7001,7002,7003三个生产者)与消费者(consumer-8001)服务,启动服务是,会有如下日志打印

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第1张图片

 

在浏览器发送几次如下请求后,观察sentinel页面

观察到效果如下:在实时监控中,会有对应微服务的资源的监控信息

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第2张图片

 

3. Sentinel基本应用

使用sentinel实现限流,主要应实现三个方面:

1.定义资源(通过限流保护的基本元素,例如一个方法)

2.定义限流规则

3.校验规则是否生效

3.1 注解定义资源

使用@SertinelResource 注解定义资源,在consumer-7001中增加测试方法,并且使用@SertinelResource(value="senres")

@RestController
public class ConsumerSenController {

    @GetMapping("/sen/res")
    @SentinelResource(value = "senres",blockHandler = "blockHandlerForEcho")
    public String echo() {
        return "测试资源的定义";
    }

    public String blockHandlerForEcho(BlockException e){
        return "限流后的处理方法";
    }

}

在浏览器进行请求测试后观察sentinel控制台

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第3张图片

在sentinel中出现自定义的资源,可以针对定义资源进行限流操作

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第4张图片

 

3.2 定义限流规则 

在sentinel中增加对于senres资源的限流,设置QPS单机阈值为1,每秒一次请求

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第5张图片

 Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第6张图片

3.3 进行流控测试

由于每秒一次,没有必要使用工具测试,因此在浏览器进行不断的F5

每秒一次的频率下,接口正常返回

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第7张图片

在频率较高时,会经常出现此种限流返回;

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第8张图片

查看sentinel实时监控,如下图,QPS为1,拒绝的请求有好多

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第9张图片

4. 流控设计参数

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第10张图片

针对上面的参数进行逐个讲解:

4.1 资源名

1. sentine 会默认将请求的mapping作为资源

2. 使用@SentinelResource注解的会定义为资源

Spring Cloud Alibaba系列-第9节-在微服务中集成Sentinel,限流应用_第11张图片

4.2 针对来源

流控针对的调用来源,若为 default 则不区分调用来源

4.3 阈值类型

QPS

QPS(Queries per Second)表示每秒的查询数,也就是一台服务器每秒能响应的查询次数。当QPS达到限流的阈值,就会触发限流策略

线程数

并发线程数限流用来保护业务线程不被耗尽,比如,A服务调用B服务,但是B服务由于种种原因未能及时响应,那么对于A服务来说,他的吞吐量会下降,也就是占用更多的线程,逐渐会耗尽线程资源。

针对此问题,常用的方式是使用不同的线程池隔离业务自称的资源争抢问题,效果类似于信号量,但是会造成线程过多造成的上下文切换问题;

sentinel线程数限流就是统计当前请求的上下文线程数量,如果超出阈值,新的请求就会被拒绝。并发数控制通常在调用端进行配置。

4.4 QPS流量控制效果

1. 快速失败

快速失败RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

2. Warm Up

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

3. 匀速排队

匀速排队(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法。

 

4.5 基于调用关系的流量控制

调用关系包括调用方和被调用方,一个方法可能又调用另一个方法,形成调用链。基于调用关系流控,就是根据不同调用维度触发流控。

1. 根据调用方限流

2.根据调用链路入口限流

3. 具有关系的资源流量控制(关联流量控制)

 

 

你可能感兴趣的:(spring,cloud,alibaba,spring,cloud,alibaba)