返回
系统微服务:Sentinel源码(五)之ProcessorSlot(下)
后端
2023-11-24 18:32:49
热点参数流控规则校验
热点参数流控规则校验位于Sentinel源码中的ParamFlowSlot.java文件中,该类实现了热点参数的流控规则校验逻辑。具体实现如下:
@Override
public boolean enter(String itemName, Context context) {
FlowRule rule = ruleManager.getMatchedRule(context);
if (rule != null) {
Entry entry = findOrCreateEntry(itemName, context, rule.getRefResource());
return doCheck(entry, itemName, context, rule);
}
return true;
}
private Entry findOrCreateEntry(String itemName, Context context, String refResource) {
Entry entry = entries.get(itemName);
if (entry == null) {
entry = new Entry(context, ruleManager.getFlowRule(refResource));
entries.putIfAbsent(itemName, entry);
}
return entry;
}
private boolean doCheck(Entry entry, String itemName, Context context, FlowRule rule) {
int count = entry.acquire();
if (count <= rule.getCount()) {
// 流量可以通过
return true;
} else {
// 流量被拒绝
return false;
}
}
首先,ParamFlowSlot.java
获取与当前请求匹配的流控规则。如果存在匹配的规则,则创建或查找与请求相关的Entry。Entry包含请求上下文、流控规则和请求计数等信息。然后,ParamFlowSlot.java
根据流控规则和当前请求的计数判断是否允许请求通过。如果请求计数超过了流控规则的限制,则拒绝请求;否则,允许请求通过。
降级规则校验
降级规则校验位于Sentinel源码中的DegradeSlot.java文件中,该类实现了降级规则的校验逻辑。具体实现如下:
@Override
public boolean enter(String itemName, Context context) {
DegradeRule rule = ruleManager.getMatchedRule(context);
if (rule != null) {
Entry entry = findOrCreateEntry(itemName, context, rule.getRefResource());
return doCheck(entry, itemName, context, rule);
}
return true;
}
private Entry findOrCreateEntry(String itemName, Context context, String refResource) {
Entry entry = entries.get(itemName);
if (entry == null) {
entry = new Entry(context, ruleManager.getDegradeRule(refResource));
entries.putIfAbsent(itemName, entry);
}
return entry;
}
private boolean doCheck(Entry entry, String itemName, Context context, DegradeRule rule) {
if (entry.isBlocked()) {
// 请求被拒绝
return false;
} else {
// 请求可以通过
return true;
}
}
DegradeSlot.java
首先获取与当前请求匹配的降级规则。如果存在匹配的规则,则创建或查找与请求相关的Entry。Entry包含请求上下文、降级规则和请求计数等信息。然后,DegradeSlot.java
根据降级规则判断是否允许请求通过。如果请求被降级,则拒绝请求;否则,允许请求通过。
通过对热点参数流控规则校验和降级规则校验的详细介绍,我们对Sentinel源码有了更深入的理解,也对Sentinel如何实现微服务架构的保护功能有了更清晰的认识。