Circuit breaker middleware for providing client-side breaker functionality, with sre breaker algorithm implemented by default。
WithGroupbreaker depends on container/group to implement the use of mutually independent breaker for different Operation.
use WithGroup to configure a costom Breaker to replace the default breaker algorithm:
// WithGroup with circuit breaker group.// NOTE: implements generics circuitbreaker.CircuitBreakerfunc WithGroup(g *group.Group) Option { return func(o *options) { o.group = g }}The default configuration generates separate breakers for different Operation(s).
opt := &options{ group: group.NewGroup(func() interface{} { return sre.NewBreaker() }),}group.Group is a lazy load container . The instance of group.Group should be implement the CircuitBreaker interface in aegis/circuitbreaker
// CircuitBreaker is a circuit breaker.type CircuitBreaker interface { Allow() error // it means rejected when return error MarkSuccess() MarkFailed()}// httpconn, err := http.NewClient( context.Background(), http.WithMiddleware( circuitbreaker.Client(), ), http.WithEndpoint("127.0.0.1:8000"),)// grpcconn,err := transgrpc.Dial( context.Background(), grpc.WithMiddleware( circuitbreaker.Client(), ), grpc.WithEndpoint("127.0.0.1:9000"),)When the breaker is triggered, the client call for this Operation fails quickly for a period of time and returns the error ErrNotAllowed immediately,which defined as follows:
// ErrNotAllowed is request failed due to circuit breaker triggered.var ErrNotAllowed = errors.New(503, "CIRCUITBREAKER", "request failed due to circuit breaker triggered")