怎样防止雪崩效应

怎样防止雪崩效应,第1张

文章目录
  • 什么是雪崩
  • 一、怎么防止雪崩
  • 二、spring-cloud-alibaba整合sentinel
    • 1.加依赖
    • 2.加注解
    • 3.加配置
    • 4.下载jar
    • 5.使用


什么是雪崩


随着时间的进行,假设A服务down了,而B还在不断的请求,每次请求都创建一个线程,B线程数越来越大,最终达到服务器最大限度,进而B服务down了,而B的上游服务也在不断请求B服务,进而上游服务陆续都Down了。
这种因下游服务导致一系列上游服务Down的现象称为雪崩效应。


一、怎么防止雪崩
  1. 超时的思想: 减小请求的超时时间,超时就释放线程。
  2. 限流的思想: 限定流量大小,超 过这个值就进流量了。
  3. 舱壁模式思想:请求接口时用自己的线程池,A线程池满了,不会影响B线程池。比如一条船,一个舱进水了,不会影响别的舱,船也 不会沉。
  4. 断路器思想: 监控API错误率达到阈值就断闸,过段时间进入半开模式,根据半开模式结果来选择进入断闸还是合闸。
二、spring-cloud-alibaba整合sentinel 1.加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.加注解

不用加

3.加配置
  1. 加暴露sentinel配置
management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 启动应用确认集成sentinel是否成功,访问:http://localhost:8081/actuator/sentinel
  2. 给微服务指定sentinel
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/content_center?serverTimezone=UTC
    hikari:
      username: gxf
      password: 1111.aaa
      # mysql-connector 版本
      # >= 6.x: com.mysql.cj.jdbc.Driver
      # <= 5.x: com.mysql.jdbc.Driver
      driver-class-name: com.mysql.cj.jdbc.Driver
  application:
    name: content-center
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        cluster-name: BJ-UserCenter
        metadata:
          target-version: v1
          version: v1
    sentinel:
      transport:
        dashboard: localhost:8080
4.下载jar

要和sentinal版本一致
https://github.com/alibaba/Sentinel/releases
启动 java -jar sentinel-dashboard-1.6.2.jar
访问 http://localhost:8080/#/login
登录 sentinel/sentinel

5.使用
  1. 访问微服务
  2. 刷新sentinel。sentinel是懒加载的。
  3. 点击簇点链路:资源名就是曾经忘问过的端点,点击流控,为此路径设置流控规则。
  4. 设置流控规则:

资源名:默认是访问路径,实际就是一个唯一的名字。

针对来源:对当前端点的调用者(哪个微服务调用它)来限定规则。默认default不区分来源。

阈值类型:QPS和线程数,当选QPS时需要填单机阈值,意思是当每秒查询率达到阈值就会触发流控规则。当选择线程数时,意思是当调用此API的线程数达到阈值时,触发流控规则。

流控模式:直接,关联,链路。当选择直接意思是,当此API的QPS达到阈值就直接限流,返回Blocked by Sentinel (flow limiting)。当选择关联时需要写一个API路径例如/getUser,意思是,当访问/getUser的OPS达到阈值时限流自己。使用场景例如,我们知道,读的频率高会相抵写的效率,写的频率高会影响读的效率,当业务场景对读接口和改接口有优先级要求的时候,可以把优先级高的配到关联处。当选择链路时,需要写一个入口资源,意思是,例如有两个 API,A与B都调用这个接口,而这个接口的入口资源填的是A,当A调用这个接口的QPS达到阈值时就会限流,而B调这个接口 不会有影响。可见"针对来源" 是微服务级别,链路是API级别的。

流控效果:快速失败,Warm Up, 排队等待,当选择快速失败时,达到阈值直接抛异常。当 选择Warm Up 预热时,需要填一个预热时长,意思是,阈值/冷加载因子(默认3)的值最为最初的阈值,经过了预热时长后,阈值才达到你设定的阈值。使用场景:秒杀系统,这个系统平时也不用,就在某个时刻流量激增,直接把微服务打崩了,如果有预热则会让允许通过的流量缓慢的增加。当选择排队等待时,会填一个超时时间例如100,阈值填了10,意思是,当访问此接口QPS达到10时,接下来的请求处于排队状态,超过超时时间的请求会被抛弃。使用场景,当流量激增又不想丢弃请求时,可以使用,来匀速的处理请求。

  1. 设置降级规则

    RT:平均响应时间,当1s内进入5个请求,响应时间均超过阈值(毫秒单位),那么在接下来的窗口期的时间里这个API会降级,对这个方法的调用都会自动地熔断。
    注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

异常比例:

每秒请求量 >= 5 && 且(每秒异常数) / (每秒请求量) 的 值超过阈值,在接下来的窗口期的时间里这个API会降级,对这个方法的调用都会自动地熔断。

异常数:

一分钟内异常的次数达到阈值,在接下来的窗口期的时间(要填>60的数)里这个API会降级,对这个方法的调用都会自动地熔断。

  1. 设置热点规则(特殊的限流规则)
    Sentinel页面显示的端点默认是不支持热点规则,如果想设置热点规则需要在端点上加注解。
    注意:热点参数必须是基本类型或string
    @GetMapping("/testHot")
    @SentinelResource("hot")
    public String testHot(@RequestParam("a") String a, @RequestParam("b") String b){
        return a+" "+b;
    }


意思是,API的第2个参数QPS达到2,在接下来的1s,请求这个API会被限流。

意思是,针对于第二个参数,当值为H时QPS为200,当值不是H时QPS为2。
使用场景:想提高API的可用性,假设,A参数QPS特别高,其他参数QPS不高。如果不用热点,A则达到阈值直接限流,即使不传A参数也限流。如果配置了A参数的热点,A参数QPS达到阈值则只限流 传A参数的请求,甚至可以根据A参数的值不同设定不同的阈值。

  1. 设置系统规则
    LOAD:系统1分钟的负载,且系统并发线程数超过 系统容量(sentinei计算出来的一个系统指标) 时触发。建议阈值设置为:CPU核数*2.5。(Linux nuix)
    RT: 服务器的所有入口的流量的平均响应时间到达阈值就会触发
    线程数:服务器的所有请求此微服务的并发线程数达到阈值会触发
    入口QPS:服务器的所有入口的流量的OPS达到阈值会触发

  2. 设置授权规则
    ![在这里插入图片描述](http://www.kaotop.com/file/tupian/20220514/8cc3c01feac743a795d2c5d66c0d9409.png

资源名:设置授权规则的端点(API),/shares/
流程控制:限制调用/shares的微服务,当选择白名单 意思是,只允许微服务user_center调/shares;如果是黑名单 意思是,禁止微服务user_center调/shares。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/916199.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存