【微服务】Sentinel(熔断降级,热点限流)

文章目录

1.熔断降级

1.基本介绍
1.线程堆积引出熔断降级
2.示意图
3.熔断,降级,限流三者之间的关系
2.熔断降级策略(以分钟为基本单位)
1.慢调用比例
  • 进行熔断的条件是:慢调用的比例达到阈值,QPS大于最小请求数
  • 待超过熔断时长后,如果还是满足熔断条件(慢调用的比例达到阈值,QPS大于最小请求数),则会继续进行熔断
2.异常比例
  • 进行熔断的条件是:异常比例达到阈值,QPS大于最小请求数
  • 待超过熔断时长后,如果还是满足熔断条件(异常比例达到阈值,QPS大于最小请求数),则会继续进行熔断
3.异常数
  • 进行熔断的条件是:异常数达到阈值,QPS大于最小请求数
  • 待超过熔断时长后,如果还是满足熔断条件(异常数达到阈值,QPS大于最小请求数),则会继续进行熔断
3.熔断降级实例---慢调用比例
1.需求分析
2.com/sun/springcloud/controller/MemberController.java 新增接口t3并休眠300ms
3.具体配置
1.重启10004微服务
2.查看注册情况
3.浏览器输入http://localhost:10004/t3发送请求
4.Sentinel点击降级
5.降级规则配置
  • 这样当每秒钟的请求数 大于5,并且每分钟只要有一个是慢调用就进行熔断降级
4.测试
1.一秒超过五次请求http://localhost:10004/t3会发生熔断降级
2.等待10s,再次请求,虽然还是慢调用,但是小于最小请求数,所以不会发生熔断
5.熔断降级实例---异常比例
1.需求分析
2.com/sun/springcloud/controller/MemberController.java 新增接口t4并出现异常返回error
3.具体配置
1.重启10004微服务
2.查看注册情况
3.浏览器输入http://localhost:10004/t4
4.Sentinel点击降级
5.具体配置
  • 这样配置表示当每秒钟的请求数达到5,并且**每分钟异常的比例大于20%**则会出现熔断降级
4.测试
1.一秒超过五次请求 http://localhost:10004/t4,发生熔断降级
2.五秒之后再次发送请求,降级解除
6.熔断降级实例---异常数
1.需求分析
2.还是使用掐面的t4接口即可
3.具体配置
  • 这样,当吗,每秒钟的请求数 到达5,并且每分钟异常数量大于5,则会进行熔断降级
4.测试
1.一秒超过五次请求 http://localhost:10004/t4,由于每发生熔断降级
2.五秒之后再次发送请求,降级解除

2.热点限流

1.基本介绍
1.引出热点限流
2.示意图
3.上图解读
2.需求分析
3.具体配置
1.10004微服务的controller增加两个接口
被热点限流的接口
  • 使用@SentinelResource注解来制定被热点限流的接口以及处理热点限流的接口
java 复制代码
    /**
     * 测试热点限流
     * @param id
     * @param type
     * @return
     */
    @GetMapping("/news")
    @SentinelResource(value = "news", blockHandler = "hot") // value为资源名可以任意指定,blockHandler为限流处理
    public String news(@RequestParam("id") String id, @RequestParam("type") String type) {
        return "id=" + id + " type=" + type;
    }
处理热点限流的接口
  • 接受的参数需要与被热点限流的接口的参数一致,并且有一个处理异常的参数
java 复制代码
    /**
     * 热点限流处理
     * @param id 与news方法的参数一致
     * @param type 与news方法的参数一致
     * @param blockException 限流处理的异常
     * @return 注意:这里的返回值类型要与news方法的返回值类型一致
     */
    public String hot(String id, String type, BlockException blockException) {
        return "id" + id + "type" + type + "热点限流处理";
    }
2.重启10004微服务,并启动Nacos和Sentinel
3.浏览器输入 http://localhost:10004/news?id=1\&type=动物
4.Sentinel查看热点接口
5.点击热点,进行基本配置
  • 这个配置表示对参数id进行热点限流,只要每秒请求次数超过2就触发限流
6.保存后点击热点规则,编辑刚才的规则
7.点击高级选项,对参数的具体值进行额外配置
4.测试
1.浏览器快速访问 http://localhost:10004/news?id=1\&type=动物 会出现热点限流
  • 原因是对参数id设置了热点限流的触发条件为每秒请求数为2
2.快速访问 http://localhost:10004/news?id=2\&type=动物 不会出现热点限流
  • 原因是对参数id=2设置了热点限流的触发条件为每秒请求数为100
