介绍
Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保障微服务的稳定性。
一个资源可以使用多个控制规则。
控制规则
流量
使用场景:当你想限制某个方法或一段代码的访问数量、线程并发数量时使用。
public static void main(String[] args) throws InterruptedException {
// 配置规则.
initFlowRules();
while (true) {
Thread.sleep(100);
// 开始进入名字叫HelloWord
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("我是资源");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}
/**
* 定义资源访问的限制
*/
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
// 定义需要被控制的资源名词
rule.setResource("HelloWorld");
// 按照每秒的请求数量来限制。也可以用 FLOW_GRADE_THREAD 限制并发数
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 每秒执行多少次开始限制
rule.setCount(5);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
熔断降级
在所设置的时间内,达到下面某一个条件时,发生熔断。
-
慢调用比例:统计一段时间的慢调用比例。慢调用是指请求超过你指定返回数据的时间。
-
异常比例:统计一段时间内异常占比。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
-
异常数量:超过指定的异常数量。
使用场景
当机器负载过高的时候,直接让服务失败或者不处理,避免雪崩情况发生。
系统保护
系统自适应保护从整体维度对应用入口流量进行控制,结合应用的 Load、总体平均返回时间 RT、入口 QPS* 和线程数等几个维度的监控指标,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
来源访问
使用场景:只允许某些渠道来访问你定义的资源。
private static final String RESOURCE_NAME = "Store";
public static void main(String[] args) {
System.out.println("========黑名单列表测试========");
initBlackRules("appA,appB");
testFor(RESOURCE_NAME, "appA");
testFor(RESOURCE_NAME, "appB");
testFor(RESOURCE_NAME, "appC");
testFor(RESOURCE_NAME, "appE");
System.out.println("========白名单列表测试========");
initWhiteRules("appA,appB");
testFor(RESOURCE_NAME, "appA");
testFor(RESOURCE_NAME, "appB");
testFor(RESOURCE_NAME, "appC");
testFor(RESOURCE_NAME, "appE");
}
private static void testFor(/*@NonNull*/ String resource, /*@NonNull*/ String origin) {
ContextUtil.enter(resource, origin);
Entry entry = null;
try {
entry = SphU.entry(resource);
System.out.println(String.format("通过资源 %s, 来源是 %s", resource, origin));
} catch (BlockException ex) {
System.err.println(String.format("封锁资源 %s, 来源是 %s", resource, origin));
} finally {
if (entry != null) {
entry.exit();
}
ContextUtil.exit();
}
}
/**
* 设置白名单
* @param limitApp 可以访问渠道
*/
private static void initWhiteRules(String limitApp) {
AuthorityRule rule = new AuthorityRule();
rule.setResource(RESOURCE_NAME);
rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
rule.setLimitApp(limitApp);
AuthorityRuleManager.loadRules(Collections.singletonList(rule));
}
/**
* 设置黑名单
* @param limitApp 限制访问的渠道
*/
private static void initBlackRules(String limitApp) {
AuthorityRule rule = new AuthorityRule();
rule.setResource(RESOURCE_NAME);
rule.setStrategy(RuleConstant.AUTHORITY_BLACK);
rule.setLimitApp(limitApp);
AuthorityRuleManager.loadRules(Collections.singletonList(rule));
}