Sentinel 是面向分布式服务架构的轻量级流量控制框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助您保护服务的稳定性。
1. Sentinel资源&规则
我们说的资源,可以是任何东西,服务,服务里的方法,甚至是一段代码。使用 Sentinel 来进行资源保护,主要分为两个步骤:
- 定义资源
- 定义规则
先把可能需要保护的资源定义好,之后再配置规则。也可以理解为,只要有了资源,我们就可以在任何时候灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。
2. Demo分析
以QPS流控为分析样例
定义规则
private static void initFlowQpsRule() {
//可以看出规则是个链表,那么意味着可以一个资源对应多个规则
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule1 = new FlowRule();
//规则设置资源名字
rule1.setResource("abc");
//设置现在qps为20
rule1.setCount(20);
//设置流控的规则的以QPS为准,还有以线程为准
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
//根据调用方进行流量控制,默认就是全部生效
rule1.setLimitApp("default");
rules.add(rule1);
//添加进流控规则管理中
FlowRuleManager.loadRules(rules);
}
定义资源
Entry entry = null;
try {
entry = SphU.entry(”abc“);
//意味着通过
} catch (BlockException e1) {
//意味着限流了
} catch (Exception e2) {
// 业务异常
} finally {
//确保这里一定要执行
if (entry != null) {
entry.exit();
}
}
可以看到这个限制了只能20个pass,其他block
Debug分析
entry = SphU.entry(”abc“);
SphU.entry
public static Entry entry(String name) throws BlockException {
return Env.sph.entry(name, EntryType.OUT, 1, OBJECTS0);
}
这里是sph.entry实际上是CtSph.entry方法
CtSph.entry
public Entry entry(String name, EntryType type, int count, Object... args) throws BlockException {
StringResourceWrapper resource = new StringResourceWrapper(name, type);
return entry(resource, count, args);
}
这里根据name和type创建个StringResourceWrapper,name是我们传递进去的abc,type是Ent