SpringCloud框架(十二) -- Sentinel实现熔断和限流(用)

1. Sentinel是什么:

官网:https://github.com/alibaba/sentinel
中文版:https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 其实就是代替Hystrix的功能,解决:

  • 服务熔断
  • 服务降级
  • 服务限流
  • 服务雪崩
    在这里插入图片描述

1.2 分为两部分:

在这里插入图片描述

2. 下载安装:

文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_sentinel

2.1 jar包下载

  1. 官网github下载jar包;
  2. 在下载目录下启动jar包:java -jar jar包名称;
    在这里插入图片描述
  3. localhost:8080登录,用户名密码都是sentinel

2.2 docker下载

#拉取sentinel镜像
docker pull bladex/sentinel-dashboard

#运行sentinel(docker里的sentinel是8858端口)
docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard

#把nacos和mysql也启动起来

访问:账密都是sentinel
在这里插入图片描述
在这里插入图片描述

3. 初始化演示工程:

在这里插入图片描述

  1. 新建模块cloudalibaba-sentinel-service8401
  2. 添加pom:
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  1. 添加yml
server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinal-service
  cloud:
    nacos:
      discovery:
        #Nacos服务注册中心地址(改成自己的服务器ip地址,本地用localhost‍)
        server-addr: 10.211.55.26:8848
    sentinel:
      transport:
        #配置Sentin dashboard地址(改成自己的服务器ip地址,本地用localhost‍)
        dashboard: 10.211.55.26:8858
        # 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口
        port: 8719
        
management:
  endpoints:
    web:
      exposure:
        include: '*'
  1. 添加controller
@RestController
public class FlowLimitController {
   

    @GetMapping("/testA")
    public String testA() {
   
        return "----testA";
    }

    @GetMapping("/testB")
    public String testB() {
   
        return "----testB";
    }
}
  1. 测试,启动8401,然后刷新sentinel后台页面,可以看到什么都没有。因为sentinel采用懒加载策略,所以需要调用服务后才在后台显示。
  2. 先访问接口,然后刷新sentinel后台页面:
    在这里插入图片描述

4. 流控规则:

两种方式:

  1. 直接在流控规则中新建:
    在这里插入图片描述
  2. 在簇点规则中新建:
    在这里插入图片描述

流量控制:
在这里插入图片描述

4.1 三种流控模式:

4.1.1 直接(默认):

在这里插入图片描述
超过一秒一次(或者设置线程数阙值,访问该api的线程数超过1秒一个),就会被限流,报错系统默认的错误信息:
在这里插入图片描述

阕值类型

在这里插入图片描述
QPS是直接挡在外面,而线程数是有多少个线程在处理,放进来后,有线程是空闲状态就对请求进行处理,都没空闲,就限流(关门打狗)。

4.1.2 关联:

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

  • 当与A关联的资源B达到阈值后,就限流A自己。

在这里插入图片描述

  1. 此时不管调用多少次A都不会限流,而此时超过1秒调用1次B,则会限流A。

  2. 设置postman频繁访问testB:
    在这里插入图片描述

  3. 测试A可以看到A又挂了:
    在这里插入图片描述

  4. 等线程B访问结束后,A恢复正常。

4.1.3 链路:

多个请求调用了同一个微服务。

4.2 三种流控效果:

在这里插入图片描述

4.2.1 快速失败(默认):

直接失败,抛出异常,即上面的流控模式的测试的处理方式。

4.2.2 预热:

在这里插入图片描述
在这里插入图片描述

公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值。
解释下:阈值设置为10,预热时长设置为10s,那么在前10秒钟,阈值其实时10/3,每秒限制3个qps,当达到10s后,qps才会提升到10个。
在这里插入图片描述
源码
在这里插入图片描述

作用秒杀系统在开启的瞬间,会有很多流量上来,很可能把系统打死,预热方式就是为了保护系统,把流量慢慢的放进来,慢慢的把阙值增长到设置的阙值

4.2.3 排队等待:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
作用用于处理间隔性突发的流量,例如消息队列。例如这样的场景:在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是第一秒直接拒绝多余的请求

测试:postman模拟10个请求,可以看到请求每秒一个处理了:
在这里插入图片描述

5. 降级规则:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意sentinel断路器是没有半开状态的
半开状态:半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,由异常则继续打开断路器不可用。

5.1 平均响应时间:

在这里插入图片描述
在这里插入图片描述
测试:
在这里插入图片描述

这个200ms是平均响应时间,而不是某一次的响应时间。
后续停止jmeter了,1s后,访问恢复正常。

5.2 异常比例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值