sentinel流控策略与熔断策略

  <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>

需要导入相关依赖

yml配置如下

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
        port: 8719
management:
  endpoint:
    web:
      exposure:
        incloud: '*'

开启注解

 

 

 

 

 

 

 

 

 

 

 

资源名:唯一名称,默认请求路径

针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

阈值类型/单机阈值:
  - QPS(每秒钟的请求数量):当调用该API的QPS达到阈值的时候,进行限流
  - 线程数:当调用该API的线程数量达到阈值的时候,进行限流

 是否集群:当前不需要集群

流控模式:
  - 直接:API达到限流条件时,直接限流
  - 关联:当关联的资源达到阈值时,就限流自己
  - 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)(API级别的针对来源)

流控效果:
  - 快速失败:直接失败,抛异常
  - Wam Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFacotor,经过预热时长,才达到设置的QPS阈值
  - 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

 

 

 

 

这里的意思就是我们现在单机阈值设定为1,代表的是当前这个接口只能被1秒访问一次,超过这个阈值,就会被Sentinel阻塞,现在默认为直接失败,也就是会在前台有一个体现

 

 

 

 

QPS是一秒处理一个

并发线程数是指 可以多个接收多个 但是只能一个一个处理,---》一秒的并发线程数?

 

 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 关联:当关联的资源达到阈值时,就限流自己

 

 

 

 

 

 

 

 

 

 

------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 这里要注意不要对/testA或者/testB进行限流规则的配置,要给用SentinelResource注解标注的资源进行配置限流规则,这里的意思为当我们用入口资源访问被SentinelResource注解标注的资源方法时,当超过阈值就会被限流,但是此时实际效果是没有效果。

 有效果的原因是因为我们还需要添加配置,让Sentinel 源码中 CommonFilter 中的 WEB_CONTEXT_UNIFY 参数为 false,将其配置为 false 即可根据不同的URL 进行链路限流,如果不配置将不会生效。

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,键入被占用会自动从8719+1,直到找到未被占用的端口
        port: 8719
      web-context-unify: false

management:
  endpoint:
    web:
      exposure:
        incloud: '*'

还需导入此依赖

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-web-servlet</artifactId>
            <version>1.7.0</version>
        </dependency>

还需配置此类

package com.msb.config;

import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterContextConfig {

    /**
     * @NOTE 在spring-cloud-alibaba v2.1.1.RELEASE及前,sentinel1.7.0及后,关闭URL PATH聚合需要通过该方式,spring-cloud-alibaba v2.1.1.RELEASE后,可以通过配置关闭:spring.cloud.sentinel.web-context-unify=false
     * 手动注入Sentinel的过滤器,关闭Sentinel注入CommonFilter实例,修改配置文件中的 spring.cloud.sentinel.filter.enabled=false
     * 入口资源聚合问题:https://github.com/alibaba/Sentinel/issues/1024https://github.com/alibaba/Sentinel/issues/1213
     * 入口资源聚合问题解决:https://github.com/alibaba/Sentinel/pull/1111
     */
    @Bean
    public FilterRegistrationBean sentinelFilterRegistration() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CommonFilter());
        registration.addUrlPatterns("/*");
        // 入口资源关闭聚合
        registration.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
        registration.setName("sentinelFilter");
        registration.setOrder(1);
        return registration;
    }

}

 

 

 

 

--------------------------------------------------------------------------------------------------------------------------------------------

适用秒杀系统

 

 

 -----------------------------------------------------------------------------------------------------------------------------------------------------

适用消息队列 

 

 

 

-----------------------------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

熔断时长结束后会半开启熔断器,

最想请求数和比例阈值都要同时满足才会触发熔断器,否则不会触发

 

 

在一秒钟以内,所有响应时间都大于300毫秒,且最小请求数大于5的请求,所有都为慢调用 比例阈值为100%,直接触发熔断,10S

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

posted @ 2022-03-14 15:34  花心大萝卜li  阅读(259)  评论(0)    收藏  举报