breakerinterceptor.go 707 B

1234567891011121314151617181920212223242526272829
  1. package clientinterceptors
  2. import (
  3. "context"
  4. "path"
  5. "zero/core/breaker"
  6. "google.golang.org/grpc"
  7. "google.golang.org/grpc/codes"
  8. "google.golang.org/grpc/status"
  9. )
  10. func acceptable(err error) bool {
  11. switch status.Code(err) {
  12. case codes.DeadlineExceeded, codes.Internal, codes.Unavailable, codes.DataLoss:
  13. return false
  14. default:
  15. return true
  16. }
  17. }
  18. func BreakerInterceptor(ctx context.Context, method string, req, reply interface{},
  19. cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  20. breakerName := path.Join(cc.Target(), method)
  21. return breaker.DoWithAcceptable(breakerName, func() error {
  22. return invoker(ctx, method, req, reply, cc, opts...)
  23. }, acceptable)
  24. }