mirror of
https://github.com/go-micro/go-micro.git
synced 2025-01-17 17:44:30 +02:00
Hystrix filter (#2286)
* support hystrix filter * filter function should return true of false
This commit is contained in:
parent
8c39b1e120
commit
44ecd6a457
@ -9,7 +9,7 @@ import (
|
||||
|
||||
type clientWrapper struct {
|
||||
client.Client
|
||||
filter func(context.Context, error) error
|
||||
filter func(context.Context, error) bool
|
||||
fallback func(context.Context, error) error
|
||||
}
|
||||
|
||||
@ -19,7 +19,9 @@ func (cw *clientWrapper) Call(ctx context.Context, req client.Request, rsp inter
|
||||
err = cw.Client.Call(c, req, rsp, opts...)
|
||||
if cw.filter != nil {
|
||||
// custom error handling, filter errors that should not trigger circuit breaker
|
||||
return cw.filter(ctx, err)
|
||||
if cw.filter(ctx, err) {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return err
|
||||
}, cw.fallback)
|
||||
|
@ -50,12 +50,12 @@ func TestBreakerWithFilter(t *testing.T) {
|
||||
s := selector.NewSelector(selector.Registry(r))
|
||||
c := client.NewClient(
|
||||
client.Selector(s),
|
||||
client.Wrap(NewClientWrapper(WithFilter(func(c context.Context, e error) error {
|
||||
client.Wrap(NewClientWrapper(WithFilter(func(c context.Context, e error) bool {
|
||||
var merr *merrors.Error
|
||||
if errors.As(e, &merr) && merr.Detail == "service test.service: not found" {
|
||||
return nil
|
||||
return true
|
||||
}
|
||||
return e
|
||||
return false
|
||||
}))),
|
||||
)
|
||||
|
||||
|
@ -4,7 +4,10 @@ import "context"
|
||||
|
||||
// Options represents hystrix client wrapper options
|
||||
type Options struct {
|
||||
Filter func(context.Context, error) error
|
||||
// Filter used to prevent errors from trigger circuit breaker.
|
||||
// return true if you want to ignore target error
|
||||
Filter func(context.Context, error) bool
|
||||
// Fallback used to define some code to execute during outages.
|
||||
Fallback func(context.Context, error) error
|
||||
}
|
||||
|
||||
@ -12,7 +15,7 @@ type Options struct {
|
||||
type Option func(*Options)
|
||||
|
||||
// WithFilter used to set filter func for options
|
||||
func WithFilter(filter func(context.Context, error) error) Option {
|
||||
func WithFilter(filter func(context.Context, error) bool) Option {
|
||||
return func(o *Options) {
|
||||
o.Filter = filter
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user