返回

Sentinel源码4-NodeSelectorSlot和ClusterBuilderSlot详解

后端

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的资源保护机制中发挥着重要的作用。