【sentinel】深入浅出之原理篇ClusterBuilderSlot

ClusterBuilderSlot则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;

public class ClusterBuilderSlot extends AbstractLinkedProcessorSlot {
    private static volatile Map clusterNodeMap = new HashMap<>();
    private static final Object lock = new Object();
    private volatile ClusterNode clusterNode = null;
    @Override
    public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count,
                      boolean prioritized, Object... args)
        throws Throwable {
        //判断clusterNode是否为null,一个Resource共享同一个Chain,这里,一个Resource共享同一个clusterNode
        if (clusterNode == null) {
            synchronized (lock) {
                if (clusterNode == null) {
                    // 创建一个新的CusterNode,并保存
                    clusterNode = Env.nodeBuilder.buildClusterNode();
                    HashMap newMap = new HashMap<>(Math.max(clusterNodeMap.size(), 16));
                    newMap.putAll(clusterNodeMap);
                    newMap.put(node.getId(), clusterNode);
                    clusterNodeMap = newMap;
                }
            }
        }
        //设置ClusterNode
        node.setClusterNode(clusterNode);
        //如果orgin不为"",则需要设置orginNode
        if (!"".equals(context.getOrigin())) {
            Node originNode = node.getClusterNode().getOrCreateOriginNode(context.getOrigin());
            context.getCurEntry().setOriginNode(originNode);
        }
        fireEntry(context, resourceWrapper, node, count, prioritized, args);
    }
}

由于一个ContextName对应的同一个Resource共享同一个SlotChain,所以同一个ContextName对应的同一个Resource对应同一个ClusterBuilderSlot,由于一个ClusterBuilderSlot对应一个ClusterNode,所以同一个ContextName对应的同一个Resource对应同一个ClusterNode

你可能感兴趣的:(【sentinel】深入浅出之原理篇ClusterBuilderSlot)