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

作为分布式系统的高可用防护组件,Sentinel的常规用法是开发者必须掌握的核心技能。本文将系统讲解Sentinel的基础配置、资源定义、规则管理以及高级特性,帮助您快速构建可靠的系统防护体系。

一、基础依赖配置

1.1 Maven依赖引入

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

<!-- 基础依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

<!-- Spring Cloud Alibaba集成 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.1</version>
</dependency>

版本选择建议

  • 生产环境建议使用最新稳定版(本文以1.8.6为例)
  • Spring Cloud Alibaba版本需要与Spring Boot版本对应

二、资源定义与保护

2.1 基础API用法

// 定义受保护的资源
public Order queryOrder(String orderId) {
    try (Entry entry = SphU.entry("orderResource")) {
        // 业务逻辑处理
        return orderService.getById(orderId);
    } catch (BlockException e) {
        // 流控或熔断时的处理逻辑
        log.warn("订单查询被限流,orderId: {}", orderId);
        return null;
    }
}

关键点说明

  • SphU.entry() 定义资源保护边界
  • try-with-resources语法确保Entry自动关闭
  • BlockException捕获流控/熔断异常

2.2 注解式资源定义

更推荐使用@SentinelResource注解:

@SentinelResource(
    value = "orderQuery",
    blockHandler = "queryOrderBlockHandler",
    fallback = "queryOrderFallback"
)
public Order queryOrder(String orderId) {
    return orderService.getById(orderId);
}

// 流控处理函数(参数需保持一致,最后加BlockException参数)
public Order queryOrderBlockHandler(String orderId, BlockException ex) {
    log.warn("触发流控,orderId: {}", orderId);
    return null;
}

// 熔断降级处理函数(可处理业务异常)
public Order queryOrderFallback(String orderId, Throwable t) {
    log.error("订单查询异常", t);
    return getCachedOrder(orderId);
}

注解参数解析

参数说明必填
value资源名称
blockHandler流控处理函数
fallback降级处理函数
exceptionsToIgnore忽略的异常

三、规则配置与管理

3.1 流控规则配置

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule()
    .setResource("orderQuery")  // 资源名
    .setGrade(RuleConstant.FLOW_GRADE_QPS)  // QPS模式
    .setCount(100)            // 阈值
    .setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP) // 预热模式
    .setWarmUpPeriodSec(10)    // 预热时间(秒)
    .setLimitApp("default");   // 调用来源

rules.add(rule);
FlowRuleManager.loadRules(rules);

流控效果对比

图1

3.2 熔断规则配置

List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule()
    .setResource("orderQuery")
    .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) // 异常比例
    .setCount(0.5)      // 阈值50%
    .setTimeWindow(10)  // 熔断时长(秒)
    .setMinRequestAmount(20); // 最小请求数

rules.add(rule);
DegradeRuleManager.loadRules(rules);

熔断策略对比

策略类型适用场景恢复方式
异常比例服务不稳定时间窗口后自动恢复
异常数明确异常阈值时间窗口后自动恢复
慢调用比例依赖服务响应慢超时请求比例触发

四、动态规则扩展

4.1 对接Nacos配置中心

// 初始化数据源
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = 
    new NacosDataSource<>(
        "nacos-server:8848",
        "DEFAULT_GROUP",
        "sentinel-flow-rules",
        source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {})
    );
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());

配置示例(Nacos)

[
  {
    "resource": "orderQuery",
    "grade": 1,
    "count": 100,
    "controlBehavior": 0
  }
]

4.2 文件系统监听

String rulePath = "/etc/sentinel/rules/flow.json";
FileRefreshableDataSource<List<FlowRule>> dataSource = 
    new FileRefreshableDataSource<>(
        rulePath,
        source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {})
    );
FlowRuleManager.register2Property(dataSource.getProperty());

五、生产实践建议

  1. 资源命名规范

    • 采用服务名:接口名格式(如order-service:queryOrder
    • 避免使用动态资源名(如含参数值)
  2. 规则配置原则

图2

  1. 监控与调优

    • 通过curl http://localhost:8719/metric获取实时指标
    • 重点关注:

      • passQps:通过请求数
      • blockQps:被拒请求数
      • rt:平均响应时间
  2. 常见问题处理

    • 规则不生效:检查资源名大小写是否一致
    • 热点限流失效:确保参数通过@SentinelResourceargs指定
    • 控制台无数据:检查客户端与控制台网络连通性

六、扩展阅读

  1. 官方文档:Sentinel Wiki
  2. 性能优化指南:滑动窗口实现原理
  3. 企业级案例:双11流量防护实战

通过本文介绍的基础用法,您已经可以构建完整的系统防护体系。建议在实际项目中结合监控指标不断调整规则参数,以达到最佳防护效果。

评论已关闭