分布式限流框架Sentinel基本引用
Sentinel的基本引用
使用Sentinel的核心库实现限流,主要分以下几个步骤:
- 定义资源
- 定义限流规则
- 校验规则是否生效
Sentinel实现限流
引入Sentinel核心库
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.2</version>
</dependency>
复制代码
定义普通业务方法
private static void doLimiting(){
try(Entry limiting = SphU.entry("doLimiting")){
log.info("{}-doLimiting",System.currentTimeMillis());
}catch (BlockException e){
//处理被流量控制的逻辑
}
}
复制代码
在doLimiting方法中,通过使用Sentinel中的SphU.entry("doLimiting")定义一个资源来实现流量控制逻辑,表示当请求进入doLimiting方法时,需要进行限流判断,如果抛出BlockException异常,则表示触发了限流,doLimiting可定义为方法名称、接口名称或者其他唯一标识
对保护资源定义限流规则
private static void initFlowRules(){
final List<FlowRule> flowRules = new ArrayList<>();
final FlowRule flowRule = new FlowRule();
flowRule.setResource("doLimiting");
flowRule.setCount(20);
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);
}
复制代码
针对doLimiting资源,通过initFlowRules设置限流规则,部分参数含义如下:
- grade:限流阈值类型,并发线程数模式(0)或者QPS模式(1)
- resource:设置需要保护资源名,这个资源名称必须和SphU.entry中使用的名称一样
- count:限流阈值
对于doLimiting方法,每秒最多允许通过20个请求,就是QPS为20
验证doLImiting方法的限流情况
public static void main(String[] args) {
initFlowRules();
while(true){
doLimiting();
}
}
复制代码
启动main方法,在{USER_HOME}\logs\csp\{包名-类名}--metrics.log.yyyy-MM-dd文件查看以下日志
1627357800000|2021-07-27 11:50:00|doLimiting|20|6740|20|0|0|0|0|0
1627357801000|2021-07-27 11:50:01|doLimiting|20|7372|20|0|0|0|0|0
1627357802000|2021-07-27 11:50:02|doLimiting|20|7093|20|0|0|0|0|0
1627357803000|2021-07-27 11:50:03|doLimiting|20|6714|20|0|0|0|0|0
1627357804000|2021-07-27 11:50:04|doLimiting|20|6412|20|0|0|0|0|0
1627357805000|2021-07-27 11:50:05|doLimiting|20|7296|20|0|0|0|0|0
1627357806000|2021-07-27 11:50:06|doLimiting|20|7606|20|0|0|0|0|0
1627357807000|2021-07-27 11:50:07|doLimiting|20|7033|20|0|0|0|0|0
1627357808000|2021-07-27 11:50:08|doLimiting|20|6489|20|0|0|0|0|0
复制代码
每秒稳定输出20次,和规则中设置的值一致,而被拒绝的请求每秒最高达7606次
日志对应字段具体含义
timestamp|yyyy-MM-dd HH:mm:ss|resource|passQPS|blockQPS|successQPS|exceptionQPS|rt|occupiedPassQPS
|concurrency|classification
passQPS 通过的请求数
blockQPS 被阻止的请求数
successQPS 成功执行完成的请求数
exceptionQPS 用户自定义的异常
rt 平均响应时长
occupiedPassQPS 优先通过的请求
classification 资源类型