gozero限流、熔断、降级如何实现?面试的时候怎么回答?
在分布式系统中,高并发既是业务增长的标志,也是系统崩溃的导火索。
今天我们聚焦Go-zero这个框架,手把手带你掌握限流、熔断和降级:
✅ 限流:用令牌桶算法精准控制流量,防止单点过载
✅ 熔断:构建“断路器”机制,避免故障级联扩散
✅ 降级:优雅放弃非核心功能,守住业务生命线
本文不仅附有完整代码示例,还拆解了高频面试问题及回答技巧,助你从“会写代码”进阶为“懂系统设计”的技术人。
限流、熔断示例:
限流示例
Go-zero中可以使用ratelimiter中间件来实现API流量控制。示例代码如下:
首先创建一个limiter实例:
Go
limiter := rate.NewLimiter(rate.Limit(qps), qps*3)这里rate.Limit(qps)用来设置每秒允许的请求量,qps*3用来设置瞬间最大并发数。
然后在请求处理中使用该limiter:
Go
if!limiter.Allow() { return http.StatusTooManyRequests, nil }通过limiter.Allow()判断当前请求是否允许访问,如果超过了请求数,则返回http.StatusTooManyRequests错误。
熔断示例
Go-zero中没有像Hystrix那样有非常成熟的、开箱即用的熔断组件,但可以参考一些开源的熔断器实现来进行自定义熔断逻辑。以下是一个简单的模拟熔断器逻辑示例:
Go
package main import ( "fmt" "time" ) // 熔断器结构体 type CircuitBreaker struct { state int32 // 熔断器状态,0表示关闭,1表示打开,2表示半打开 errorCount int // 错误计数 totalCount int // 总请求计数 openTime time.Time // 熔断器打开时间 recoveryTime time.Duration // 熔断恢复时间 threshold fl