使用 spring 启动拦截对 get/add 关联 ID 的请求和响应

Intercept requests and responses to get/add correlation id with spring boot

我正在开发一个微服务,我第一次尝试实现关联 ID。基本上我有一个控制器,我想拦截任何请求以从请求 header 获取相关 ID 或创建一个,如果 header 不存在。我还想将关联 ID 添加到响应 header,并将其保存在 SLF4J MDC 中以用于记录目的。

目前我有:

@Slf4j
@Component
public class CorrelationIdInterceptor implements HandlerInterceptor {

    private final static String CORRELATION_ID_NAME = "correlation-id";

    @Override
    public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) throws Exception {
        final String correlationId = getOrGenerateCorrelationId(request);
        MDC.put(CORRELATION_ID_NAME, correlationId);
        log.info("New correlation id: {}", correlationId);
        return true;
    }

    @Override
    public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, Object handler, Exception ex) throws Exception {
        MDC.remove(CORRELATION_ID_NAME);
    }

    private String getOrGenerateCorrelationId(final HttpServletRequest request) {
        final String correlationId = request.getHeaders(CORRELATION_ID_NAME).toString();
        if(correlationId.isEmpty()) {
            return UUID.randomUUID().toString();
        }
        return correlationId;
    }

}

以及将我的自定义拦截器指定为默认拦截器的 Web 配置:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(final InterceptorRegistry registry) {
        registry.addInterceptor(new CorrelationIdInterceptor());
    }
}

log.info("New correlation id: {}", correlationId); 从未被调用,因为我在控制台中看不到它。我也尝试过使用 GlobalFilter 方法但无法成功。我究竟做错了什么?我怎样才能完成相关 ID 拦截器并将 ID 记录在我所有的 Slf4j 日志中?

您可以使用 Spring Cloud Sleuth 内置的 traceID 来。 https://www.baeldung.com/spring-cloud-sleuth-single-application

您确定 class 位于正在扫描注释的包中吗?看起来您的配置已完成