【问题标题】:Circuit Breaker with gRPC带有 gRPC 的断路器
【发布时间】:2020-02-27 22:14:35
【问题描述】:

REST 服务中添加带有hystrix 的断路器,我可以执行以下操作:

@HystrixCommand(fallbackMethod = "getBackupResult")
@GetMapping(value = "/result")
public ResponseEntity<ResultDto> getResult(@RequestParam("request") String someRequest) {

    ResultDto resultDto = service.parserRequest(someRequest);
    return new ResponseEntity<>(resultDto, HttpStatus.OK);
}

public ResponseEntity<ResultDto> getBackupResult(@RequestParam("request") String someRequest) {

    ResultDto resultDto = new ResultDto();
    return new ResponseEntity<>(resultDto, HttpStatus.OK);
}

我可以为gRPC 通话做些类似的事情吗?

public void parseRequest(ParseRequest request, StreamObserver<ParseResponse> responseObserver) {
    try {
        ParseResponse parseResponse  = service.parseRequest(request.getSomeRequest());

        responseObserver.onNext(parseResponse);
        responseObserver.onCompleted();
    } catch (Exception e) {
        logger.error("Failed to execute parse request.", e);
        responseObserver.onError(new StatusException(Status.INTERNAL));
    }
}

【问题讨论】:

    标签: grpc grpc-java circuit-breaker


    【解决方案1】:

    我通过在客户端上实施断路器解决了我的问题。我用sentinel library

    例如,为了对异常率做出反应,我添加了以下规则:

        private static final String KEY = "callGRPC";
    
        private void callGRPC(List<String> userAgents) {
            initDegradeRule();
            ManagedChannel channel = ManagedChannelBuilder.forAddress(grpcHost, grpcPort).usePlaintext()
                                                          .build();
            for (String userAgent : userAgents) {
                Entry entry = null;
                try {
                    entry = SphU.entry(KEY);
                    UserAgentServiceGrpc.UserAgentServiceBlockingStub stub
                            = UserAgentServiceGrpc.newBlockingStub(channel);
                    UserAgentParseRequest request = UserAgentRequest.newBuilder().setUserAgent(userAgent).build();
                    UserAgentResponse userAgentResponse = stub.getUserAgentDetails(request);
                } catch (BlockException e) {
                    logger.error("Circuit-breaker is on and the call has been blocked");
                } catch (Throwable t) {
                    logger.error("Exception was thrown", t);
                } finally {
                    if (entry != null) {
                        entry.exit();
                    }
                }
            }
            channel.shutdown();
        }
    
        private void initDegradeRule() {
            List<DegradeRule> rules = new ArrayList<DegradeRule>();
            DegradeRule rule = new DegradeRule();
            rule.setResource(KEY);
            rule.setCount(0.5);
            rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
            rule.setTimeWindow(60);
            rules.add(rule);
            DegradeRuleManager.loadRules(rules);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-22
      • 2021-08-07
      • 2017-12-25
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      相关资源
      最近更新 更多