熔断器

熔断器中间件,用于提供客户端熔断功能,默认实现了sre breaker 算法。

配置

WithGroup

breaker 依赖于 container/group 来实现对于针对不同 Operation 使用互相独立的 breaker。 WithGroup 可以配置自定义的 Breaker 来替换默认的熔断算法:

  1. // WithGroup with circuit breaker group.
  2. // NOTE: implements generics circuitbreaker.CircuitBreaker
  3. func WithGroup(g *group.Group) Option {
  4. return func(o *options) {
  5. o.group = g
  6. }
  7. }

默认配置会针对不同的 Operation 生成独立的 breaker:

  1. opt := &options{
  2. group: group.NewGroup(func() interface{} {
  3. return sre.NewBreaker()
  4. }),
  5. }

group.Group 是一个 懒加载容器 在本文中装载进 group.Group 的实例,应实现 aegis/circuitbreakerCircuitBreaker 接口。

  1. // CircuitBreaker is a circuit breaker.
  2. type CircuitBreaker interface {
  3. Allow() error // 判断请求是否允许发送,如果返回 error 则表示请求被拒绝
  4. MarkSuccess() // 标记请求成功
  5. MarkFailed() // 标记请求失败
  6. }

使用方法

在 Client 请求中使用熔断器

  1. // http
  2. conn, err := http.NewClient(
  3. context.Background(),
  4. http.WithMiddleware(
  5. circuitbreaker.Client(),
  6. ),
  7. http.WithEndpoint("127.0.0.1:8000"),
  8. )
  9. // grpc
  10. conn,err := transgrpc.Dial(
  11. context.Background(),
  12. grpc.WithMiddleware(
  13. circuitbreaker.Client(),
  14. ),
  15. grpc.WithEndpoint("127.0.0.1:9000"),
  16. )

触发熔断

当熔断器触发时,会在一段时间内对于该Operation的调用快速失败,并返回错误ErrNotAllowed,定义如下:

  1. // ErrNotAllowed is request failed due to circuit breaker triggered.
  2. var ErrNotAllowed = errors.New(503, "CIRCUITBREAKER", "request failed due to circuit breaker triggered")