Przeglądaj źródła

网关新增 request-id参数

DESKTOP-VAEGFGM\zqc 3 miesięcy temu
rodzic
commit
e0b86c73c5
14 zmienionych plików z 262 dodań i 7 usunięć
  1. 11 0
      citu-framework/citu-common/src/main/java/com/citu/framework/common/util/monitor/RequestIdUtils.java
  2. 3 0
      citu-framework/citu-common/src/main/java/com/citu/framework/common/util/monitor/TracerUtils.java
  3. 5 2
      citu-framework/citu-spring-boot-starter-security/src/main/java/com/citu/framework/security/core/filter/TokenAuthenticationFilter.java
  4. 5 5
      citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/filter/ApiAccessLogFilter.java
  5. 39 0
      citu-gateway/src/main/java/com/citu/gateway/filter/cors/TraceIdFilter.java
  6. 2 0
      citu-gateway/src/main/java/com/citu/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java
  7. 4 0
      citu-gateway/src/main/java/com/citu/gateway/filter/security/TokenAuthenticationFilter.java
  8. 8 0
      citu-module-infra/citu-module-infra-api/src/main/java/com/citu/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java
  9. 23 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/api/MdeApiAccessLogInfoController.java
  10. 59 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/api/MdeApiAccessLogInfo.java
  11. 10 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/api/MdeApiAccessLogInfoMapper.java
  12. 75 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/filter/MdeApiAccessLogFilter.java
  13. 4 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/api/MdeApiAccessLogInfoService.java
  14. 14 0
      menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/api/MdeApiAccessLogInfoServiceImpl.java

+ 11 - 0
citu-framework/citu-common/src/main/java/com/citu/framework/common/util/monitor/RequestIdUtils.java

@@ -0,0 +1,11 @@
+package com.citu.framework.common.util.monitor;
+
+public class RequestIdUtils {
+    public static final String HEADER_NAME_REQUEST_ID = "request-id";
+
+
+
+
+
+
+}

+ 3 - 0
citu-framework/citu-common/src/main/java/com/citu/framework/common/util/monitor/TracerUtils.java

@@ -11,6 +11,9 @@ import org.apache.skywalking.apm.toolkit.trace.TraceContext;
  */
 public class TracerUtils {
 
+
+    public static final String HEADER_NAME_TRACE_ID = "trace-id";
+
     /**
      * 私有化构造方法
      */

+ 5 - 2
citu-framework/citu-spring-boot-starter-security/src/main/java/com/citu/framework/security/core/filter/TokenAuthenticationFilter.java

@@ -96,9 +96,12 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter {
                 throw new AccessDeniedException("错误的用户类型");
             }
             // 构建登录用户
-            return new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType())
+            return new LoginUser()
+                    .setId(accessToken.getUserId())
+                    .setUserType(accessToken.getUserType())
                     .setInfo(accessToken.getUserInfo()) // 额外的用户信息
-                    .setTenantId(accessToken.getTenantId()).setScopes(accessToken.getScopes())
+                    .setTenantId(accessToken.getTenantId())
+                    .setScopes(accessToken.getScopes())
                     .setExpiresTime(accessToken.getExpiresTime());
         } catch (ServiceException serviceException) {
             // 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可

+ 5 - 5
citu-framework/citu-spring-boot-starter-web/src/main/java/com/citu/framework/apilog/core/filter/ApiAccessLogFilter.java

@@ -12,6 +12,7 @@ import com.citu.framework.apilog.core.enums.OperateTypeEnum;
 import com.citu.framework.common.exception.enums.GlobalErrorCodeConstants;
 import com.citu.framework.common.pojo.CommonResult;
 import com.citu.framework.common.util.json.JsonUtils;
+import com.citu.framework.common.util.monitor.RequestIdUtils;
 import com.citu.framework.common.util.monitor.TracerUtils;
 import com.citu.framework.common.util.servlet.ServletUtils;
 import com.citu.framework.web.config.WebProperties;
@@ -23,6 +24,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.method.HandlerMethod;
 
@@ -199,13 +201,9 @@ public class ApiAccessLogFilter extends ApiRequestFilter {
                 return false;
             }
         }
-
         // 处理用户信息
         accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request))
                 .setUserType(WebFrameworkUtils.getLoginUserType(request));
