当前位置: 首页 > 知识库问答 >
问题:

Hystrix/Feign只对HTTP状态429做出反应

商业
2023-03-14

我正在使用spring-cloud-starter-feign中的feign向已定义的后端发送请求。我想使用Hystrix作为断路器,但只用于一种用例:如果后端响应HTTP 429:太多请求代码,我的假客户机应该等待一个小时,直到它再次联系到真正的后端。在此之前,应该执行回退方法。

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

共有1个答案

马银龙
2023-03-14

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

为了满足您的重试需求,还可以注册一个具有适当配置的Retryerbean。请记住,使用retryer将在持续时间内绑定线程。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);
    } 
}

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

hystrix.command.hystrixcommandkey.circuitbreaker.forceOpen

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

用自己的命令替换HystrixCommandKey。您将需要恢复这个断路器回到关闭后所需的时间。

 类似资料:
  • 问题内容: 当我向某个服务器发送请求时,将出现303响应,然后是请求的响应以及200状态代码。有趣的是,我只能在开发人员控制台的网络视图中看到此内容。当检查我的$ .ajax()请求的状态码和响应时,将有第二个请求的响应以及200 http状态码。 问题在于,似乎第二个请求正在缓存(尽管状态码为200),我真的需要它不可缓存。因此,我真的很想干预使用http 303状态代码进行的转发过程。我希望我

  • 所以我正处于学习Meteor和React的开始阶段,我刚刚完成了制作待办事项列表的教程。 在实现中,我们在顶部有一个复选框,允许我们在完成的任务和所有任务之间切换。这被设置为一个状态。 每个任务旁边都有复选框,可以将任务显示为已完成或未完成。 我的问题是,这两个复选框都是实时变化的,但只有前者被指定为状态变量?为什么任务复选框是道具?

  • 在我看来,传奇模式在很多方面都是聚合模式的倒置。首先将命令处理成域事件,然后在聚合的情况下将此域事件应用到状态中是很有用的,但我认为在saga的情况下,域事件是已经发生的事情的文档,应该在试图对状态做出反应之前应用到状态中。 现在我的问题是:对于模块,有没有一种方法可以将命令配置为首先,然后?或者这是一个严重的bug,需要在一般情况下进行修复?

  • 所以我有一个sub-reddits列表,我用urllib打开它们。在我仔细研究之后,urllib最终失败了: 做了一些研究,我发现reddit通过IP限制了对其服务器的请求数量: 每两秒钟不要提出超过一个请求。请求的突发有一定的空间,但要保持理智。一般来说,一分钟内不要超过30个请求。 所以我想我应该使用将我的请求限制在每10秒一页。这最终也失败了。 上面的引用是从reddit API页面获取的。

  • 问题内容: 我处于状态的对象数组: 我需要能够基于id属性搜索items数组,然后更新对象属性。 我可以使用id参数通过数组或在数组上获取对象。 我遇到的麻烦是更新数组,然后更新状态而不会发生突变。 此时,我有一个匹配的对象,可以使用对象传播来更新它的属性: 我的问题是我该如何更新状态,以使其覆盖初始查找操作返回的对象? 问题答案: 您的更新功能如下所示 你这样使用它 毛吧? 如果您继续以这种方式

  • 主要内容:1 1xx:信息,2 2xx:成功,3 3xx:重定向,4 4xx:客户端错误,5 5xx:服务器错误当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。 HTTP状态码的英文为HTTP Status Code。下面是常见的HTTP状态码:  1xx - 这意味着已收到请求,并且该过程正在继续。 2xx - 这意味着已成功接收,理解并接受了该