0

我正在使用Feignfromspring-cloud-starter-feign将请求发送到定义的后端。我想Hystrix用作断路器,但仅用于一种类型的用例:如果后端以HTTP 429: Too many requests代码响应,我的 Feign 客户端应该等待整整一小时,直到它再次联系真正的后端。在那之前,应该执行一个回退方法。

我将如何配置我的 Spring Boot (1.5.10) 应用程序才能实现这一点?我看到了许多配置可能性,但只有少数示例 - 在我看来 - 不幸的是没有解决用例。

4

2 回答 2

1

这可以通过定义ErrorDecoder和手动控制Hystrix断路器来实现。您可以检查异常的响应代码并提供您自己的回退。此外,如果您希望重试请求,请将您的异常包装并抛出RetryException.

为了满足您的重试要求,还要Retryer使用适当的配置注册一个 bean。请记住,使用 aRetryer将在持续时间内占用一个线程。的默认实现Retryer也使用指数退避策略。

这是从OpenFeign文档中获取的示例 ErrorDecoder:

public class StashErrorDecoder implements ErrorDecoder {

    @Override
    public Exception decode(String methodKey, Response response) {
        if (response.status() >= 400 && response.status() <= 499) {
            return new StashClientException(
                response.status(),
                response.reason()
            );
        }
        if (response.status() >= 500 && response.status() <= 599) {
            return new StashServerException(
                response.status(),
                response.reason()
            );
        }
        return errorStatus(methodKey, response);
    } 
}

在您的情况下,您会419根据需要做出反应。

您可以在运行时强制打开断路器设置此属性

hystrix.command.HystrixCommandKey.circuitBreaker.forceOpen

ConfigurationManager.getConfigInstance()
    .setProperty(
    "hystrix.command.HystrixCommandKey.circuitBreaker.forceOpen", true);

替换HystrixCommandKey为您自己的命令。您需要在所需时间后将此断路器恢复为闭合状态。

于 2018-03-09T22:48:20.923 回答
0

我可以通过以下调整来解决它:

中的属性application.yml

hystrix.command.commandKey:
  execution.isolation.thread.timeoutInMilliseconds: 10_000
  metrics.rollingStats.timeInMilliseconds: 10_000
  circuitBreaker:
    errorThresholdPercentage: 1
    requestVolumeThreshold: 1
    sleepWindowInMilliseconds: 3_600_000

相应 Java 类中的代码:

@HystrixCommand(fallbackMethod = "fallbackMethod", commandKey = COMMAND_KEY)
public void doCall(String parameter) {
    try {
        feignClient.doCall(parameter);
    } catch (FeignException e) {
        if (e.status() == 429) {
            throw new TooManyRequestsException(e.getMessage());
        } 
    }
}
于 2018-03-18T17:12:53.510 回答