如何在Spring Boot中以AOP方式实现请求超时管理

时间:2017-11-14 10:14:49

标签: spring rest spring-boot spring-aop spring-async

目前我正在探索在Spring Boot中以AOP方式实现'请求超时管理'的方法,但存在一些限制。要求/限制如下:

  • 最初的目的是,如果api请求的处理时间超过5秒,则直接返回超时结果而不是继续处理
  • 要监控的其余API由标准弹簧mvc休息控制器实现。里面的所有apis都返回json字符串,如下所示:

    @RestController
    public class xxxxxx {
        @RequestMapping(value = "xxxxxxx")
        public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) {
            ....
            return json.toString();
        }
    }
    
  • 超时逻辑需要由AOP
  • 实现
  • (真正意义上的部分) 不应对控制器进行任何更改,这意味着:不应更改请求生成方法;不应更改退货类型(不允许'可调用< ...>')

我已经找到了1个答案(Async approach),可以通过spring async完美地解决问题本身,并且超时返回结果非常漂亮,但是它正在改变返回类型,并且还触及控制器中的代码。我还找到了一个使用AOP的解决方案(AOP approach),但场景与我的完全不同。它已经将一些业务逻辑转移到AOP类中,但我不允许触摸控制器代码。如果有人能提供解决方案,我将不胜感激。我们也承认无法满足所有限制但最大限度地减少差异的解决方案。

1 个答案:

答案 0 :(得分:1)

由于对此问题仍无回应,我将在此处提出自己的临时解决方案。

我正在使用Hystrix依赖。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.4.0.RELEASE</version>
    </dependency>

它与springboot很好地集成,因此配置很简单。正确配置后,需要在需要超时处理的请求方法上附加注释。 e.g。

@HystrixCommand(fallbackMethod="fallback")
@RequestMapping(value = "xxxxxxx")
public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) {
    ....
    return json.toString();
}

并且需要添加一个后备方法,其名称映射到&#39; fallbackMethod&#39;的值。内部注释:

public String fallback() {
   ...
}

可以在application.properties

中全局配置超时时间值
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=3000

在这些方面仍然不够简洁:

  • 需要为每个方法复制/粘贴此注释
  • 需要在使用hystrix的每个地方复制/粘贴后备方法
  • 对于hystrix回退方法本身,参数类型和数量需要与hystrix标记方法完全相同。目前,我使用了几种称为“后备”的重载方法。为此,在每个控制器中

但至少它不再改变方法中的方法返回类型和代码,这是我目前能想到的最佳解决方案。一旦找到更好的解决方案,就会执行更新。