5.注意事项
1.热点参数可以设置多个值进行限流
2.处理热点限流的方法的返回值需要与被处理的方法相同

3.系统规则

1.基本介绍
1.引出系统规则
2.介绍
  • 简单来说这个系统规则就是对整个系统的所有资源进行统一管理,共享一套限流规则
2.系统规则实例
1.需求分析
2.新增系统规则
3.进行配置
  • 这样配置就表示,整个系统的每秒请求数超过2就会进行限流
4.测试
浏览器快速访问 http://localhost:10004/t2(或者其他任意的资源) 都会进行热点限流

4.全局限流处理类

1.需求分析
2.具体实现
1.编写全局限流处理类
  • 需要注意:方法必须是static,并且参数类型和返回的类型必须与被处理的方法一致
java 复制代码
package com.sun.springcloud.handler;

import com.alibaba.csp.sentinel.slots.block.BlockException;

/**
 * Description: 全局限流处理器,方法必须是static
 *
 * @Author sun
 * @Create 2024/3/29 16:04
 * @Version 1.0
 */
public class GlobalBlockHandler {
    /**
     * 全局限流处理器
     *
     * @param id 传入的参数
     * @param e  异常
     * @return 返回的结果,必须与被处理的方法返回值一致
     */
    public static String blockHandler(String id, BlockException e) {
        return "GlobalBlockHandler " + id + " 服务不可用";
    }
}
2.编写一个接口进行测试
java 复制代码
    /**
     * 全局限流测试
     * @return
     */
    @GetMapping("/system")
    //  @SentinelResource 注解中的value值为资源名 名字任意,blockHandlerClass为全局限流处理类,blockHandler为处理方法
    @SentinelResource(value = "system", blockHandlerClass = GlobalBlockHandler.class, blockHandler = "blockHandler")
    public String system(@RequestParam(value = "id", required = false) String id) {
        return "id" + id + "全局限流未激活";
    }
3.测试
1.重启10004模块
2.配置system接口的限流,这里就配置一个热点限流
3.浏览器快速访问 http://localhost:10004/system?id=test

5.fallback(统一处理java异常)

1.需求分析
2.具体实现
1.修改system接口,每五次抛出异常
java 复制代码
    private int count = 0;
    /**
     * 全局限流测试
     * @return
     */
    @GetMapping("/system")
    //  @SentinelResource 注解中的value值为资源名 名字任意,blockHandlerClass为全局限流处理类,blockHandler为处理方法
    @SentinelResource(value = "system", blockHandlerClass = GlobalBlockHandler.class, blockHandler = "blockHandler",
    fallbackClass = GlobalFallbackHandler.class, fallback = "fallbackHandlerMethod1")
    public String system(@RequestParam(value = "id", required = false) String id) {
        // 每调用5次就抛出异常
        if (++ count % 5 == 0) {
            throw new RuntimeException("出现异常!!!");
        }
        return "id" + id + "全局限流未激活";
    }
2.编写全局异常处理类
  • 方法需要是static
  • 参数类型和返回类型与被处理的方法类型一致
java 复制代码
package com.sun.springcloud.handler;


/**
 * Description: 全局异常处理类,所有的方法都要是静态方法,参数类型和返回值类型也要与被处理的方法返回值相同
 *
 * @Author sun
 * @Create 2024/3/29 16:33
 * @Version 1.0
 */
public class GlobalFallbackHandler {
    public static String fallbackHandlerMethod1(String id, Throwable throwable) {
        return "fallback处理异常!" + "id:" + id;
    }
}
3.system接口使用全局异常处理类处理异常
  • 新增两个属性,一个是全局异常处理类的Class对象,一个是处理异常的方法
4.测试
1.打开nacos和sentinel
2.重启10004微服务
3.浏览器访问一下http://localhost:10004/system?id=test
4.Sentinel配置限流,这里就配置一个QPS流量控制
5.目前情况分析
  • 正常情况:每秒请求数不超过2
  • 限流情况:每秒请求数超过2,被全局限流处理类中的方法处理
  • 异常情况:每5次抛出一次异常,交给全局异常处理器处理
6.访问五次 http://localhost:10004/system?id=test 成功交给全局异常处理类来处理
相关推荐
码智社34 分钟前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海37 分钟前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖2 小时前
JDK 26 新特性详解
java·开发语言
马优晨2 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区4 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大4 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai5 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说5 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
এ慕ོ冬℘゜5 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa5 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio