【问题标题】:Rest API request timeout休息 API 请求超时
【发布时间】:2022-01-13 10:51:20
【问题描述】:

当没有返回响应时,我需要让我的 Rest Api 超时。例如,当我发出请求时,如果返回响应的时间超过 5 秒,则超时。

为了实现这一点,我选择了使用 Hystrix 的断路器。但是我不确定这是否是解决这个问题的正确方法,如果一切都好,是否应该对 Hystrix 进行更多配置?

我当前的实现看起来像,

主类

@SpringBootApplication
@EnableCircuitBreaker
class MyApplication{

}

休息控制器

@GetMapping("/data")
@HystrixCommand(commandKey="response")
public String getResponse(){

    Thread.sleep(10000);
    .....
}

application.properties

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000

当超时时,它会抛出一个 HystrixRunTimeException 并使用自定义异常处理程序进行处理。

这是实现请求超时的正确方法吗?

【问题讨论】:

    标签: java spring spring-boot rest hystrix


    【解决方案1】:

    您可以简单地使用本机 CompletableFuture 而无需为此添加外部依赖项:

    CompletableFuture<String> task = CompletableFuture.supplyAsync(() -> {
        //your code which will return a String response at some point
    });
    try {
        return task.get(5, TimeUnit.SECONDS); //this will return if the future returns before 5 seconds, else will throw a timeout exception
    } catch (InterruptedException | ExecutionException e) {
        //handle execution issues
    } catch (TimeoutException e) {
        //you're called here if you timeout
    }
    

    CompletableFuture.supplyAsync() 方法将异步执行使您检索String 的任务,因此它应该包含您的功能代码。它应该以return &lt;your response&gt; 结尾。

    另一方面,你马上得到future,.get(unit, timeoutUnit)方法将同步等待future响应超时。

    如果发生执行错误(例如,在您的功能代码中抛出异常),您将在 ExecutionException 的原因中捕获它。

    如果超时(意味着未来还没有完成 5 秒),您将收到一个 TimeoutException 并能够对您的呼叫者做出任何您想要的响应。

    如果异步执行功能操作的线程被中断,InterruptedException 也有可能出现。我没有处理那个异常,你会比我更清楚你想如何处理它。

    【讨论】:

    • 知道了...谢谢。但是我有很多端点,我不想触及现有的流程......使用 Hystrix 只是一些注释。我对 Hystrix 配置很困惑,所以我提出了这个问题……这不是正确的方法吗?
    • @ima.technophyle 您可以编写一个实用函数,该函数将供应商作为参数,并对每个端点执行相同的操作。每个端点将简单地调用该通用函数并取回结果。变化不大,但它依赖于已知的 JDK 功能而不是外部库。另外请记住,注释会被处理并创建代码,它们最终肯定会做一些非常相似的事情 - 只是他们为你做。
    • ??...我同意...无论如何我都会尝试一下...实际上,代码正在生产中,所有人都在寻找对现有实现的最小更改...这就是我选择 Hystrix 的原因...
    • @ima.technophyle 我当然明白。 Hystrix 是一个功能强大的库,可以处理很多事情,但对于您需要做的事情,它只是意味着为生产添加一个外部依赖项,以便可以轻松且“最少”(可能不像注释那样最少,但仍然)完成使用一个简单的JDK结构:)
    • 谢谢,伙计...?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2018-11-26
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2019-09-27
    相关资源
    最近更新 更多