Spring Cloud Alibaba:Sentinel实现熔断与限流
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.context.ContextUtil;
// 配置限流规则
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource(KEY);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 设置限流阈值类型为QPS,每秒允许通过的请求数为1
rule.setCount(1);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
public static void main(String[] args) {
// 初始化限流规则
initFlowRules();
// 通过SphU.entry("key")进入资源,如果被限流,则抛出BlockException异常
while (true) {
Entry entry = null;
try {
entry = SphU.entry(KEY);
// 被保护的代码
System.out.println("Hello, Sentinel!");
} catch (BlockException e) {
// 处理被限流后的逻辑
System.out.println("Blocked!");
} finally {
// 确保entry可以正常exit
if (entry != null) {
entry.exit();
}
}
// 每隔1秒钟执行一次
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这段代码展示了如何使用Sentinel进行限流。首先,我们配置了一个限流规则,设置了资源名称(KEY)和限流阈值。接着,在一个无限循环中,我们通过调用SphU.entry(KEY)
来访问资源,如果请求被限流,会抛出BlockException
异常。我们捕获这个异常并打印相关信息,然后继续循环。这个例子简单地展示了如何使用Sentinel进行限流,实际应用中可能需要根据具体情况调整限流策略和异常处理逻辑。
评论已关闭