首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从0到1搭建Spring Boot 开发脚手架之集成熔断与限流

从0到1搭建Spring Boot 开发脚手架之集成熔断与限流

作者头像
紫风
发布2025-10-14 18:12:07
发布2025-10-14 18:12:07
800
代码可运行
举报
运行总次数:0
代码可运行

继续细化一下后续步骤中的 熔断与限流(Sentinel): 在网关或服务层配置QPS限流, 定义熔断规则,防止服务雪崩。希望能给大家带来帮助。

集成熔断与限流(Sentinel)详细教程
目标
  1. 限流:在网关层和服务层配置 QPS 限制,防止突发流量击垮系统。
  2. 熔断:在服务层定义熔断规则,当依赖服务不稳定时快速失败,避免雪崩效应。

1. 部署 Sentinel 控制台(Dashboard)
1.1 下载与启动

下载 Sentinel Dashboard

代码语言:javascript
代码运行次数:0
运行
复制
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar

启动控制台

代码语言:javascript
代码运行次数:0
运行
复制
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.6.jar
  • 访问 http://localhost:8080,默认账号密码:sentinel/sentinel

2. 网关层限流(Spring Cloud Gateway + Sentinel)
2.1 网关模块添加依赖
代码语言:javascript
代码运行次数:0
运行
复制
<!-- 网关模块的 pom.xml -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.2 配置限流规则
代码语言:javascript
代码运行次数:0
运行
复制
# application.yml
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel控制台地址
      eager: true  # 立即向控制台发送心跳
      # 网关限流配置
      scg:
        enabled: true
2.3 定义网关流控规则

动态规则(通过代码初始化)

代码语言:javascript
代码运行次数:0
运行
复制
@PostConstruct
public void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    // 对 /api/user/** 路径限流,QPS=2
    rules.add(new GatewayFlowRule("user_service_route")
        .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID)
        .setCount(2)
        .setIntervalSec(1));
    GatewayRuleManager.loadRules(rules);
}

动态规则(通过控制台配置)

  • 登录 Sentinel 控制台 → 网关管理 → API管理 → 添加路由ID(如 user_service_route)。
  • 在 流控规则 中设置 QPS=2。

3. 服务层熔断与限流(业务服务 + Sentinel)
3.1 业务模块添加依赖
代码语言:javascript
代码运行次数:0
运行
复制
<!-- 用户服务模块的 pom.xml -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
3.2 配置熔断规则
代码语言:javascript
代码运行次数:0
运行
复制
# application.yml
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080
      eager: true
3.3 定义熔断规则(示例:用户查询接口)
代码语言:javascript
代码运行次数:0
运行
复制
@Service
public class UserService {

    // 标记需要保护的资源
    @SentinelResource(
        value = "getUserById", 
        blockHandler = "handleBlock",   // 限流/降级处理
        fallback = "handleFallback"      // 异常处理
    )
    public User getUserById(Long id) {
        // 模拟数据库调用(实际业务中可能抛出异常)
        if (id < 0) throw new RuntimeException("Invalid User ID");
        return userMapper.selectById(id);
    }

    // 限流/降级处理逻辑
    public User handleBlock(Long id, BlockException ex) {
        return new User(-1L, "blocked_user", "请求过于频繁,请稍后重试!");
    }

    // 异常处理逻辑
    public User handleFallback(Long id, Throwable t) {
        return new User(-1L, "fallback_user", "服务暂时不可用:" + t.getMessage());
    }
}
3.4 在控制台配置熔断规则
  1. 熔断策略(基于异常比例):
    • 资源名getUserById
    • 熔断策略: 异常比例
    • 阈值: 0.5(50%异常触发熔断)
    • 熔断时长: 5秒
    • 最小请求数: 5(窗口内至少5次请求)

4. 验证熔断与限流
4.1 网关层限流验证

测试工具:使用 JMeter 或 curl 连续发送请求:

代码语言:javascript
代码运行次数:0
运行
复制
# 连续发送5次请求
for i in {1..5}; do curl http://localhost:8888/api/user/info; done

预期结果

  • 前2次请求成功,后续请求返回默认降级数据或 429 Too Many Requests
4.2 服务层熔断验证

触发异常

代码语言:javascript
代码运行次数:0
运行
复制
curl http://localhost:8081/user/-1  # 传入非法ID触发异常

观察熔断

  • 连续请求5次后,触发熔断规则,后续请求直接走 handleFallback 逻辑。
  • 5秒后恢复,重新尝试正常逻辑。

5. 高级配置
5.1 自定义限流异常响应
代码语言:javascript
代码运行次数:0
运行
复制
// 网关模块添加自定义限流处理器
@Component
public class SentinelBlockHandler implements BlockRequestHandler {
    @Override
    public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {
        String msg = "请求被限流,请稍后重试";
        if (t instanceof DegradeException) {
            msg = "服务降级中,请稍后重试";
        }
        return ServerResponse.status(429)
            .contentType(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromValue(Response.fail(429, msg)));
    }
}
5.2 规则持久化(Nacos)

添加依赖

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

配置Nacos数据源

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  cloud:
    sentinel:
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848
            dataId: sentinel-rules
            groupId: DEFAULT_GROUP
            rule-type: flow  # 规则类型(flow/degrade)
6. 关键注意事项
  1. 规则生效顺序:网关层限流优先于服务层熔断。
  2. 生产建议
    • 熔断阈值需根据压测结果调整,避免误触发。
    • 结合监控系统(如Prometheus)实时观察流量与熔断状态。
  3. 动态规则:优先通过控制台或Nacos管理规则,避免重启失效。

通过以上步骤,您的脚手架已集成 熔断与限流 能力,能够有效应对高并发和依赖故障场景。

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。 后续将继续把后续步骤继续完善,有什么遗漏、或者对什么功能有缺失的可以评论区,指出来,共同成长共同进步。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 集成熔断与限流(Sentinel)详细教程
    • 目标
  • 1. 部署 Sentinel 控制台(Dashboard)
    • 1.1 下载与启动
  • 2. 网关层限流(Spring Cloud Gateway + Sentinel)
    • 2.1 网关模块添加依赖
    • 2.2 配置限流规则
    • 2.3 定义网关流控规则
  • 3. 服务层熔断与限流(业务服务 + Sentinel)
    • 3.1 业务模块添加依赖
    • 3.2 配置熔断规则
    • 3.3 定义熔断规则(示例:用户查询接口)
    • 3.4 在控制台配置熔断规则
  • 4. 验证熔断与限流
    • 4.1 网关层限流验证
    • 4.2 服务层熔断验证
  • 5. 高级配置
    • 5.1 自定义限流异常响应
    • 5.2 规则持久化(Nacos)
  • 6. 关键注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档