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、响应时间、错误率。
十三、限流算法基础(理解)
| 算法 | 思想 |
|---|---|
| 计数器 | 单位时间计数 |
| 滑动窗口 | 计数器升级,更平滑 |
| 漏桶 | 固定速率出水,超出丢弃 |
| 令牌桶 | 固定速率发令牌,无令牌拒绝(支持突发) |
练习建议
- 启动 Sentinel 控制台,接入一个微服务。
- 给某个接口设 QPS=2,用 JMeter 压测观察被拒。
- 配置慢调用熔断(RT > 200ms 比例 > 50%)。
- 给 Feign 配 fallback,模拟下游挂掉观察降级。
- 用热点参数限流「特定商品 ID」。