Spring Cloud Alibaba 实战:Sentinel 保障微服务的高可用性与流量防护

1.1 Sentinel 作用

Sentinel 是阿里巴巴开源的一款 流量控制和熔断降级 框架,主要用于:

  • 流量控制:限制 QPS,防止流量暴增导致系统崩溃
  • 熔断降级:当某个服务不可用时自动降级,避免故障扩散
  • 热点参数限流:根据参数值进行精细化流控(例如 VIP 用户限流策略)
  • 系统自适应保护:根据系统负载自动调整限流规则
  • 授权规则:根据来源服务进行限流
  • API 网关防护:结合 Spring Cloud Gateway 保护微服务

1.2 Sentinel 核心概念

概念 说明
资源 (Resource) 需要保护的代码逻辑(如方法、API)
规则 (Rule) 限流、熔断等策略
流控 (Flow Control) 限制 QPS、线程数等
熔断 (Circuit Breaker) 基于响应时间或错误比率触发熔断
热点限流 (Hot Param Flow) 针对特定参数进行限流
系统规则 (System Rule) 保护系统整体资源
授权规则 (Authority Rule) 根据请求来源控制访问

2. 引入 Sentinel 依赖

在 pom.xml 中添加 Sentinel 依赖:

java 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

Spring Boot 自动整合 Sentinel,无需额外配置。


3. 启动 Sentinel 控制台

3.1 下载并运行 Sentinel 控制台

  1. 下载 Sentinel Dashboard

    java 复制代码
    wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
  2. 启动控制台

    java 复制代码
    java -jar sentinel-dashboard-1.8.6.jar
  3. 访问 Sentinel 控制台

    1. URL: http://localhost:8080
    2. 默认账号:sentinel
    3. 默认密码:sentinel

4. 配置 Sentinel

在 application.yml 添加 Sentinel 连接控制台:

java 复制代码
spring:
  application:
    name: sentinel-demo
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719  # 本地 Sentinel 客户端通信端口

这样,Sentinel 客户端会自动向控制台注册。


5. 流量控制

流控规则可以基于 QPS 、线程数 等方式进行限流。

5.1 代码示例

在 SentinelController.java 创建受保护的接口:

java 复制代码
@RestController
public class SentinelController {

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

    // 限流时的处理方法
    public String handleBlock(BlockException ex) {
        return "请求被限流";
    }
}

5.2 配置流控规则

在 Sentinel 控制台 添加流控规则:

  • 资源名称 :testResource
  • 流控模式:QPS
  • 阈值:1(超过 1 QPS 就触发限流)
  • 流控效果:直接拒绝

测试:

java 复制代码
ab -n 10 -c 2 http://localhost:8080/test

如果请求过多,就会返回 "请求被限流"。


6. 熔断降级

Sentinel 支持基于:

  1. RT(响应时间):如果平均响应时间超过阈值,就会熔断。
  2. 异常比例:如果异常请求占比超过阈值,就会熔断。
  3. 异常数:一定时间内异常数超过阈值,就会熔断。

6.1 代码示例

java 复制代码
@RestController
public class CircuitBreakerController {

    @GetMapping("/slow")
    @SentinelResource(value = "slowService", fallback = "fallbackMethod")
    public String slowService() throws InterruptedException {
        Thread.sleep(2000);
        return "Slow Service";
    }

    // 降级处理
    public String fallbackMethod(Throwable t) {
        return "降级:服务不可用";
    }
}

6.2 Sentinel 控制台配置

  • 资源名称 :slowService
  • 熔断策略:响应时间
  • RT 阈值:1000ms(如果超过 1s,就会熔断)

7. 热点参数限流

针对某个 URL 参数进行限流,例如:

java 复制代码
@RestController
public class HotParamController {

    @GetMapping("/paramLimit")
    @SentinelResource(value = "hotParam", blockHandler = "handleHotParam")
    public String hotParam(@RequestParam String type) {
        return "Access type: " + type;
    }

    public String handleHotParam(String type, BlockException ex) {
        return "请求被限流:" + type;
    }
}

Sentinel 控制台配置

  • 资源名称 :hotParam
  • 限流方式:按参数
  • 参数1 :type=vip,QPS 限制 1

测试:

java 复制代码
curl "http://localhost:8080/paramLimit?type=vip"

8. 结合 Nacos 进行规则动态推送

在 application.yml 配置:

java 复制代码
spring:
  cloud:
    sentinel:
      datasource:
        flow:
          nacos:
            server-addr: localhost:8848
            data-id: sentinel-rules
            group-id: DEFAULT_GROUP
            rule-type: flow

在 Nacos 配置 sentinel-rules:

java 复制代码
[
  {
    "resource": "testResource",
    "limitApp": "default",
    "grade": 1,
    "count": 2,
    "strategy": 0,
    "controlBehavior": 0
  }
]

这样 Sentinel 规则可以动态调整,无需重启服务。


9. 监控 API 网关

Sentinel 结合 Spring Cloud Gateway 保护 API 网关:

java 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: service1
          uri: lb://service1
          predicates:
            - Path=/service1/**
          filters:
            - name: Sentinel

在 Sentinel 控制台可以查看 API 访问流量。


10. 总结

功能 说明
流量控制 限制 QPS、线程数,防止瞬时流量过载
熔断降级 避免错误扩散,提高系统稳定性
热点限流 只对特定参数进行限流
动态规则 结合 Nacos 实现规则热更新
API 网关保护 结合 Spring Cloud Gateway 保护微服务

🔥 如果这篇文章有帮助,欢迎 点赞、收藏、评论,你的支持是我持续更新的动力!🚀

相关推荐
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
我不会起名字32210 小时前
Redis 从 0 到 1(九):主库宕机 30 秒自动切主——1 主 2 从 3 哨兵 + Go 客户端
redis·docker·sentinel·高可用·哨兵
我不会起名字32214 小时前
微服务链路超时怎么设:逐层收敛的 4 条规则与 1 个反例
微服务·go·超时·熔断
Msshu12318 小时前
PD快充诱骗取电芯片工作原理,XSP17诱骗取电5V9V12V15V20V功能测试
spring boot·spring cloud·sentinel·java-rocketmq·java-zookeeper·java-consul·java-activemq
Wang's Blog20 小时前
Java 项目实战: 交友项目 - 章节复盘:微服务骨架与手机号验证码登录
java·微服务·交友
我不会起名字3221 天前
负载均衡选错:轮询在长连接下的偏斜问题
微服务·负载均衡·grpc·长连接
code_slave(码畜)2 天前
微服务架构落地:OpenFeign 服务远程调用 + 线程池隔离架构实战 —— 超时控制、重试机制、线程池隔离,防雪崩
spring boot·spring cloud·微服务·云原生·架构·openfeign
涵美女程序猿2 天前
ChatCut online 剪微服务熔断测试录屏:仪表盘告警、降级日志与恢复时刻怎样对应
程序人生·微服务·云原生·架构·电脑
hhb_6182 天前
智联AI办公微服务技术全解析
人工智能·微服务·架构
Thomas.Sir2 天前
第31课:微服务消息驱动(RabbitMQ/RocketMQ)适配与解耦实战
微服务·rabbitmq·rocketmq