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  }