Go语言服务网格流量管理:熔断与限流
Go语言服务网格流量管理熔断与限流1. 熔断器模式熔断器防止级联故障提高系统可用性。package mesh import ( sync time ) type CircuitBreaker struct { mu sync.RWMutex state CircuitState failureCount int maxFailures int timeout time.Duration lastFailure time.Time } type CircuitState int const ( StateClosed CircuitState iota StateHalfOpen StateOpen ) func NewCircuitBreaker(maxFailures int, timeout time.Duration) *CircuitBreaker { return CircuitBreaker{ maxFailures: maxFailures, timeout: timeout, state: StateClosed, } } func (cb *CircuitBreaker) Call(fn func() error) error { cb.mu.Lock() defer cb.mu.Unlock() if cb.state StateOpen { if time.Since(cb.lastFailure) cb.timeout { cb.state StateHalfOpen } else { return ErrCircuitOpen } } err : fn() if err ! nil { cb.failureCount cb.lastFailure time.Now() if cb.failureCount cb.maxFailures { cb.state StateOpen } return err } if cb.state StateHalfOpen { cb.state StateClosed } cb.failureCount 0 return nil }2. 限流器type RateLimiter struct { mu sync.Mutex rate int burst int tokens int lastTime time.Time } func NewRateLimiter(rate, burst int) *RateLimiter { return RateLimiter{ rate: rate, burst: burst, tokens: burst, } } func (rl *RateLimiter) Allow() bool { rl.mu.Lock() defer rl.mu.Unlock() now : time.Now() elapsed : now.Sub(rl.lastTime).Seconds() rl.lastTime now rl.tokens int(elapsed * float64(rl.rate)) if rl.tokens rl.burst { rl.tokens rl.burst } if rl.tokens 0 { rl.tokens-- return true } return false }3. 总结熔断和限流是服务网格流量管理的核心功能可以有效防止系统过载和故障扩散。