微服务保护概述

微服务架构中,服务拆分后可能面临高并发、流量突增、依赖服务不稳定等问题,需引入保护机制保障系统稳定性。黑马商城采用Spring Cloud Alibaba生态的Sentinel实现流量控制、熔断降级等核心功能,下文从实际场景出发解析关键配置与代码示例。


Sentinel基础集成

依赖引入
pom.xml中添加Sentinel核心依赖:

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

控制台配置
通过application.yml启用控制台对接:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel控制台地址
      eager: true  # 取消懒加载

流量控制规则

QPS限流示例
对商品查询接口限制每秒最大请求数为50:

@GetMapping("/product/{id}")
@SentinelResource(value = "getProduct", blockHandler = "handleBlock")
public Product getProduct(@PathVariable Long id) {
    return productService.findById(id);
}

// 限流降级处理逻辑
public Product handleBlock(Long id, BlockException ex) {
    return Product.builder().name("默认商品").build();  // 返回兜底数据
}

控制台配置
在Sentinel控制台“流控规则”中设置:

  • 资源名:getProduct
  • 阈值类型:QPS=50
  • 流控模式:直接

熔断降级策略

异常比例熔断
当订单服务异常比例超过60%时,触发熔断10秒:

@SentinelResource(
    value = "createOrder",
    fallback = "orderFallback",
    exceptionsToIgnore = {IllegalArgumentException.class}  // 忽略特定异常
)
public Order createOrder(OrderDTO dto) {
    return orderService.create(dto);
}

// 熔断降级方法
public Order orderFallback(OrderDTO dto, Throwable ex) {
    log.error("触发熔断", ex);
    return Order.builder().status("服务降级中").build();
}

控制台配置

  • 熔断策略:异常比例
  • 比例阈值:60%
  • 熔断时长:10秒
  • 最小请求数:5(触发统计的最低请求量)

热点参数限流

针对商品详情页中频繁访问的特定商品ID进行限流:

@GetMapping("/product/hot/{id}")
@SentinelResource(
    value = "hotProduct",
    paramFlowKey = "id",  // 热点参数名
    blockHandler = "hotBlockHandler"
)
public Product hotProduct(@PathVariable Long id) {
    return productService.getHotProduct(id);
}

控制台配置
在热点规则中指定参数索引(0表示第一个参数),并设置例外项:

  • 参数类型:基本类型/字符串
  • 参数索引:0
  • 单机阈值:100(普通请求)
  • 例外配置:id=101的商品阈值设为500

系统自适应保护

通过全局维度保护系统稳定性:

spring:
  cloud:
    sentinel:
      filter:
        enabled: false  # 关闭Web层拦截
      system:
        rules:
          - highestSystemLoad: 8.0  # 最大LOAD值
            avgRt: 2000  # 平均响应时间(ms)
            maxThread: 500  # 最大并发线程数
            qps: 1000  # 入口总QPS

持久化规则配置

默认规则内存存储,重启失效,可通过Nacos持久化:

spring:
  cloud:
    sentinel:
      datasource:
        ds1:
          nacos:
            server-addr: ${nacos.server}
            dataId: ${spring.application.name}-sentinel
            ruleType: flow  # 规则类型(flow/degrade/param)

最佳实践总结

  1. 精细化配置:结合业务场景设置不同资源名的阈值,避免一刀切
  2. 降级处理:所有@SentinelResource注解方法必须定义blockHandlerfallback
  3. 监控联动:集成Prometheus+Grafana实现实时监控
  4. 压测验证:通过JMeter模拟流量验证规则有效性

完整示例代码可参考黑马商城GitHub仓库,实际部署时需根据硬件性能调整阈值参数。

更多推荐