-
-
-
         // 设置访问结果
         CommonResult<?> result = WebFrameworkUtils.getCommonResult(request);
         if (result != null) {
@@ -216,8 +214,10 @@ public class ApiAccessLogFilter extends ApiRequestFilter {
         } else {
             accessLog.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode()).setResultMsg("");
         }
+        String requestId = request.getHeader(RequestIdUtils.HEADER_NAME_REQUEST_ID);
         // 设置请求字段
-        accessLog.setTraceId(TracerUtils.getTraceId()).setApplicationName(applicationName)
+        accessLog.setRequestId(requestId)
+                .setTraceId(TracerUtils.getTraceId()).setApplicationName(applicationName)
                 .setRequestUrl(request.getRequestURI()).setRequestMethod(request.getMethod())
                 .setUserAgent(ServletUtils.getUserAgent(request)).setUserIp(ServletUtils.getClientIP(request));
         String[] sanitizeKeys = accessLogAnnotation != null ? accessLogAnnotation.sanitizeKeys() : null;

+ 39 - 0
citu-gateway/src/main/java/com/citu/gateway/filter/cors/TraceIdFilter.java

@@ -0,0 +1,39 @@
+package com.citu.gateway.filter.cors;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.IdUtil;
+import com.citu.framework.common.util.monitor.RequestIdUtils;
+import com.citu.framework.common.util.monitor.TracerUtils;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.List;
+
+@Component
+public class RequestIdFilter implements GlobalFilter {
+
+    @Override
+    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+        ServerHttpRequest request = exchange.getRequest();
+        List<String> traceIds = request.getHeaders().get(RequestIdUtils.HEADER_NAME_REQUEST_ID);
+        //判断是否有traceId
+        if (CollUtil.isNotEmpty(traceIds)) {
+            // 放行
+            return chain.filter(exchange);
+        }
+        //为空,生成一个traceId
+        String traceId = IdUtil.simpleUUID();
+        // 创建新的请求
+        ServerHttpRequest newRequest = request.mutate().header(RequestIdUtils.HEADER_NAME_REQUEST_ID, traceId).build();
+        // 创建新的exchange
+        ServerWebExchange newExchange = exchange.mutate().request(newRequest).build();
+        // 放行
+        return chain.filter(newExchange);
+    }
+
+
+}

+ 2 - 0
citu-gateway/src/main/java/com/citu/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java

@@ -99,8 +99,10 @@ public class GrayReactiveLoadBalancerClientFilter implements GlobalFilter, Order
                     if (log.isTraceEnabled()) {
                         log.trace("LoadBalancerClientFilter url chosen: " + requestUrl);
                     }
+//                    exchange.
                     exchange.getAttributes().put(GATEWAY_REQUEST_URL_ATTR, requestUrl);
                     exchange.getAttributes().put(GATEWAY_LOADBALANCER_RESPONSE_ATTR, response);
