返回
Sentinel源码4-NodeSelectorSlot和ClusterBuilderSlot详解
后端
2023-10-12 08:12:06
NodeSelectorSlot
NodeSelectorSlot是Sentinel用来做node选择的一个Slot。在Sentinel中,node是一个逻辑上的概念,它代表着一个被保护的资源。NodeSelectorSlot的作用就是根据一定的策略从所有可用的node中选择一个node作为当前请求的处理节点。
NodeSelectorSlot有多种策略可供选择,包括:
- 轮询: 这种策略简单有效,它会轮流选择所有可用的node。
- 加权轮询: 这种策略会根据每个node的权重来选择node。权重较高的node被选中的概率也越高。
- 随机: 这种策略会随机选择一个可用的node。
- 一致性哈希: 这种策略会根据请求的key来选择node。这样可以保证相同key的请求总是被同一个node处理。
NodeSelectorSlot的具体实现如下:
public class NodeSelectorSlot extends AbstractSlot {
private List<Node> nodes;
private SelectorStrategy selectorStrategy;
public NodeSelectorSlot(List<Node> nodes, SelectorStrategy selectorStrategy) {
this.nodes = nodes;
this.selectorStrategy = selectorStrategy;
}
@Override
public Node select(Object... args) {
return selectorStrategy.select(nodes, args);
}
}
ClusterBuilderSlot
ClusterBuilderSlot是Sentinel为相同资源的不同线程创建node的Slot。在Sentinel中,ClusterBuilderSlot是一个特殊的Slot,它不负责做node选择,而是负责为相同资源的不同线程创建node。
ClusterBuilderSlot的具体实现如下:
public class ClusterBuilderSlot extends AbstractSlot {
private String resourceName;
public ClusterBuilderSlot(String resourceName) {
this.resourceName = resourceName;
}
@Override
public Node select(Object... args) {
String clusterName = args[0].toString();
return ClusterBuilder.buildNode(resourceName, clusterName);
}
}
总结
NodeSelectorSlot和ClusterBuilderSlot是Sentinel中两个重要的Slot。NodeSelectorSlot负责做node选择,而ClusterBuilderSlot负责为相同资源的不同线程创建node。这两个Slot在Sentinel的资源保护机制中发挥着重要的作用。