首页 > 解决方案 > Spring Boot - 如何跟踪所有请求和响应异常并保存到数据库中?

问题描述

我有两个微服务(Spring Boot)用于两个产品之间的集成。我的架构如下所示。

产品 1 <-------> 微服务 1/微服务 2 <-------> 产品 1。

我的任务是我需要使用输入婴儿车(使用方法,例如 GET、POST 等)、请求路径、查询字符串、此请求的相应类方法、此操作的响应(成功和错误)跟踪请求并保存到数据库表。我试过弹簧靴执行器。但没有运气。请建议如何实现这一目标。

标签: javaspringspring-boot

解决方案


我建议使用一个HandlerInterceptor可以注册到两个微服务 REST 控制器的。它有一个很好的生命周期回调,您可以使用它来序列化数据并将其保存到数据库中。这是自定义拦截器类:

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class DBRequestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                         Object handler) throws Exception {

        // DB logic

        return super.preHandle(request, response, handler);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                            Object handler, Exception ex) throws Exception {

        // DB logic

        super.afterCompletion(request, response, handler, ex);
    }
}

一旦你开发了这个可重用的处理程序,你就可以在 web 配置器中注册。这是代码:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

   @Autowired
   private DBRequestInterceptor interceptor;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(interceptor).addPathPatterns("/**/");
   }
}

此代码在您的所有 URL 映射上注册拦截器。您可以将其自定义为某些特定的服务 URL。

在上述拦截器中读取请求流后,您可能会在原始代码中发现异常。在这种情况下,您可以利用 Spring 包装类ContentCachingRequestWrapper

希望有帮助。


推荐阅读