【sentinel】深入浅出之原理篇ClusterBuilder
2019-03-18 本文已影响0人
一滴水的坚持
ClusterBuilderSlot
则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
public class ClusterBuilderSlot extends AbstractLinkedProcessorSlot<DefaultNode> {
private static volatile Map<ResourceWrapper, ClusterNode> 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<ResourceWrapper, ClusterNode> 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
。