sentinel 配置使用

1. 引入依赖

在 pom.xml 中添加 Sentinel 依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>
<!-- Spring Cloud Alibaba Sentinel Starter -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2021.0.5.0</version>
</dependency>

2. 基本配置(application.yml)

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # Sentinel 控制台地址
        port: 8719                # 应用与控制台通信端口
      eager: true                 # 启动时立即建立连接

3. 启动 Sentinel 控制台

下载 Sentinel 控制台,运行:

java -jar sentinel-dashboard-xxx.jar

默认端口是 8080


4. 代码中使用 Sentinel 注解

比如对某个接口限流:

@RestController
public class TestController {

    @GetMapping("/hello")
    @SentinelResource(value = "hello", blockHandler = "handleBlock")
    public String hello() {
        return "Hello, Sentinel!";
    }

    public String handleBlock(BlockException ex) {
        return "请求被限流啦!";
    }
}

5. 配置规则(方式)

  • 控制台配置:推荐,直观易用。
  • 代码配置:如限流规则,可以在启动时通过代码加载。

示例:代码方式添加限流规则

List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("hello");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(2); // QPS = 2
rules.add(rule);
FlowRuleManager.loadRules(rules);

6. 常见规则类型

  • 限流(FlowRule)
  • 熔断降级(DegradeRule)
  • 热点参数限流(ParamFlowRule)
  • 系统保护(SystemRule)

7. Sentinel 配置文件方式

可以通过 sentinel.properties 文件进行配置,常见参数如下:

csp.sentinel.dashboard.server=localhost:8080
csp.sentinel.api.port=8719

8. 与 Nacos、Apollo 等配置中心集成

可以将 Sentinel 规则持久化到 Nacos、Apollo 等配置中心,实现动态规则变更。

9. 常见规则详细说明

9.1 限流规则(FlowRule)

  • 资源名:需要保护的资源(如接口名、方法名等)。
  • 限流阈值:如 QPS、线程数。
  • 限流模式:直接、关联、链路。
  • 流控效果:快速失败、排队等待、预热。

示例代码:

FlowRule rule = new FlowRule();
rule.setResource("testResource");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(5); // 每秒最多 5 次
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); // 直接拒绝
FlowRuleManager.loadRules(Collections.singletonList(rule));

9.2 熔断降级规则(DegradeRule)

  • 触发条件:慢调用比例、异常比例、异常数。
  • 熔断时长:熔断多少秒后自动恢复。

示例代码:

DegradeRule rule = new DegradeRule();
rule.setResource("testResource");
rule.setGrade(CircuitBreakRuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
rule.setCount(0.5); // 异常比例达到 50% 时熔断
rule.setTimeWindow(10); // 熔断 10 秒
DegradeRuleManager.loadRules(Collections.singletonList(rule));

9.3 热点参数限流(ParamFlowRule)

针对带参数的接口,可以根据参数值限流。

ParamFlowRule rule = new ParamFlowRule("testParamResource")
    .setParamIdx(0) // 对第一个参数限流
    .setCount(10);  // 每秒最多 10 个不同参数访问
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));

9.4 系统保护规则(SystemRule)

根据系统负载、CPU 使用率等自动保护。

SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(3.0);
SystemRuleManager.loadRules(Collections.singletonList(rule));

10. 规则持久化

10.1 Nacos 持久化

在 application.yml 中配置:

spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: ${spring.application.name}-sentinel-flow
            groupId: DEFAULT_GROUP
            rule-type: flow

这样配置后,限流规则会自动从 Nacos 加载和持久化。

10.2 Apollo、ZooKeeper 等

可以参考 官方文档 配置。


11. 微服务场景下的 Sentinel

11.1 与 Spring Cloud Gateway 集成

引入依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置 application.yml

spring:
  cloud:
    gateway:
      sentinel:
        enabled: true

通过控制台或配置中心管理限流规则。

11.2 与 Feign、RestTemplate 集成

Feign 客户端自动支持 Sentinel,可通过 @SentinelResource 注解实现自定义降级逻辑。


12. Sentinel 控制台使用技巧

  • 登录控制台后,左侧菜单可以选择流控规则降级规则等,针对具体资源进行配置。
  • 支持实时监控,查看 QPS、响应时间等指标。
  • 支持集群限流,适用于分布式场景。

13. 常见问题与解决

  • 控制台无法连接:检查端口和防火墙,确保 dashboard 地址和端口正确。
  • 规则不生效:确认资源名(如接口名)与规则一致,且已正确加载。
  • 持久化失败:检查配置中心地址和权限,确保应用能访问 Nacos/Apollo。

14. 集群限流(Cluster Flow Control)

在分布式系统中,单机限流可能不够,需要集群限流。

14.1 集群限流模式

  • 客户端模式:业务服务作为客户端,所有限流请求发送到集群服务端处理。
  • 服务端模式:专门部署 Sentinel 集群服务端,负责限流规则的统一管理和计算。

14.2 集群限流部署步骤

  1. 下载并启动 Sentinel 集群服务端
    参考 官方文档 下载集群服务端 jar 包,启动服务端。

  2. 配置业务服务为客户端
    在 application.yml 或 sentinel.properties 配置集群服务端地址:

    csp.sentinel.cluster.server.host=127.0.0.1
    csp.sentinel.cluster.server.port=7777
    csp.sentinel.cluster.request.timeout=200
    
  3. 配置规则
    可以通过控制台或 API 设置集群限流规则。


15. 自定义扩展

Sentinel 支持多种自定义扩展,主要包括:

15.1 自定义 BlockException 处理

可以全局处理限流/降级异常,提升用户体验。

public class MyUrlBlockHandler implements UrlBlockHandler {
    @Override
    public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {
        response.setStatus(429);
        response.getWriter().write("自定义限流提示:请求太快啦!");
    }
}

然后注册到 Spring:

@Bean
public UrlBlockHandler urlBlockHandler() {
    return new MyUrlBlockHandler();
}

15.2 自定义资源定义

Sentinel 支持对任意代码块进行保护:

Entry entry = null;
try {
    entry = SphU.entry("myCustomResource");
    // 受保护的业务逻辑
} catch (BlockException ex) {
    // 限流处理
} finally {
    if (entry != null) {
        entry.exit();
    }
}

16. 监控与报警

16.1 控制台监控

Sentinel 控制台可以实时监控每个资源的 QPS、RT、Block 次数等。

16.2 集成外部监控系统

  • Prometheus:通过 Sentinel Adapter for Prometheus 导出指标。
  • 自定义报警:通过实现 com.alibaba.csp.sentinel.slots.block.BlockException 的处理器,将报警信息推送到钉钉、邮件等。

17. 动态规则推送

Sentinel 支持多种动态规则推送方式:

  • Nacos:推荐,支持规则热更新。
  • ApolloZooKeeperEtcd:适合不同的配置中心场景。

配置示例(Nacos):

spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            server-addr: 127.0.0.1:8848
            dataId: ${spring.application.name}-sentinel-flow
            groupId: DEFAULT_GROUP
            rule-type: flow

18. 常见最佳实践

  • 资源名规范:建议用 服务名:接口名 作为资源名,便于管理。
  • 规则分级管理:不同业务、不同环境可配置不同的限流/降级规则。
  • 预警机制:及时发现限流、熔断现象,快速定位问题。
  • 灰度发布规则:可以先只对部分流量或接口启用限流,逐步扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猩火燎猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值