Sentinel常规用法详解:从基础配置到生产实践

一、依赖引入与基础配置

1.1 基础依赖引入

在Maven项目中引入Sentinel核心依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

实践建议

  • 生产环境建议同时引入sentinel-transport-simple-http用于与Dashboard通信
  • 版本选择应保持与Spring Cloud Alibaba版本兼容

1.2 资源定义方式

Sentinel提供两种资源定义方式:

代码块方式

try (Entry entry = SphU.entry("queryOrder")) {
    // 被保护的业务逻辑
    return orderService.queryById(orderId);
} catch (BlockException e) {
    // 流控降级处理
    return fallbackMethod(orderId);
}

注解方式(需额外引入sentinel-annotation-aspectj):

@SentinelResource(value = "queryOrder", 
                 blockHandler = "blockHandlerMethod",
                 fallback = "fallbackMethod")
public Order queryOrder(String orderId) {
    // 业务逻辑
}

对比选择

方式优点缺点
代码块细粒度控制侵入性强
注解低侵入灵活性较低

二、规则配置详解

2.1 流控规则配置

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule()
    .setResource("queryOrder")
    .setGrade(RuleConstant.FLOW_GRADE_QPS) // QPS模式
    .setCount(100)                        // 阈值100 QPS
    .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP) // 预热模式
    .setWarmUpPeriodSec(10);              // 预热时间10秒
rules.add(rule);
FlowRuleManager.loadRules(rules);

流控效果对比

图1

2.2 熔断规则配置

List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule()
    .setResource("queryOrder")
    .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
    .setCount(0.5)  // 异常比例阈值50%
    .setTimeWindow(10); // 熔断时间10秒
rules.add(rule);
DegradeRuleManager.loadRules(rules);

熔断策略对比

  1. 慢调用比例(SLOW_REQUEST_RATIO)
  2. 异常比例(EXCEPTION_RATIO)
  3. 异常数(EXCEPTION_COUNT)

三、生产级实践

3.1 规则持久化方案

推荐通过Nacos实现动态规则配置:

ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(
    nacosServerAddr, groupId, dataId,
    source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {})
);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

配置中心对比

  • Nacos:适合Spring Cloud体系
  • ZooKeeper:适合Dubbo体系
  • Apollo:配置变更管理强大

3.2 最佳配置实践

  1. 阈值设定

    • 单机QPS = 系统总容量 / 节点数 * 安全系数(0.7)
    • 通过压测确定基准值
  2. 熔断恢复

图2

  1. 监控集成

    • 对接Prometheus:

      SentinelCollectorRegistry registry = new SentinelCollectorRegistry();
      CollectorRegistry.defaultRegistry.register(registry);

四、常见问题排查

  1. 规则不生效检查清单

    • 确认资源名称完全匹配(大小写敏感)
    • 检查规则是否成功加载到RuleManager
    • 确认未触发StatisticSlot的样本数不足保护(默认1000)
  2. 性能优化建议

    • 减少不必要的资源埋点
    • 对高频资源启用异步统计:

      @SentinelResource(value = "highFreqResource", 
                     entryType = EntryType.OUT)
  3. 热点参数特殊处理

    Entry entry = null;
    try {
        entry = SphU.entry(resourceName, EntryType.IN, 1, paramA);
        // 业务逻辑
    } finally {
        if (entry != null) {
            entry.exit(1, paramA);
        }
    }

通过以上实践,可以充分发挥Sentinel在生产环境中的流量防护能力。建议结合Sentinel Dashboard实时监控系统状态,并根据业务特点动态调整防护策略。

评论已关闭