在Spring Cloud Alibaba中,Sentinel作为流量控制的主要工具,提供了多种类型的流量控制规则,以适应不同的业务场景和需求。这些规则可以帮助你实现限流、熔断、降级等目的。以下是Sentinel提供的主要流量控制规则类型:
1. 流量控制规则(Flow Control Rules)
流量控制规则是最基本的规则类型,用于限制单位时间内到达系统的请求数量。主要有两种流量控制等级:
- 直接(Direct):直接限制每秒的请求量(QPS)或线程数(Thread)。这是最简单的形式,适合于大多数场景。
FlowRule rule = new FlowRule();
rule.setResource("your-resource-name");
rule.setGrade(SentinelConst.FLOW_GRADE_QPS); // QPS 基于每秒请求量
rule.setCount(200); // 设置每秒最多接受的请求数
- 关联(Linked):除了直接限制自身资源外,还可以关联到其他资源的QPS或线程数。当关联资源超过设定阈值时,也会触发流控。
FlowRule linkedRule = new FlowRule();
linkedRule.setResource("your-resource-name");
linkedRule.setGrade(SentinelConst.FLOW_GRADE_QPS);
linkedRule.setCount(200);
linkedRule.setControlBehavior(SentinelConst.CONTROL_TRAFFIC_SHAPING);
linkedRule.setClusterMode(true);
linkedRule.setLinkedResources(new LinkedResource[]{new LinkedResource("linked-resource-name")});
2. 热点规则(HotKey Rule)
热点规则用于限制针对某个热点参数的请求频率,特别适用于参数敏感的场景。例如,限制针对特定用户ID的请求频率。
HotParamFlowRule hotParamRule = new HotParamFlowRule();
hotParamRule.setResource("your-resource-name");
hotParamRule.setParamIdx(0); // 参数索引
hotParamRule.setThreshold(100); // 阈值
hotParamRule.setThresholdType(ThresholdType.ENTRY_COUNT); // 阈值类型
3. 系统规则(System Rule)
系统规则用于保护整个JVM或机器的系统健康度,例如根据CPU使用率、平均负载、线程数等指标进行流量控制。
SystemRule systemRule = new SystemRule();
systemRule.setResource("your-resource-name");
systemRule.setMetric(SystemRuleConstant.CPU_USAGE); // CPU使用率
systemRule.setThreshold(80); // 阈值
systemRule.setStrategy(SystemRuleConstant.WARM_UP_STRATEGY); // 策略
4. 授权规则(Authority Rule)
授权规则允许或拒绝来自特定来源的请求,比如基于客户端IP地址或用户身份信息。
AuthorityRule authorityRule = new AuthorityRule();
authorityRule.setResource("your-resource-name");
authorityRule.setStrategy(AuthorityRuleConstant.AUTHORITY_WHITE_LIST);
authorityRule.setLimitApp("app1, app2"); // 应用程序列表
5. 降级规则(Degrade Rule)
降级规则用于在系统负载较高时主动降低服务的可用性,避免系统崩溃或长时间延迟。例如,根据异常比例或异常数来判断是否需要降级。
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("your-resource-name");
degradeRule.setCount(10); // 异常计数
degradeRule.setStatIntervalInMs(1000); // 统计间隔
degradeRule.setRuleType(DegradeRuleConstant.DEGRADE_BY_EXCEPTION_COUNT); // 降级类型
6. 链路规则(Chain Rule)
链路规则可以将多个规则组合在一起,形成一个规则链路,使得规则生效更为灵活。
ChainNode node1 = ChainNode.createFlowNode("resource1", 200);
ChainNode node2 = ChainNode.createDegradeNode("resource2", 10);
ChainNode node3 = ChainNode.createAuthorityNode("resource3", AuthorityRuleConstant.AUTHORITY_WHITE_LIST, "127.0.0.1");
ChainRule chainRule = new ChainRule();
chainRule.setResource("your-resource-name");
chainRule.setNodes(new ChainNode[]{node1, node2, node3});
通过这些规则类型,你可以根据实际业务需求灵活配置Sentinel来实现不同的流量控制策略。这些规则可以单独使用,也可以组合起来形成复杂的控制逻辑。