diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 9e9780464..326c1a6b7 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -93,6 +93,12 @@ ruoyi-workflow + + + org.dromara + ruoyi-common-mdc + + de.codecentric spring-boot-admin-starter-client diff --git a/ruoyi-admin/src/main/resources/logback-plus.xml b/ruoyi-admin/src/main/resources/logback-plus.xml index b74289ecd..a8c47d79a 100644 --- a/ruoyi-admin/src/main/resources/logback-plus.xml +++ b/ruoyi-admin/src/main/resources/logback-plus.xml @@ -2,7 +2,7 @@ + value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %red([%X{requestId}]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/> diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 2930fd0b0..e7ce5b434 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -34,6 +34,7 @@ ruoyi-common-tenant ruoyi-common-websocket ruoyi-common-sse + ruoyi-common-mdc ruoyi-common diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 62967c30d..c31685a75 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -179,6 +179,13 @@ ${revision} + + + org.dromara + ruoyi-common-mdc + ${revision} + + diff --git a/ruoyi-common/ruoyi-common-mdc/pom.xml b/ruoyi-common/ruoyi-common-mdc/pom.xml new file mode 100644 index 000000000..9e4f37e8a --- /dev/null +++ b/ruoyi-common/ruoyi-common-mdc/pom.xml @@ -0,0 +1,28 @@ + + + + org.dromara + ruoyi-common + ${revision} + + 4.0.0 + + ruoyi-common-mdc + + + ruoyi-common-mdc 全局请求id模块 + + + + + + + org.dromara + ruoyi-common-web + + + + + diff --git a/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/config/MdcAutoConfiguration.java b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/config/MdcAutoConfiguration.java new file mode 100644 index 000000000..b6d126a55 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/config/MdcAutoConfiguration.java @@ -0,0 +1,25 @@ +package org.dromara.common.mdc.config; + +import org.dromara.common.mdc.filter.RequestIdFilter; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; + +/** + * 短信配置类 + * + * @author Feng + */ +@AutoConfiguration +public class MdcAutoConfiguration { + + @Bean + public FilterRegistrationBean requestIdFilterRegistration(RequestIdFilter requestIdFilter) { + FilterRegistrationBean registration = new FilterRegistrationBean<>(); + registration.setFilter(requestIdFilter); + // 确保是最先执行的过滤器之一 + registration.setOrder(1); + registration.addUrlPatterns("/*"); + return registration; + } +} diff --git a/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/filter/RequestIdFilter.java b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/filter/RequestIdFilter.java new file mode 100644 index 000000000..4e9f98dbc --- /dev/null +++ b/ruoyi-common/ruoyi-common-mdc/src/main/java/org/dromara/common/mdc/filter/RequestIdFilter.java @@ -0,0 +1,60 @@ +package org.dromara.common.mdc.filter; + +import cn.hutool.core.util.StrUtil; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; +import java.util.UUID; + +/** + * 请求ID过滤器 + * 为每个HTTP请求生成唯一的请求ID并放入MDC中 + */ +@Component +@Slf4j +public class RequestIdFilter extends OncePerRequestFilter { + + public static final String REQUEST_ID_KEY = "requestId"; + public static final String REQUEST_ID_HEADER = "X-Request-ID"; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + try { + // 尝试从请求头中获取请求ID(支持从上游服务传递过来) + String requestId = request.getHeader(REQUEST_ID_HEADER); + + // 如果请求头中没有请求ID,则生成一个新的 + if (StrUtil.isBlank(requestId)) { + requestId = generateRequestId(); + log.debug("生成新的请求ID: {}", requestId); + // 将请求ID添加到响应头中 + response.addHeader(REQUEST_ID_HEADER, requestId); + } else { + log.debug("从请求头获取到请求ID: {}", requestId); + } + + // 将请求ID放入MDC + MDC.put(REQUEST_ID_KEY, requestId); + // 继续过滤器链 + filterChain.doFilter(request, response); + } finally { + // 清理MDC,防止内存泄漏 + MDC.remove(REQUEST_ID_KEY); + } + } + + /** + * 生成请求ID + */ + private String generateRequestId() { + return UUID.randomUUID().toString().replace("-", ""); + } +} diff --git a/ruoyi-common/ruoyi-common-mdc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-common/ruoyi-common-mdc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..0ce3f2c99 --- /dev/null +++ b/ruoyi-common/ruoyi-common-mdc/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.common.mdc.config.MdcAutoConfiguration