Skip to content

08-微服务保护(Sentinel)

对应原始资料:高级01-微服务保护Jmeter快速入门.md

一、为什么需要微服务保护

微服务调用链中,一个下游服务故障可能引发雪崩(连锁失败),需要:

  • 限流:控制请求速率,超出拒绝。
  • 熔断降级:依赖不可用时快速失败,调用本地兜底。
  • 隔离:限制并发,避免线程耗尽。
  • 超时控制:快速释放资源。

二、Sentinel 是什么

阿里开源的流量治理组件,主打:

  • 流控(限流)。
  • 熔断降级。
  • 热点参数限流。
  • 系统自适应保护。
  • 配套 控制台 可视化配置规则。

三、Sentinel 控制台

bash
docker run -d --name sentinel -p 8858:8858 bladex/sentinel-dashboard

访问 http://localhost:8858,默认 sentinel/sentinel

四、客户端接入

1. 依赖

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

2. 配置

yaml
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8858
        port: 8719        # 与控制台通信端口

启动后访问任意接口,控制台即可看到该服务。

五、流量控制(QPS / 线程数)

1. 阈值类型

  • QPS:每秒请求数。
  • 并发线程数:同时执行的线程数。

2. 流控模式

  • 直接:对资源本身限流。
  • 关联:关联另一个资源,如写接口 QPS 高时限制读接口。
  • 链路:只限制某条调用链路。

3. 流控效果

  • 快速失败:直接抛异常。
  • Warm Up:预热,初始阈值低,逐渐升到设定。
  • 排队等待:匀速通过(令牌桶)。

六、熔断降级

熔断策略

  • 慢调用比例:响应时间 > 阈值的比例超阈值 → 熔断。
  • 异常比例:异常率超阈值 → 熔断。
  • 异常数:异常数超阈值 → 熔断。

状态机

CLOSED(正常) ── 触发条件 ──► OPEN(熔断,拒绝请求)
                                    │  等待时间到

                          HALF_OPEN(半开,试探少量请求)
                              │ 成功 → CLOSED
                              │ 失败 → OPEN

七、热点参数限流

对特定参数值单独限流(如"热门商品 ID 限流 2,其他 10")。

八、Feign 整合 Sentinel(降级必备)

yaml
feign:
  sentinel:
    enabled: true

定义 fallback 类:

java
@FeignClient(name = "order-service", fallback = OrderClientFallback.class)
public interface OrderClient { ... }

@Component
public class OrderClientFallback implements OrderClient {
    public Order getById(Long id) {
        return new Order(-1L, "降级:服务不可用");    // 兜底数据
    }
}

九、授权规则

根据请求来源(origin)决定放行/拒绝,配合 Gateway 传 origin 头实现黑白名单。

十、系统规则

根据系统负载(CPU、Load、平均 RT、入口 QPS、并发线程)自适应限流,全局兜底

十一、@SentinelResource 自定义资源

java
@SentinelResource(value = "queryUser",
                  blockHandler = "handleBlock",       // 限流/熔断时调用
                  fallback = "handleFallback")        // 业务异常时调用
public User queryUser(Long id) { ... }

public User handleBlock(Long id, BlockException e) { return User.default(); }
public User handleFallback(Long id, Throwable t)    { return User.default(); }

十二、JMeter 压测(资料中有快速入门)

用 JMeter 模拟高并发,观察 Sentinel 限流效果:

  • 线程组:模拟并发用户数。
  • HTTP 请求:调接口。
  • 聚合报告:看 QPS、响应时间、错误率。

十三、限流算法基础(理解)

算法思想
计数器单位时间计数
滑动窗口计数器升级,更平滑
漏桶固定速率出水,超出丢弃
令牌桶固定速率发令牌,无令牌拒绝(支持突发)

练习建议

  1. 启动 Sentinel 控制台,接入一个微服务。
  2. 给某个接口设 QPS=2,用 JMeter 压测观察被拒。
  3. 配置慢调用熔断(RT > 200ms 比例 > 50%)。
  4. 给 Feign 配 fallback,模拟下游挂掉观察降级。
  5. 用热点参数限流「特定商品 ID」。