+
                     supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStartRequest(lbRequest, response));
                 }).then(chain.filter(exchange))
                 .doOnError(throwable -> supportedLifecycleProcessors.forEach(lifecycle -> lifecycle

+ 4 - 0
citu-gateway/src/main/java/com/citu/gateway/filter/security/TokenAuthenticationFilter.java

@@ -122,6 +122,7 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
         // 缓存不存在,则请求远程服务
         return checkAccessToken(tenantId, token).flatMap((Function<String, Mono<LoginUser>>) body -> {
             LoginUser remoteUser = buildUser(body);
+
             if (remoteUser != null) {
                 // 非空,则进行缓存
                 loginUserCache.put(cacheKey, remoteUser);
@@ -154,6 +155,9 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered {
 
         // 创建登录用户
         OAuth2AccessTokenCheckRespDTO tokenInfo = result.getData();
+
+//        tokenInfo.getUserInfo().
+
         return new LoginUser().setId(tokenInfo.getUserId()).setUserType(tokenInfo.getUserType())
                 .setInfo(tokenInfo.getUserInfo()) // 额外的用户信息
                 .setTenantId(tokenInfo.getTenantId()).setScopes(tokenInfo.getScopes())

+ 8 - 0
citu-module-infra/citu-module-infra-api/src/main/java/com/citu/module/infra/api/logger/dto/ApiAccessLogCreateReqDTO.java

@@ -13,8 +13,16 @@ public class ApiAccessLogCreateReqDTO {
     @Schema(description = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
     private String traceId;
 
+    @Schema(description = "请求链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
+    private String requestId;
+
+
+
     @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
     private Long userId;
+
+
+
     @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
     private Integer userType;
     @Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system-server")

+ 23 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/controller/admin/api/MdeApiAccessLogInfoController.java

@@ -0,0 +1,23 @@
+package com.citu.module.menduner.system.controller.admin.api;
+
+import com.citu.module.menduner.system.service.api.MdeApiAccessLogInfoService;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+public class MdeApiAccessLogInfoController {
+
+
+    @Resource
+    MdeApiAccessLogInfoService mdeApiAccessLogInfoService;
+
+
+
+
+
+
+
+
+
+}

+ 59 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/dataobject/api/MdeApiAccessLogInfo.java

@@ -0,0 +1,59 @@
+package com.citu.module.menduner.system.dal.dataobject.api;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+@TableName("mde_api_access_log_info")
+public class MdeApiAccessLogInfo {
+
+
+    private Long id;
+
+    private String traceId;
+
+    private Long userId;
+
+    private Long enterpriseId;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getTraceId() {
+        return traceId;
+    }
+
+    public void setTraceId(String traceId) {
+        this.traceId = traceId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getEnterpriseId() {
+        return enterpriseId;
+    }
+
+    public void setEnterpriseId(Long enterpriseId) {
+        this.enterpriseId = enterpriseId;
+    }
+
+
+    public MdeApiAccessLogInfo() {
+
+    }
+
+
+
+
+
+}

+ 10 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/dal/mysql/api/MdeApiAccessLogInfoMapper.java

@@ -0,0 +1,10 @@
+package com.citu.module.menduner.system.dal.mysql.api;
+
+import com.citu.framework.mybatis.core.mapper.BaseMapperX;
+import com.citu.module.menduner.system.dal.dataobject.api.MdeApiAccessLogInfo;
+import com.citu.module.menduner.system.dal.dataobject.appointment.NewAppointmentsDO;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface MdeApiAccessLogInfoMapper  extends BaseMapperX<MdeApiAccessLogInfo> {
+}

+ 75 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/filter/MdeApiAccessLogFilter.java

@@ -0,0 +1,75 @@
+package com.citu.module.menduner.system.filter;
+
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+import com.citu.framework.apilog.core.enums.OperateTypeEnum;
+import com.citu.framework.common.util.monitor.TracerUtils;
+import com.citu.framework.common.util.servlet.ServletUtils;
+import com.citu.framework.web.config.WebProperties;
+import com.citu.framework.web.core.filter.ApiRequestFilter;
+import com.citu.module.infra.api.logger.ApiAccessLogApi;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Map;
+
+/**
+ * API 访问日志 Filter
+ * <p>
+ * 目的:记录 API 访问日志到数据库中
+ *
+ * @author Rayson
+ */
+@Slf4j
+@Component
+public class MdeApiAccessLogFilter extends ApiRequestFilter {
+
+
+
+
+    public MdeApiAccessLogFilter(WebProperties webProperties) {
+        super(webProperties);
+
+    }
+
+
+
+
+    @Override
+    @SuppressWarnings("NullableProblems")
+    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
+            throws ServletException, IOException {
+
+
+        try {
+            // 继续过滤器
+            filterChain.doFilter(request, response);
+            // 正常执行,记录日志
+            createApiAccessLog(request, null);
+        } catch (Exception ex) {
+            // 异常执行,记录日志
+            createApiAccessLog(request, ex);
+            throw ex;
+        }
+    }
+
+    private void createApiAccessLog(HttpServletRequest request, Exception ex) {
+        String traceId = TracerUtils.getTraceId();
+
+        System.out.println("traceId:"+traceId);
+
+
+
+    }
+
+
+
+}
+

+ 4 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/api/MdeApiAccessLogInfoService.java

@@ -0,0 +1,4 @@
+package com.citu.module.menduner.system.service.api;
+
+public interface MdeApiAccessLogInfoService {
+}

+ 14 - 0
menduner/menduner-system-biz/src/main/java/com/citu/module/menduner/system/service/api/MdeApiAccessLogInfoServiceImpl.java

@@ -0,0 +1,14 @@
+package com.citu.module.menduner.system.service.api;
+
+import com.citu.module.menduner.system.dal.mysql.api.MdeApiAccessLogInfoMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MdeApiAccessLogInfoServiceImpl  implements MdeApiAccessLogInfoService{
+
+    @Autowired
+    MdeApiAccessLogInfoMapper mdeApiAccessLogInfoMapper;
+
+
+}