Sentinel
提供了多种类型的流量控制规则,每种规则都有其特定的应用场景和控制逻辑。以下是 Sentinel 中常用的流量控制规则类型及其简要说明:
1. QPS 限流(Query Per Second)
- 描述:限制单位时间内通过某个资源的请求数量。
- 应用场景:适用于对高频访问的接口进行限流,例如登录接口、热门商品详情页等。
- 配置参数:
- Resource:需要限流的资源名称。
- Threshold:每秒允许通过的最大请求数量。
- Grade:限流阈值类型,通常为
RuleConstant.FLOW_GRADE_QPS
。
2. 线程数限流
- 描述:限制某个资源在单位时间内允许并发的线程数。
- 应用场景:适用于计算密集型任务或需要长时间处理的任务。
- 配置参数:
- Resource:需要限流的资源名称。
- Threshold:允许并发的最大线程数。
- Grade:限流阈值类型,通常为
RuleConstant.FLOW_GRADE_THREAD
。
3. 响应时间限流
- 描述:当资源的平均响应时间超过设定的阈值时,触发限流。
- 应用场景:适用于对响应时间敏感的场景,确保系统在高负载下仍能保持较低的延迟。
- 配置参数:
- Resource:需要限流的资源名称。
- Threshold:平均响应时间的阈值。
- Grade:限流阈值类型,通常为
RuleConstant.FLOW_GRADE_RT
。
4. 热点参数限流
- 描述:针对请求中的某些参数进行限流,特别是那些具有热点特性的参数。
- 应用场景:适用于参数值分布不均的情况,例如商品ID、用户ID等。
- 配置参数:
- Resource:需要限流的资源名称。
- Threshold:参数值的QPS阈值。
- Param Index:参数在方法参数列表中的位置。
5. 授权规则(Access Control)
- 描述:限制特定客户端IP地址或用户组的访问权限。
- 应用场景:适用于需要对特定来源进行限流或拒绝的情况。
- 配置参数:
- Resource:需要限流的资源名称。
- Strategy:访问控制策略,如
RuleConstant.ACCESS_STRATEGY_WHITE
(白名单)或RuleConstant.ACCESS_STRATEGY_BLACK
(黑名单)。 - Cidr:客户端IP地址范围,使用CIDR表示法。
6. 系统规则
- 描述:对整个系统进行整体保护,防止系统过载。
- 应用场景:适用于全局性的流量控制,确保系统在高负载下仍能稳定运行。
- 配置参数:
- Threshold:系统级的阈值,可以是QPS、线程数、响应时间等。
- ControlBehavior:控制行为类型,如
RuleConstant.CONTROL_BEHAVIOR_DEFAULT
或RuleConstant.CONTROL_BEHAVIOR_WARM_UP
。
7. 链路限流
- 描述:对整个调用链路上的某个环节进行限流。
- 应用场景:适用于微服务架构中,对特定服务或链路进行限流。
- 配置参数:
- Resource:需要限流的资源名称。
- Threshold:限流阈值。
- Grade:限流阈值类型。
示例代码
以下是一个简单的示例代码,展示了如何配置和使用 QPS 限流规则:
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import java.util.ArrayList;
import java.util.List;
public class QpsLimitExample {
public static void main(String[] args) {
// 配置 QPS 限流规则
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("hello");
rule.setCount(10); // 每秒允许通过的最大请求数量
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 限流模式:QPS
rules.add(rule);
// 加载规则
FlowRuleManager.loadRules(rules);
// 测试限流
try {
// 尝试获取资源 "hello" 的 Entry
Entry entry = SphU.entry("hello");
System.out.println("Request passed.");
} catch (BlockException e) {
System.out.println("Request blocked.");
}
}
}
总结
通过这些流量控制规则,Sentinel 能够帮助你在不同的场景下实现精细化的流量控制,确保系统的稳定性和可用性。开发者可以根据实际需求选择合适的规则类型,并通过 Sentinel 控制台或编程方式配置规则,以适应不同的业务场景。