Kratos 熔斷器

2022-04-25 10:01 更新

熔斷器

熔斷器中間件,用于提供客戶端熔斷功能,默認實現(xiàn)了sre breaker 算法。

配置

  • ?WithGroup ?

breaker 依賴于 ?container/group? 來實現(xiàn)對于針對不同 ?Operation ?使用互相獨立的 breaker。 ?WithGroup ?可以配置自定義的 ?Breaker ?來替換默認的熔斷算法:

// WithGroup with circuit breaker group.
// NOTE: implements generics circuitbreaker.CircuitBreaker
func WithGroup(g *group.Group) Option {
    return func(o *options) {
        o.group = g
    }
}

默認配置會針對不同的 ?Operation ?生成獨立的 breaker:

opt := &options{
    group: group.NewGroup(func() interface{} {
        return sre.NewBreaker()
    }),
}

group.Group 是一個 懶加載容器 在本文中裝載進 group.Group 的實例,應實現(xiàn) ?aegis/circuitbreaker? 的 CircuitBreaker 接口。

// CircuitBreaker is a circuit breaker.
type CircuitBreaker interface {
    Allow() error // 判斷請求是否允許發(fā)送,如果返回 error 則表示請求被拒絕
  MarkSuccess() // 標記請求成功
    MarkFailed() // 標記請求失敗
}

使用方法

在 Client 請求中使用熔斷器

// http
conn, err := http.NewClient(
    context.Background(),
    http.WithMiddleware(
        circuitbreaker.Client(),
    ),
    http.WithEndpoint("127.0.0.1:8000"),
)
// grpc 
conn,err := transgrpc.Dial(
  context.Background(), 
    grpc.WithMiddleware(
        circuitbreaker.Client(),
    ),
  grpc.WithEndpoint("127.0.0.1:9000"),
)

觸發(fā)熔斷

當熔斷器觸發(fā)時,會在一段時間內對于該?Operation?的調用快速失敗,并返回錯誤?ErrNotAllowed?,定義如下:

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


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號