SpringCloud Alibaba--Sentinel哨兵使用

继续学习SpringCloud Alibaba的Sentinel,主要是跟着周阳老师的视频资料学习。首先启动nacos服务。
在这里插入图片描述
在这里插入图片描述

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

Sentinel也是实现流量控制、速率控制、服务熔断、服务降级。Sentinel有的优点如下:
1.单独的组件,可以独立出来。
2.直接界面化的细粒度统一配置。
在这里插入图片描述
启动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
在这里插入图片描述

一、创建cloudalibaba-sentinel-service8401工程

pom.xml

<!--  SpringCloud alibaba nacos    -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--    后续做持久化用到    -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--   sentinel     -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <!--   openfeign     -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </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

发现已经监控到发送信息在这里插入图片描述

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

在这里插入图片描述
多次访问http://localhost:8401/testA,会报错
在这里插入图片描述

3.流控效果:关联方式

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

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

默认coldFactor为3,即请求的QPS从(threadhold/3)开始,经过多少预热时长才逐渐升至设定的QPS阈值。
案例:设置阈值10,预热时长设置5,则系统初始化的阈值10/3约等于3,即阈值刚开始为3,然后过了5秒后阈值才慢慢升高到10。
在这里插入图片描述
刚开始点击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秒间隔执行
在这里插入图片描述
在这里插入图片描述
启动jmeter,测试发现排队等待执行,一秒执行一个任务
在这里插入图片描述

三、测试熔断规则

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";
    }

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
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%触发熔断
在这里插入图片描述
jmeter每秒钟十个访问,访问http://localhost:8401/testE,发现已经触发服务降级。
在这里插入图片描述
停掉jmeter再次访问http://localhost:8401/testE,直接爆程序错误。也就是没触发sentinel熔断。
在这里插入图片描述

3.异常数模式

和上面的区别是根据异常数判断是否需要进行熔断。
在这里插入图片描述

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值