Sentinel规则之流量控制规则
Sentinel规则之流量控制规则
☞,带你有序的阅读和学习!
⽂章⽬录
概述
流量控制(flow control), 其原理是监控应⽤的QPS或并发线程数等指标,当达到指定的阈值时对流量进⾏控制,以避免被瞬时的流量⾼峰冲垮,从⽽保障应⽤的⾼可⽤性。
⽂档:
继承结构
前期物业管理合同同⼀资源可以创建多条限流规则。我们先看⼀下继承结构:
劳动小报
下⾯是Rule接⼝代码:
public interface Rule {
boolean passCheck(Context context, DefaultNode node,int count, args);
}
AbstractRule:
public abstract class AbstractRule implements Rule {
/**
* 资源名,资源名是限流规则的作⽤对象。
*/
private String resource;
/**
* 流控针对的调⽤来源,default代表不区分调⽤来源
*/
private String limitApp;
到目前为止}
FlowRule:
public class FlowRule extends AbstractRule {
/**
* 限流阈值类型 0:线程数 1:QPS queries per cond
*/
private int grade = RuleConstant.FLOW_GRADE_QPS;
/**
* 数量。限流阈值
*/
private double count;
/**
* 流控模式
* public static final int STRATEGY_DIRECT = 0; //direct 直接模式
* public static final int STRATEGY_RELATE = 1; //relate 关联
* public static final int STRATEGY_CHAIN = 2; //chain 链路
*/
private int strategy = RuleConstant.STRATEGY_DIRECT;
/**
* Reference resource in flow control with relevant resource or context.
*/
private String refResource;
/**
* Rate limiter control behavior.
* 流控控制效果(直接拒绝,Warm up,匀速排队)
* 0. default(reject directly), 1. warm up, 2. rate limiter, 3. warm up + rate limiter
*/
private int controlBehavior = RuleConstant.CONTROL_BEHAVIOR_DEFAULT;
private int warmUpPeriodSec =10;
/**木瓜是什么
* Max queueing time in rate limiter behavior.
*/
private int maxQueueingTimeMs =500;
private boolean clusterMode;
/**
* 集群模式
*/
private ClusterFlowConfig clusterConfig;
/
**
* The traffic shaping (throttling) controller.
*/
private TrafficShapingController controller;
@Override
public boolean passCheck(Context context, DefaultNode node,int acquireCount, args){ return true;
}
}
单条限流规则主要由以下⼏个因素组成,我们可以组合这些元素实现不同的限流效果:resource : 资源名,即限流规则的作⽤对象
云南高考状元
count : 限流阈值
grade : 限流阈值类型(QPS或是并发线程数)
limitApp : 流控针对的调⽤来源,若为default 则不区分来源
strategy : 调⽤关系限流策略
controlBehavior :流量控制效果(直接拒绝,Warm Up,均速排队)
基本代码
// EchoController
@RestController
public class EchoController {
@Autowired
private EchoService echoService;
@GetMapping("/echo/{str}")
public String echo(@PathVariable String str, HttpServletRequest request){
ho(str);
}
}
// EchoService
public interface EchoService {
String echo(String str);
}
// EchoServiceImpl
@Service
public class EchoServiceImpl implements EchoService {
@Override
@SentinelResource(value ="echo",blockHandler ="handleBlockException")
public String echo(String str){
return"echo str:"+str;
}
public String handleBlockException(String str, BlockException ex){
return"str:"+str+" | e:"+ex;
}
}
基于QPS流量控制
当QPS超过某个阈值的时候,则采⽤措施进⾏流量控制(基于并发线程数的没有这个控制)。流量控制的⼿段包括以下⼏种:直接拒
绝,Warm Up,均速排队。对应FlowRule 中的controlBeHavior字段。
机械制造与自动化毕业论文流量控制
直接拒绝:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)⽅式是默认的流量控制⽅式,当QPS超过任何规则的阈值后,新的请求就会⽴即拒绝,拒绝⽅式为抛出FlowException . 这种⽅式适⽤于对系统处理能⼒确切已知的情况下,⽐如通过压测确定了系统的准确⽔位时。
Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)⽅式,即预热/冷启动⽅式。当系统长期处理低⽔平的情况下,当流量突然增加时,直接把系统拉升到⾼⽔位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在⼀定时间内逐渐增加到阈值的上限,给系统⼀个预热的时间,避免冷系统被压垮。
通常冷启动的过程系统允许通过的 QPS 曲线如下图所⽰:
均速排队:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)⽅式后严格控制请求通过的时间间隔,也即是让请求以均匀的速度通过,对应的是漏桶算法。
该⽅式的作⽤如下图所⽰:
这种⽅式主要⽤于处理间隔性突发的流量,例如消息队列。想象⼀下这样的场景,在某⼀秒有⼤量的请求到来,⽽接下来的⼏秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,⽽不是在第⼀秒直接拒绝多余的请求。
代码测试
初始化规则:
绿豆酥/*初始化规则*/
public static void initRule(){
List<FlowRule> rules =new ArrayList<>();
//定义规则
FlowRule rule =new FlowRule();
//定义资源
rule.tResource("echo");
//定义模式
rule.tGrade(RuleConstant.FLOW_GRADE_QPS);
//定义阈值
rule.tCount(2);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
public static void testFlowRule(){
initRule();
Entry entry = null;
for(int i =0; i <10; i++){
try{
entry = ("echo");
System.out.println("访问成功");
}catch(BlockException e){
System.out.println("当前访问⼈数过多,请刷新后重新!");
}finally{
if(entry != null){
}
}
粗通文墨
}
}
// ============== 执⾏结果 =================
/**
访问成功
访问成功
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
当前访问⼈数过多,请刷新后重试!
*/
通过上⾯的代码可以测试出:当我们使⽤QPS为阈值类型时,并设置阈值为2,定义资源,其他默认,则表⽰⼀秒内,只需要通过两次请求,其他的均失败。
initRule()⽅法相当于在页⾯这样设置: