Quellcode durchsuchen

GatewayLog 先存到 mongodb 吧

reghao vor 7 Monaten
Ursprung
Commit
88b5d07f25

+ 10 - 0
search/search-service/pom.xml

@@ -18,6 +18,11 @@
     </properties>
 
     <dependencies>
+        <dependency>
+            <groupId>cn.reghao.tnb</groupId>
+            <artifactId>common</artifactId>
+            <version>1.0.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>cn.reghao.bnt</groupId>
             <artifactId>log</artifactId>
@@ -69,6 +74,11 @@
             <artifactId>spring-boot-starter-amqp</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
+
         <!-- lucene -->
         <dependency>
             <groupId>org.hibernate.search</groupId>

+ 42 - 0
search/search-service/src/main/java/cn/reghao/tnb/search/app/config/web/TokenFilter.java

@@ -0,0 +1,42 @@
+package cn.reghao.tnb.search.app.config.web;
+
+import cn.reghao.jutil.web.ServletUtil;
+import cn.reghao.tnb.common.auth.LoginUser;
+import cn.reghao.tnb.common.auth.UserContext;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import java.io.IOException;
+
+/**
+ * HTTP 请求过滤器
+ *
+ * @author reghao
+ * @date 2025-07-18 09:18:16
+ */
+@Component
+public class TokenFilter implements Filter {
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+    }
+
+    @Override
+    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+            throws IOException, ServletException {
+        long userId = -1L;
+        String userIdStr = ServletUtil.getHeader("x-user-id");
+        if (userIdStr != null) {
+            userId = Long.parseLong(userIdStr);
+        }
+
+        String loginId = ServletUtil.getHeader("x-login-id");
+        LoginUser loginUser = new LoginUser(userId);
+        try (UserContext context = new UserContext(loginUser)) {
+            chain.doFilter(request, response);
+        }
+    }
+
+    @Override
+    public void destroy() {
+    }
+}

+ 23 - 0
search/search-service/src/main/java/cn/reghao/tnb/search/app/config/web/WebConfig.java

@@ -0,0 +1,23 @@
+package cn.reghao.tnb.search.app.config.web;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.servlet.Filter;
+
+/**
+ * @author reghao
+ * @date 2025-07-18 09:18:16
+ */
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+    @Bean
+    public FilterRegistrationBean<Filter> filterRegistrationBean(TokenFilter tokenFilter) {
+        FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
+        registrationBean.setFilter(tokenFilter);
+        registrationBean.addUrlPatterns("*");
+        return registrationBean;
+    }
+}

+ 7 - 1
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/consumer/RabbitListeners.java

@@ -3,6 +3,8 @@ package cn.reghao.tnb.search.app.log.consumer;
 import cn.reghao.bnt.log.AppLog;
 import cn.reghao.bnt.log.GatewayLog;
 import cn.reghao.jutil.jdk.serializer.JsonConverter;
+import cn.reghao.tnb.search.app.log.db.AccessLogMongo;
+import cn.reghao.tnb.search.app.log.model.po.AccessLog;
 import cn.reghao.tnb.search.app.ws.handler.LogHandler;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.amqp.rabbit.annotation.Exchange;
