目前我正在探索在 Spring Boot 中以 AOP 方式实现请求超时管理的方法,但有一些限制。要求/限制如下:
- 最初的目的是,如果api请求的处理时间超过5秒,则直接返回超时结果,而不是继续处理
要监控的rest api是由标准的spring mvc Rest Controller 实现的。里面的所有 api 都返回这样的 json 字符串:
@RestController public class xxxxxx { @RequestMapping(value = "xxxxxxx") public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) { .... return json.toString(); } }
- 超时逻辑需要AOP实现
- (真正的平均部分) 不应对 Controller 进行任何更改,这意味着: 不应更改请求生成方法;返回类型不应更改(不允许“Callable<...>”)
我已经找到了1个答案(Async approach),它可以用spring async完美解决问题本身,并且超时返回结果非常漂亮,但是它改变了返回类型,并且还触及了 Controller 中的代码。我还找到了一种使用 AOP 的解决方案( AOP approach ),但场景与我的有很大不同。它已经将一些业务逻辑转移到 AOP 类中,但我不允许接触 Controller 代码。如果有人能提供解决方案,我将不胜感激。不能满足所有限制但可以最小化差异的解决方案也被接受。
最佳答案
由于这个问题还没有得到答复,我将自己的临时解决方案放在这里。
我正在使用 Hystrix 依赖项。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.0.RELEASE</version>
</dependency>
与springboot集成良好,配置简单。正确配置后,需要在需要超时处理的请求方法上附加注释。例如
@HystrixCommand(fallbackMethod="fallback")
@RequestMapping(value = "xxxxxxx")
public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) {
....
return json.toString();
}
并且需要添加一个后备方法,其名称映射到注释内“fallbackMethod”的值:
public String fallback() {
...
}
超时时间值可以在application.properties内部全局配置
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=3000
这在以下几点上仍然不够简洁:
- 需要为每个方法复制/粘贴此注释
- 需要在每个使用 hystrix 的地方复制/粘贴后备方法
- 对于hystrix后备方法本身,参数类型和数量需要与hystrix标记的方法完全相同。目前,我在每个 Controller 中使用了几种称为“后备”的重载方法
但至少它不再改变方法返回类型和方法内的代码,并且是我目前能想到的最佳解决方案。一旦找到更好的解决方案,将进行更新。
关于spring - Spring Boot中如何以AOP的方式实现请求超时管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47283039/