返回

系统微服务:Sentinel源码(五)之ProcessorSlot(下)

后端

热点参数流控规则校验

热点参数流控规则校验位于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如何实现微服务架构的保护功能有了更清晰的认识。