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

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

艾骏
2023-03-14

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

>

  • 最初的目的是,如果api请求的处理时间超过5秒,则直接返回超时结果,而不是继续处理。
  • 要监控的RESTAPI由标准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();
        }
    }
    

    我已经找到了一个答案(异步方法),可以完美地解决spring async本身的问题,超时返回结果非常漂亮,但它改变了返回类型,也触及了控制器中的代码。我也发现了一个使用AOP的解决方案(AOP方法),但是这个场景和我的很不一样。它已经将一些业务逻辑转移到AOP类中,但是不允许我接触控制器代码。如果有人能提供解决方案,我将不胜感激。不能满足所有限制但能最小化差异的解决方案也是可以接受的。

  • 共有1个答案

    郜联
    2023-03-14

    由于这个问题仍然没有得到答复,我将在这里提出我自己的临时解决方案。

    我用的是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();
    }
    

    并且需要添加一个回退方法,其名称映射到批注内“fallback method”的值:

    public String fallback() {
       ...
    }
    

    超时时间值可以在application.properties中全局配置

    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
    hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=3000
    

    这在以下几点仍然不简洁:

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

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

     类似资料:
    • 比如我请求了别人,超时时间是5秒,超时后需要打印日志。 微服务是通过openfeign请求的,希望可以打印日志,代码不是手动请求的,不然加上打印代码就好了。

    • 本文向大家介绍aop注解方式实现全局日志管理方法,包括了aop注解方式实现全局日志管理方法的使用技巧和注意事项,需要的朋友参考一下 1:日志实体类 2:maven需要的jar 这里要求项目使用的是jdk1.7 3:springServlet-mvc.xml 加上proxy-target-class="true"是为了可以拦截controller里面的方法 4:定义切面,我这里主要写前置通知和异常通

    • 我正在尝试使用<code>网络客户端 谢谢 -斯里尼

    • 这个任务用于展示如何使用Istio在Envoy中设置请求超时。 开始之前 遵循安装指南 的指导安装Istio。 部署BookInfo 示例程序。 执行如下命令,初始化基于应用版本的路由。 istioctl create -f samples/bookinfo/kube/route-rule-all-v1.yaml 注意:本任务假设在Kubernetes上部署这一应用。所有涉及的命令都使用的是K

    • 本文向大家介绍SpringBoot请求参数接收方式,包括了SpringBoot请求参数接收方式的使用技巧和注意事项,需要的朋友参考一下 application/json接收 x-www-form-urlencoded、?拼接、form-data接收 UserDto 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

    • 本文向大家介绍使用Spring的注解方式实现AOP实例,包括了使用Spring的注解方式实现AOP实例的使用技巧和注意事项,需要的朋友参考一下 spring对AOP的实现提供了很好的支持。下面我们就使用Spring的注解来完成AOP做一个例子。 首先,为了使用Spring的AOP注解功能,必须导入如下几个包。aspectjrt.jar,aspectjweaver.jar,cglib-nodep.j