@@ -20,9 +22,11 @@ import org.springframework.stereotype.Component;
 @Component
 public class RabbitListeners {
     private final LogHandler logHandler;
+    private AccessLogMongo accessLogMongo;
 
-    public RabbitListeners(LogHandler logHandler) {
+    public RabbitListeners(LogHandler logHandler, AccessLogMongo accessLogMongo) {
         this.logHandler = logHandler;
+        this.accessLogMongo = accessLogMongo;
     }
 
     @RabbitListener(bindings =@QueueBinding(
@@ -34,6 +38,8 @@ public class RabbitListeners {
         GatewayLog gatewayLog = JsonConverter.jsonToObject(msg, GatewayLog.class);
         logHandler.pushGatewayLog(gatewayLog);
         log.info("{} -> {}", gatewayLog.getRequestId(), gatewayLog.getRequestUrl());
+        AccessLog accessLog = new AccessLog(gatewayLog);
+        accessLogMongo.save(accessLog);
     }
 
     @RabbitListener(bindings =@QueueBinding(

+ 92 - 0
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/db/AccessLogMongo.java

@@ -0,0 +1,92 @@
+package cn.reghao.tnb.search.app.log.db;
+
+import cn.reghao.jutil.jdk.db.BaseCrud;
+import cn.reghao.jutil.jdk.db.BaseQuery;
+import cn.reghao.tnb.search.app.log.model.po.AccessLog;
+import com.mongodb.MongoBulkWriteException;
+import com.mongodb.client.MongoCursor;
+import com.mongodb.client.model.InsertManyOptions;
+import com.mongodb.client.result.InsertManyResult;
+import org.bson.Document;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.convert.MongoConverter;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2025-08-14 14:35:00
+ */
+@Repository
+public class AccessLogMongo implements BaseCrud<AccessLog>, BaseQuery<AccessLog> {
+    private final String colName = "AccessLog";
+    private final MongoTemplate mongoTemplate;
+    private final MongoConverter mongoConverter;
+    private final int pageSize = 100;
+
+    public AccessLogMongo(MongoTemplate mongoTemplate, MongoConverter mongoConverter) {
+        this.mongoTemplate = mongoTemplate;
+        this.mongoConverter = mongoConverter;
+    }
+
+    @Override
+    public AccessLog save(AccessLog accessLog) {
+        Document doc = new Document();
+        mongoConverter.write(accessLog, doc);
+        mongoTemplate.getCollection(colName).insertOne(doc);
+        return null;
+    }
+
+    @Override
+    public void saveAll(List<AccessLog> list) {
+        List<Document> documents = list.stream()
+                .map(t -> {
+                    Document doc = new Document();
+                    mongoConverter.write(t, doc);
+                    return doc;
+                })
+                .collect(Collectors.toList());
+
+        InsertManyOptions options = new InsertManyOptions();
+        // 忽略 insert 失败的文档
+        options.ordered(false);
+        try {
+            InsertManyResult result = mongoTemplate.getCollection(colName).insertMany(documents, options);
+        }  catch (MongoBulkWriteException ignore) {
+        }
+    }
+
+    @Override
+    public void update(AccessLog accessLog) {
+    }
+
+    @Override
+    public void delete(AccessLog accessLog) {
+    }
+
+    public MongoCursor<Document> getCursor(Map<String, Object> map) {
+        Document filter = new Document();
+        filter.putAll(map);
+        return mongoTemplate.getCollection(colName).find(filter, Document.class).noCursorTimeout(true).cursor();
+    }
+
+    public List<AccessLog> findAll(long page) {
+        Query query = new Query();
+        query.skip((page - 1) * pageSize).limit(pageSize);
+        query.with(Sort.by(new Sort.Order(Sort.Direction.DESC, "requestTime")));
+        return mongoTemplate.find(query, AccessLog.class, colName);
+    }
+
+    public List<AccessLog> findByTargetServer(String targetServer) {
+        Query query = new Query();
+        query.addCriteria(Criteria.where("targetServer").is(targetServer));
+        query.with(Sort.by(new Sort.Order(Sort.Direction.DESC, "requestTime")));
+        return mongoTemplate.find(query, AccessLog.class, colName);
+    }
+}

+ 50 - 0
search/search-service/src/main/java/cn/reghao/tnb/search/app/log/model/po/AccessLog.java

@@ -0,0 +1,50 @@
+package cn.reghao.tnb.search.app.log.model.po;
+
+import cn.reghao.bnt.log.GatewayLog;
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+/**
+ * @author reghao
+ * @date 2025-08-14 14:34:36
+ */
+@NoArgsConstructor
+@Getter
+public class AccessLog extends BaseObject<String> {
+    private String requestId;
+    private long requestTime;
+    private String targetRoute;
+    private String targetService;
+    private String requestUrl;
+    private String requestMethod;
+    private Map<String, String> requestHeaders;
+    private String requestBody;
+    private String remoteAddr = "";
+    private int remotePort = 0;
+    private int statusCode;
+    private Map<String, String> responseHeaders;
+    private String responseBody;
+    private long responseTime;
+    private long executeTime;
+
+    public AccessLog(GatewayLog gatewayLog) {
+        this.requestId = gatewayLog.getRequestId();
+        this.requestTime = gatewayLog.getRequestTime();
+        this.targetRoute = gatewayLog.getTargetRoute();
+        this.targetService = gatewayLog.getTargetService();
+        this.requestUrl = gatewayLog.getRequestUrl();
+        this.requestMethod = gatewayLog.getRequestMethod();
+        this.requestHeaders = gatewayLog.getRequestHeaders();
+        this.requestBody = gatewayLog.getRequestBody();
+        this.remoteAddr = gatewayLog.getRemoteAddr();
+        this.remotePort = gatewayLog.getRemotePort();
+        this.statusCode = gatewayLog.getStatusCode();
+        this.responseHeaders = gatewayLog.getResponseHeaders();
+        this.responseBody = gatewayLog.getResponseBody();
+        this.responseTime = gatewayLog.getResponseTime();
+        this.executeTime = gatewayLog.getExecuteTime();
+    }
+}

+ 7 - 0
search/search-service/src/main/resources/application-dev.yml

@@ -5,6 +5,13 @@ spring:
   cloud:
     discovery:
       enabled: true
+  data:
+    mongodb:
+      host: localhost
+      database: "tnb_content_rdb"
+      authentication-database: admin
+      username: dev
+      password: Dev@123456
   redis:
     database: 0
     host: localhost

+ 7 - 0
search/search-service/src/main/resources/application-test.yml

@@ -5,6 +5,13 @@ spring:
   cloud:
     discovery:
       enabled: true
+  data:
+    mongodb:
+      host: 192.168.0.209
+      database: "tnb_content_tdb"
+      authentication-database: admin
+      username: test
+      password: Test@123456
   redis:
     database: 0
     host: 192.168.0.209