optimize Audit module

This commit is contained in:
开源海哥 2023-03-28 10:30:49 +08:00
parent c0190d7ecd
commit ebfdc86cda
9 changed files with 56 additions and 34 deletions

View File

@ -23,47 +23,50 @@ import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
/**
* 审计管理器统一执行如何和配置入口
*/
public class AuditManager {
private static AuditTimeCreator auditTimeCreator = System::currentTimeMillis;
private static AuditMessageCreator auditMessageCreator = new DefaultAuditMessageCreator();
private static AuditMessageCollector auditMessageCollector = new DefaultAuditMessageCollector();
private static Clock clock = System::currentTimeMillis;
private static MessageCreator messageCreator = new DefaultMessageCreator();
private static MessageCollector messageCollector = new ScheduledMessageCollector();
public static AuditTimeCreator getAuditTimeCreator() {
return auditTimeCreator;
public static Clock getClock() {
return clock;
}
public static void setAuditTimeCreator(AuditTimeCreator auditTimeCreator) {
AuditManager.auditTimeCreator = auditTimeCreator;
public static void setClock(Clock clock) {
AuditManager.clock = clock;
}
public static AuditMessageCreator getAuditMessageCreator() {
return auditMessageCreator;
public static MessageCreator getMessageCreator() {
return messageCreator;
}
public static void setAuditMessageCreator(AuditMessageCreator auditMessageCreator) {
AuditManager.auditMessageCreator = auditMessageCreator;
public static void setMessageCreator(MessageCreator messageCreator) {
AuditManager.messageCreator = messageCreator;
}
public static AuditMessageCollector getAuditMessageCollector() {
return auditMessageCollector;
public static MessageCollector getMessageCollector() {
return messageCollector;
}
public static void setAuditMessageCollector(AuditMessageCollector auditMessageCollector) {
AuditManager.auditMessageCollector = auditMessageCollector;
public static void setMessageCollector(MessageCollector messageCollector) {
AuditManager.messageCollector = messageCollector;
}
public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql) throws SQLException {
AuditMessage auditMessage = auditMessageCreator.create();
AuditMessage auditMessage = messageCreator.create();
if (auditMessage == null) {
return supplier.execute();
}
auditMessage.setExtTime(auditTimeCreator.now());
auditMessage.setExtTime(clock.getTick());
try {
return supplier.execute();
} finally {
auditMessage.setElapsedTime(auditTimeCreator.now() - auditMessage.getExtTime());
auditMessage.setElapsedTime(clock.getTick() - auditMessage.getExtTime());
auditMessage.setQuery(boundSql.getSql());
Object parameter = boundSql.getParameterObject();
@ -87,7 +90,7 @@ public class AuditManager {
}
}
}
auditMessageCollector.collect(auditMessage);
messageCollector.collect(auditMessage);
}
}

View File

@ -18,7 +18,9 @@ package com.mybatisflex.core.audit;
import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class AuditMessage implements Serializable {
@ -36,6 +38,8 @@ public class AuditMessage implements Serializable {
private long extTime; // Sql 执行的当前时间单位毫秒
private long elapsedTime; // Sql 执行消耗的时间单位毫秒
private Map<String, Object> metas; //其他信息元信息
public String getPlatform() {
return platform;
@ -138,6 +142,20 @@ public class AuditMessage implements Serializable {
this.elapsedTime = elapsedTime;
}
public Map<String, Object> getMetas() {
return metas;
}
public void setMetas(Map<String, Object> metas) {
this.metas = metas;
}
public void addMeta(String key, Object value) {
if (metas == null) {
metas = new HashMap<>();
}
metas.put(key, value);
}
@Override
public String toString() {

View File

@ -16,11 +16,10 @@
package com.mybatisflex.core.audit;
/**
* 审计时间创建器对于性要求特别高的场景
* 可以定义自己的时间构建器用来代替 {@link System#currentTimeMillis()}
* 对于性要求特别高的场景用户可以定义自己的时钟用来代替 {@link System#currentTimeMillis()}
*/
public interface AuditTimeCreator {
public interface Clock {
long now();
long getTick();
}

View File

@ -20,7 +20,7 @@ import java.util.List;
/**
* 控制台输出审计消息
*/
public class ConsoleAuditMessageSender implements AuditMessageSender {
public class ConsoleMessageReporter implements MessageReporter {
@Override
public void sendMessages(List<AuditMessage> messages) {

View File

@ -23,7 +23,7 @@ import java.util.Enumeration;
/**
* 默认的审计消息创建器用来创建带有 hostIp 的审计消息
*/
public class DefaultAuditMessageCreator implements AuditMessageCreator {
public class DefaultMessageCreator implements MessageCreator {
private String platform = "mybatis-flex";
private String hostIp = getHostIp();

View File

@ -18,6 +18,6 @@ package com.mybatisflex.core.audit;
/**
* 审计消息收集器
*/
public interface AuditMessageCollector {
public interface MessageCollector {
void collect(AuditMessage message);
}

View File

@ -19,7 +19,7 @@ package com.mybatisflex.core.audit;
* 审计消息创建器在一般的 web 服务中用户应该自定义自己的 AuditMessageCreator
* 用来配置当前操作用户用户 IP 地址访问的 url 地址等
*/
public interface AuditMessageCreator {
public interface MessageCreator {
AuditMessage create();

View File

@ -22,7 +22,7 @@ import java.util.List;
* 审计消息发送器作用是把审计消息发送到指定的位置
* 比如控制台磁盘或者 kafka 服务器 http 服务器等
*/
public interface AuditMessageSender {
public interface MessageReporter {
void sendMessages(List<AuditMessage> messages);

View File

@ -24,31 +24,33 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
* 默认的审计消息收集器其收集消息后定时通过消息发送器{@link AuditMessageSender}把消息发送过去
* 默认的审计消息收集器其收集消息后定时通过消息发送器{@link MessageReporter}把消息发送过去
*/
public class DefaultAuditMessageCollector implements AuditMessageCollector, Runnable {
public class ScheduledMessageCollector implements MessageCollector, Runnable {
private long period = 10;
private ScheduledExecutorService scheduler;
private AuditMessageSender messageSender = new ConsoleAuditMessageSender();
private MessageReporter messageSender = new ConsoleMessageReporter();
private List<AuditMessage> messages = Collections.synchronizedList(new ArrayList<>());
private ReentrantReadWriteLock rrwLock = new ReentrantReadWriteLock();
public DefaultAuditMessageCollector() {
public ScheduledMessageCollector() {
scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
Thread thread = new Thread(runnable, "DefaultAuditMessageCollector");
Thread thread = new Thread(runnable, "ScheduledMessageCollector");
thread.setDaemon(true);
return thread;
});
scheduler.scheduleAtFixedRate(this, period, period, TimeUnit.SECONDS);
}
public DefaultAuditMessageCollector(long period, AuditMessageSender messageSender) {
public ScheduledMessageCollector(long period, MessageReporter messageSender) {
this.period = period;
this.messageSender = messageSender;
}
@Override
public void collect(AuditMessage message) {
try {