Hystrix 和 Sentinel 的区别?
结论先行:Hystrix 是 Netflix 的命令模式熔断器,靠线程池/信号量隔离实现舱壁,已停止维护;Sentinel 是阿里的流量治理组件,以「资源」为中心,提供限流、熔断、系统自适应保护、热点参数限流,规则可动态推送,且客户端轻量(无额外线程池)。新项目应选 Sentinel 或 Resilience4j。
1. 设计模型差异
Hystrix:
调用方 → HystrixCommand → 线程池/信号量隔离 → 目标服务
每个依赖一个线程池,超时由线程池 + Future.get 控制
Sentinel:
调用方 → SphU.entry(resource) / @SentinelResource → 目标服务
统计(滑动窗口)+ 规则判断,命中则 block,不额外创建线程
Hystrix 的线程池隔离像「每个下游一个专属泳道」,代价是线程数多、上下文切换开销大;Sentinel 在调用线程内做统计与判定,隔离靠「信号量式」的并发数/线程数限流规则。
2. 能力对比
| 维度 | Hystrix | Sentinel |
|---|---|---|
| 维护状态 | 2018 起停止开发,官方推荐替代 | 活跃 |
| 隔离方式 | 线程池(默认)/ 信号量 | 并发线程数、QPS 控制(无额外线程池) |
| 熔断 | 基于滑动窗口错误率 | 慢调用比例、异常比例、异常数 |
| 限流 | 无原生 QPS 限流 | QPS/线程数、匀速排队、热点参数、集群限流 |
| 系统保护 | 无 | 系统自适应(Load/CPU/RT/线程数) |
| 规则配置 | 代码/配置文件,动态改需 Archaius | 控制台 + Nacos/ZK 动态推送 |
| 监控 | Hystrix Dashboard + Turbine | Sentinel Dashboard + 实时指标 |
| 侵入性 | @HystrixCommand 或继承 Command | @SentinelResource 或 SphU.entry |
| 生态 | Spring Cloud Netflix(已停更) | Spring Cloud Alibaba |
3. 代码对照
Hystrix(历史写法):
@HystrixCommand(
fallbackMethod = "fallback",
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")
})
public StockDTO getStock(Long skuId) {
return stockClient.get(skuId);
}
public StockDTO fallback(Long skuId) {
return StockDTO.empty(skuId); // 降级返回值
}
Sentinel:
@SentinelResource(value = "getStock", blockHandler = "blocked", fallback = "fallback")
public StockDTO getStock(Long skuId) {
return stockClient.get(skuId);
}
// 被流控/熔断规则拦截时进入这里
public StockDTO blocked(Long skuId, BlockException ex) {
return StockDTO.empty(skuId);
}
// 业务异常时进入这里(可区分异常类型)
public StockDTO fallback(Long skuId, Throwable t) {
return StockDTO.empty(skuId);
}
注意 blockHandler 与 fallback 的分工:前者处理规则拦截,后者处理业务异常,签名必须与原方法一致(可多一个 BlockException/Throwable 参数)。
4. 规则配置
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8858
eager: true # 启动即建立心跳,避免首次访问才注册
datasource:
flow:
nacos:
server-addr: 127.0.0.1:8848
data-id: order-flow-rules
group-id: SENTINEL_GROUP
rule-type: flow # flow/degrade/system/param-flow
[
{
"resource": "getStock",
"grade": 1,
"count": 100,
"strategy": 0,
"controlBehavior": 0
}
]
grade:0=线程数,1=QPS;strategy:0=直接,1=关联,2=链路;controlBehavior:0=快速失败,1=Warm Up,2=匀速排队。
5. 熔断参数怎么定
| 参数 | 含义 | 建议 |
|---|---|---|
grade | 熔断策略 | 慢调用比例 / 异常比例 / 异常数 |
count(慢调用 RT) | 超过该 RT 记为慢调用 | 设为 P99 的 1.5~2 倍 |
slowRatioThreshold | 慢调用比例阈值 | 0.5 左右 |
statIntervalMs | 统计窗口 | 1000~10000ms |
minRequestAmount | 最小请求数 | 避免低流量误熔断 |
timeWindow | 熔断时长 | 5~30s,太长会拖慢恢复 |
6. 常见追问
追问一:Sentinel 为什么不用线程池隔离?
线程池隔离会增加线程数与上下文切换,Sentinel 选择在调用线程内统计并用「并发线程数」规则限流,效果接近信号量隔离。需要严格隔离时,可以配 grade=0(线程数)规则。
追问二:blockHandler 和 fallback 能同时生效吗?
能。规则拦截走 blockHandler,业务异常走 fallback;若 fallback 里再抛异常,会继续向上抛,不会二次降级。
追问三:规则丢了怎么办?
Sentinel Dashboard 默认把规则存在内存,重启即丢。生产必须接 Nacos/ZK 做持久化(datasource 配置),并开启 eager 让客户端启动即拉取规则。
追问四:Sentinel 能保护非 Web 方法吗?
能。@SentinelResource 加在任意 Spring Bean 方法上即可,资源名默认是方法签名,也可显式指定。这也是它比 Hystrix 灵活的地方。
追问五:Hystrix 还有必要学吗? 作为演进史值得了解:线程池隔离、舱壁模式、fallback 这些概念被 Sentinel/Resilience4j 继承。但新项目不应再引入。
小结
Hystrix 的核心是「命令 + 线程池隔离 + 熔断」,Sentinel 的核心是「资源 + 滑动窗口统计 + 多维规则」。前者用资源换隔离,后者用统计换轻量;再加上动态规则与系统自适应保护,Sentinel 更贴合当下微服务的治理需求。