在 Sentinel 中,集群流量控制(ClusterFlow)是一种高级流量控制特性,它允许在一个集群环境中对流量进行统一管理和协调。集群流量控制特别适用于分布式系统,其中多个应用实例共享相同的流量控制规则。通过集群流量控制,可以确保在整个集群范围内实施一致的限流策略,防止任何单一实例因过载而崩溃。
配置集群流量控制的步骤
集群流量控制的配置涉及到几个关键步骤:
- 定义资源:首先需要定义需要进行集群流量控制的资源。
- 配置集群规则:然后需要配置集群流量控制规则。
- 部署客户端和服务端:最后需要在客户端和服务端部署必要的组件来支持集群流量控制。
详细步骤
1. 定义资源
定义资源通常通过 @SentinelResource
注解来完成,或者通过 SphU.entry
方法显式地进入资源。
import com.alibaba.csp.sentinel.annotation.SentinelResource;
public class ClusterFlowExample {
@SentinelResource(value = "clusterFlowApi")
public String clusterFlowApi() {
// 业务逻辑
return "Hello from clusterFlowApi";
}
}
2. 配置集群规则
集群流量控制规则需要在 Sentinel 控制台上配置,或者通过编程的方式加载规则。集群规则通常包括以下内容:
- 资源名称:要进行集群流量控制的资源名称。
- 阈值:集群范围内的限流阈值。
- 统计窗口:统计窗口大小,单位为秒。
- 集群客户端 ID:集群中的客户端标识。
通过 Sentinel 控制台配置
在 Sentinel 控制台中,选择对应的应用,进入“流量控制”页面,然后添加新的集群流量控制规则。
通过编程方式配置
通过编程方式配置集群流量控制规则示例:
import com.alibaba.csp.sentinel.cluster.ClusterStateManager;
import com.alibaba.csp.sentinel.cluster.server.ClusterTokenServerProvider;
import com.alibaba.csp.sentinel.slots.block.flow.ClusterFlowConfig;
import com.alibaba.csp.sentinel.slots.block.flow.ClusterFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import java.util.ArrayList;
import java.util.List;
public class ClusterFlowConfigExample {
public static void initClusterFlowRules() {
// 初始化集群流量控制规则
List<ClusterFlowRule> rules = new ArrayList<>();
ClusterFlowRule rule = new ClusterFlowRule();
rule.setResource("clusterFlowApi");
rule.setCount(20); // 集群范围内的限流阈值
rule.setGrade(com.alibaba.csp.sentinel.slots.block.RuleConstant.FLOW_GRADE_QPS);
rule.setStatIntervalSec(10); // 统计窗口大小
rules.add(rule);
ClusterFlowConfig.loadRules(rules);
}
public static void main(String[] args) {
// 设置集群状态为集群客户端
ClusterStateManager.applyState(ClusterStateManager.CLUSTER_CLIENT);
// 配置集群客户端 ID
ClusterFlowConfig.setLocalClientAppId("client1");
// 初始化集群流量控制规则
initClusterFlowRules();
// 初始化集群服务器端
ClusterTokenServerProvider.init();
}
}
3. 部署客户端和服务端
- 客户端配置:在客户端,需要设置集群状态为集群客户端,并配置客户端 ID。
- 服务端配置:在服务端,需要启动集群流量控制服务,并配置服务端的监听地址等信息。
客户端配置
在客户端,除了初始化集群流量控制规则之外,还需要设置集群状态为集群客户端,并配置客户端 ID。
ClusterStateManager.applyState(ClusterStateManager.CLUSTER_CLIENT);
ClusterFlowConfig.setLocalClientAppId("client1");
服务端配置
在服务端,需要初始化集群流量控制服务,并配置服务端的监听地址等信息。
ClusterTokenServerProvider.init();
集群流量控制的工作原理
当客户端请求进入某个受保护的资源时,Sentinel 会检查该资源是否有集群流量控制规则。如果有,则会向集群中的所有客户端发送请求,以获取当前资源的使用情况。根据收集到的信息,Sentinel 会决定是否允许当前请求通过。
注意事项
- 集群同步:确保所有客户端和服务端的时间同步,以便于统计窗口的准确计算。
- 网络延迟:集群流量控制涉及到跨节点通信,因此需要考虑网络延迟对限流准确性的影响。
- 配置管理:确保集群流量控制规则能够在所有节点上保持一致。
通过以上步骤,你可以配置和管理 Sentinel 中的集群流量控制,确保在整个集群范围内实施一致的限流策略。这有助于提高分布式系统的稳定性和可靠性。