【问题标题】:How to implement request timeout management in an AOP way in Spring BootSpring Boot中如何以AOP方式实现请求超时管理
【发布时间】:2018-04-27 05:45:07
【问题描述】:

目前我正在探索实现“在 Spring Boot 中以 AOP 方式进行请求超时管理”的方法,但有几个限制。要求/限制如下:

  • 原意是如果一个api请求的处理时间超过5秒,那么直接返回超时结果,而不是继续处理
  • 要监控的rest api由标准spring mvc rest控制器实现。里面的所有api都返回这样的json字符串:

    @RestController
    public class xxxxxx {
        @RequestMapping(value = "xxxxxxx")
        public String xxxxxx(@RequestParam(value = "xxxx", required = true) String xxxx) {
            ....
            return json.toString();
        }
    }
    
  • 超时逻辑需要AOP实现
  • (真正的平均部分) 不应更改控制器,这意味着: 不应更改请求生成方法;不应更改返回类型(不允许'Callable<...>')

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

【问题讨论】:

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


    【解决方案1】:

    由于这个问题还没有回复,所以我把自己的临时解决办法放在这里。

    我正在使用 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 fallback方法本身,参数类型和数量需要与hystrix标记方法完全相同。目前,我在每个控制器中为此使用了几种称为“回退”的重载方法

    但至少它不再更改方法返回类型和方法内部的代码,并且是我目前能想到的最佳解决方案。一旦找到更好的解决方案,将执行更新。

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 2022-09-28
      • 2016-04-23
      • 2018-09-11
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      相关资源
      最近更新 更多