SpringCloud Alibaba--Sentinel哨兵使用

继续学习SpringCloud Alibaba的Sentinel,主要是跟着周阳老师的视频资料学习。首先启动nacos服务。
SpringCloud Alibaba--Sentinel哨兵使用_第1张图片
SpringCloud Alibaba--Sentinel哨兵使用_第2张图片

Sentinel实际和Hystrix的作用一样,实现服务降级、熔断等。但是Hystrix的不足之处大概有:
1.需要程序员手工搭建监控平台;
2.没有一套web界面可以给我们进行细粒度化的配置。

Sentinel也是实现流量控制、速率控制、服务熔断、服务降级。Sentinel有的优点如下:
1.单独的组件,可以独立出来。
2.直接界面化的细粒度统一配置。
SpringCloud Alibaba--Sentinel哨兵使用_第3张图片
启动sentinel-dashboard-1.8.3.jar服务。找到sentinel-dashboard-1.8.3.jar文件目录,然后在它目录下通过cmd窗口执行jar包。

java -jar sentinel-dashboard-1.8.3.jar

访问sentinel控制台
http://localhost:8080/#/dashboard/home
SpringCloud Alibaba--Sentinel哨兵使用_第4张图片

一、创建cloudalibaba-sentinel-service8401工程

pom.xml


        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cspgroupId>
            <artifactId>sentinel-datasource-nacosartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>

application.yml

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery: #Nacos注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport: #dashboard地址
        dashboard: localhost:8080
        port: 8719  #默认端口,如果被占用则从8719依次+1扫描
      datasource:
        dsl:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data_type: json
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        include: "*"

MainApp8401

@SpringBootApplication
@EnableDiscoveryClient
public class MainApp8401 {
    public static void main(String[] args) {
        SpringApplication.run(MainApp8401.class, args);
    }
}

FlowLimitController

@RestController
@Slf4j
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA(){
        try {
            TimeUnit.MILLISECONDS.sleep(800);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "---------testA";
    }

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

    @GetMapping("/testD")
    public String testD(){
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
//        log.info("testD 测试RT");
        log.info("testD 异常比例");
        int age = 10/0;
        return "------testD";
    }

    @GetMapping("/testE")
    public String testE(){
        log.info("testD 测试异常数");
        int age = 10/0;
        return "------testD 测试异常数";
    }

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                             @RequestParam(value = "p2", required = false) String p2) {
        return "-------testHotKey";
    }

    public String deal_testHotKey(String p1, String p2,
                                  BlockException exception){
        return "----deal_testHotKey,o(╥﹏╥)o";

    }

}

二、测试流控规则

1.访问http://localhost:8401/testA和http://localhost:8401/testB

发现已经监控到发送信息SpringCloud Alibaba--Sentinel哨兵使用_第5张图片

2.测试流控规则,阈值类型选择QPS,单机阈值输入1

SpringCloud Alibaba--Sentinel哨兵使用_第6张图片
多次访问http://localhost:8401/testA,会报错
在这里插入图片描述

3.流控效果:关联方式

超过阈值限制,自定义fallback消息或者默认反馈内容。这里设置流控模式为关联。
当关联资源/testB的QPS阈值超过1时,就限流/testA的Rest访问地址。当关联资源到阈值后,限制配置好的资源名,即B惹事,A挂了。SpringCloud Alibaba--Sentinel哨兵使用_第7张图片
利用jmeter模拟并发访问testB场景,并发启动一万个线程,隔0.1秒内全部开启。
SpringCloud Alibaba--Sentinel哨兵使用_第8张图片
jmeter启动后,访问http://localhost:8401/testA,显示关联流控场景效果即"快速失败"。
在这里插入图片描述

4.流控效果:Warm up预热/冷启动方式

默认coldFactor为3,即请求的QPS从(threadhold/3)开始,经过多少预热时长才逐渐升至设定的QPS阈值。
案例:设置阈值10,预热时长设置5,则系统初始化的阈值10/3约等于3,即阈值刚开始为3,然后过了5秒后阈值才慢慢升高到10。
SpringCloud Alibaba--Sentinel哨兵使用_第9张图片
刚开始点击3秒内,快速访问http://localhost:8401/testB报错
在这里插入图片描述
经过5秒钟后,同样的访问频率恢复正常
在这里插入图片描述

5 流控效果:排队等待

代码调整

 @GetMapping("/testB")
    public String testB(){
        log.info(Thread.currentThread().getName()+"\t ..testB..");
        return "----------testB";
    }

jmeter调整,设置10个线程,0.1秒间隔执行
SpringCloud Alibaba--Sentinel哨兵使用_第10张图片
SpringCloud Alibaba--Sentinel哨兵使用_第11张图片
启动jmeter,测试发现排队等待执行,一秒执行一个任务
SpringCloud Alibaba--Sentinel哨兵使用_第12张图片

三、测试熔断规则

1.慢调用比例

即选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
controller层代码调整

@GetMapping("/testD")
    public String testD(){
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("testD 测试慢调用比例RT");
//        log.info("testD 异常比例");
//        int age = 10/0;
        return "------testD";
    }

SpringCloud Alibaba--Sentinel哨兵使用_第13张图片

SpringCloud Alibaba--Sentinel哨兵使用_第14张图片
SpringCloud Alibaba--Sentinel哨兵使用_第15张图片
jmeter未启动前,访问http://localhost:8401/testD一切正常。
在这里插入图片描述
启动jmeter,jmeter 以每秒钟10次请求访问,再次访问http://localhost:8401/testD结果显示异常。
在这里插入图片描述
因为jmeter每秒钟10次请求大于最小值5;每个请求处理时长超过200ms,满足第二个条件,因此触发降级。停止jmeter后,一切访问又恢复正常了!

2.异常比例 (ERROR_RATIO)

当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
测试controller层代码,testE()方法。
配置熔断策略为异常比例。配置参数解释:
1》每秒钟请求超过五个
2》异常比例超过50%触发熔断
SpringCloud Alibaba--Sentinel哨兵使用_第16张图片
jmeter每秒钟十个访问,访问http://localhost:8401/testE,发现已经触发服务降级。
在这里插入图片描述
停掉jmeter再次访问http://localhost:8401/testE,直接爆程序错误。也就是没触发sentinel熔断。
SpringCloud Alibaba--Sentinel哨兵使用_第17张图片

3.异常数模式

和上面的区别是根据异常数判断是否需要进行熔断。
SpringCloud Alibaba--Sentinel哨兵使用_第18张图片

参考文章
Sentinel服务限流、降级、热点规则

你可能感兴趣的:(SpringCloud,java,spring,cloud,微服务)