github.com/lingyao2333/mo-zero@v1.4.1/core/breaker/breakers.go (about) 1 package breaker 2 3 import "sync" 4 5 var ( 6 lock sync.RWMutex 7 breakers = make(map[string]Breaker) 8 ) 9 10 // Do calls Breaker.Do on the Breaker with given name. 11 func Do(name string, req func() error) error { 12 return do(name, func(b Breaker) error { 13 return b.Do(req) 14 }) 15 } 16 17 // DoWithAcceptable calls Breaker.DoWithAcceptable on the Breaker with given name. 18 func DoWithAcceptable(name string, req func() error, acceptable Acceptable) error { 19 return do(name, func(b Breaker) error { 20 return b.DoWithAcceptable(req, acceptable) 21 }) 22 } 23 24 // DoWithFallback calls Breaker.DoWithFallback on the Breaker with given name. 25 func DoWithFallback(name string, req func() error, fallback func(err error) error) error { 26 return do(name, func(b Breaker) error { 27 return b.DoWithFallback(req, fallback) 28 }) 29 } 30 31 // DoWithFallbackAcceptable calls Breaker.DoWithFallbackAcceptable on the Breaker with given name. 32 func DoWithFallbackAcceptable(name string, req func() error, fallback func(err error) error, 33 acceptable Acceptable) error { 34 return do(name, func(b Breaker) error { 35 return b.DoWithFallbackAcceptable(req, fallback, acceptable) 36 }) 37 } 38 39 // GetBreaker returns the Breaker with the given name. 40 func GetBreaker(name string) Breaker { 41 lock.RLock() 42 b, ok := breakers[name] 43 lock.RUnlock() 44 if ok { 45 return b 46 } 47 48 lock.Lock() 49 b, ok = breakers[name] 50 if !ok { 51 b = NewBreaker(WithName(name)) 52 breakers[name] = b 53 } 54 lock.Unlock() 55 56 return b 57 } 58 59 // NoBreakerFor disables the circuit breaker for the given name. 60 func NoBreakerFor(name string) { 61 lock.Lock() 62 breakers[name] = newNoOpBreaker() 63 lock.Unlock() 64 } 65 66 func do(name string, execute func(b Breaker) error) error { 67 return execute(GetBreaker(name)) 68 }