使用SentinelGo熔断器必须显式调用circuitbreaker.LoadRules,规则中Resource字符串需与埋点完全一致,且注意MinRequestAmount和StatIntervalInMs参数设置。Entry与Exit须成对执行于同一goroutine,避免跨协程调用。三种熔断策略需根据场景选择,同时确保规则在首请求前加载完成。
circuitbreaker.LoadRules,它也不会帮你挡住任何一次请求。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
很多人踩的第一个坑就是——规则配置得明明白白,sentinel.InitDefault() 也调了,但慢请求已经堆积成山,熔断器愣是不跳闸。问题的根源其实很简单:熔断规则和限流规则走的不是同一个加载入口,两者根本不兼容。
限流靠 flow.LoadRules,熔断靠 circuitbreaker.LoadRules。漏掉后者,你设的那些 ErrorRatio、MinRequestAmount 参数,Sentinel 根本当看不见。还有两个容易忽略的细节:规则里的 Resource 字符串必须和埋点 sentinel.Entry("xxx") 的值完全一致——大小写、空格、斜杠方向都不能差;如果埋点时用了 WithTrafficType(base.Inbound),规则里也得显式补上 TrafficType: base.Inbound,否则照样匹配失败。
这其实是最常见的问题,但很多人排查半天也找不到原因,因为 MinRequestAmount 和 StatIntervalInMs 这两个参数如果设得太小或干脆没设,规则会校验失败并被静默跳过——日志里连个报错都没有,熔断器直接选择“无视”。
MinRequestAmount 推荐设到 20 以上:样本太少,错误率抖动剧烈,容易误熔断。这就好比抛硬币,抛个两三次就判断正反面比例,完全不靠谱。StatIntervalInMs 建议设为 60000(1 分钟):设得太短(比如 1000ms),P95 延迟稍微波动一下就可能触发熔断;设得太长(比如 5 分钟),熔断器反应迟钝,等你发现问题时,雪崩可能已经发生了。SlowCallDurationInMs:这个阈值应该略高于接口的真实 P90 RT。比如 P90 是 320ms,那就设到 400ms,否则大量正常请求会被当作“慢调用”计入统计,熔断器会变得异常敏感。Entry 和 Exit 必须成对且在同 goroutine 执行这一步是 Sentinel Go 最容“暴雷”的地方。漏掉 e.Exit(),或者搞了个跨协程调用,滑动窗口的统计就会彻底乱套,熔断阈值判断形同虚设。
Entry 必须在主 goroutine 里调用,别把它塞进 go func() { ... }() 里面。defer e.Exit() 之前一定要先判空:写成 if e != nil { defer e.Exit() }。否则遇到 BlockError 时 e 会是 nil,直接 panic。e.Exit(),就不要再写一个 defer 了,别让它重复退出。"GET:/api/order/{id}" 这种格式。千万别写死成 /api/order/123,否则路径参数一变,规则就无法复用了。不是所有场景都适合用 ErrorRatio。选错了策略,熔断器要么太敏感,动不动就跳闸;要么直接摆烂,形同虚设。
ErrorRatio:适合错误明确(比如 HTTP 5xx、panic)且调用量大的服务。它严重依赖 MinRequestAmount 和 StatIntervalInMs,小流量接口慎用。ErrorCount:适合错误率低但单次失败代价极高的场景(比如支付扣款)。它只看绝对次数,不看比例,需要配合 MaxAllowedErrors 和 StatIntervalInMs 使用。SlowRequestRatio:适合延迟敏感型服务(比如实时推荐)。关键参数是 SlowCallDurationInMs 和 MinRequestAmount,要注意它统计的是“慢调用占比”,不是平均延迟。其实,写规则本身并不难。真正难的是让 circuitbreaker.LoadRules 在服务启动完成、首请求到达之前就执行到位。早一毫秒,规则就能生效;晚一毫秒,第一个雪崩请求就已经打穿你的线程池了。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述