【分布式流控组件 Sentinel 快速入门】——图文详解操作流程(中):https://developer.aliyun.com/article/1390159?spm=a2c6h.13148508.setting.18.54b14f0eHMAggH
8. Sentinel系统规则
💧系统规则是Sentinel的全局配置,可以对整个系统的资源进行限制,例如线程数、CPU使用率等。
系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU使用率、平均RT、入口QPS和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量( EntryType.IN ),比如 Web服务或Dubbo服务端接收的请求,都属于入口流量。系统规则支持以下的模式:
- Load自适应(仅对Linux/Unix-like机器生效):系统的 load1作为启发指标。进行自适应系统
保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR阶段)。系统容量由系统的maxOps * minRt估算得出。设定参考值一般是cpu cores * 2.5。 - CPU usage (1.5.0+版本)︰当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0) ,比较灵敏。
- 平均RT:当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。
- 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
- 入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。
💧测试限流,添加 RateLimitController 和 公共类
@RestController public class RateLimitController { @GetMapping("/byResource") @SentinelResource(value = "byResource", blockHandler = "handleException") public CommonResult byResource() { return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001")); } public CommonResult handleException(BlockException exception) { return new CommonResult(444, exception.getClass().getCanonicalName() + "\t 服务不可用"); } @GetMapping("/rateLimit/byUrl") @SentinelResource(value = "byUrl") public CommonResult byUrl() { return new CommonResult(200, "按url限流测试OK", new Payment(2020L, "serial002")); } @GetMapping("/rateLimit/customerBlockHandler") @SentinelResource(value = "customerBlockHandler", blockHandlerClass = CustomerBlockHandler.class,//<-------- 自定义限流处理类 blockHandler = "handlerException2")//<----------- public CommonResult customerBlockHandler() { return new CommonResult(200, "按客戶自定义", new Payment(2020L, "serial003")); } }
@Data @AllArgsConstructor @NoArgsConstructor public class CommonResult<T>{ private Integer code; private String message; private T data; public CommonResult(Integer code, String message){ this(code, message, null); } }
@Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private Long id; private String serial; }
访问http://localhost:8401/byResource
💧新增流控规则
💧连续快速访问,限流,走兜底方法
💧如果我们关闭服务,限流规则也随之消失(体现出临时性)
💧测试一下,没有兜底方法的
💧添加限流规则
💧如果没有写兜底方法blockHandler,则依然走系统默认兜底
💧创建CustomerBlockHandler类,自定义限流处理逻辑
/** * @Author: LiangXinRui * @Date: 2023/08/4/17:51 * @Description: */ import com.alibaba.csp.sentinel.slots.block.BlockException; import com.atguigu.springcloud.entities.CommonResult; public class CustomerBlockHandler { public static CommonResult handlerException(BlockException exception) { return new CommonResult(4444,"按客戶自定义,global handlerException----1"); } public static CommonResult handlerException2(BlockException exception) { return new CommonResult(4444,"按客戶自定义,global handlerException----2"); } }
💧测试这个方法
💧访问:http://localhost:8401/rateLimit/customerBlockHandler
💧新增流控规则
💧一秒访问两次:
9. 总结
希望本篇博客能够带你一步一步完成Sentinel的入门,从而在微服务架构中有效地保护系统的稳定性和可用性。