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.Collection;
import java.util.Map; import java.util.Map;
/**
* 审计管理器统一执行如何和配置入口
*/
public class AuditManager { public class AuditManager {
private static AuditTimeCreator auditTimeCreator = System::currentTimeMillis; private static Clock clock = System::currentTimeMillis;
private static AuditMessageCreator auditMessageCreator = new DefaultAuditMessageCreator(); private static MessageCreator messageCreator = new DefaultMessageCreator();
private static AuditMessageCollector auditMessageCollector = new DefaultAuditMessageCollector(); private static MessageCollector messageCollector = new ScheduledMessageCollector();
public static AuditTimeCreator getAuditTimeCreator() { public static Clock getClock() {
return auditTimeCreator; return clock;
} }
public static void setAuditTimeCreator(AuditTimeCreator auditTimeCreator) { public static void setClock(Clock clock) {
AuditManager.auditTimeCreator = auditTimeCreator; AuditManager.clock = clock;
} }
public static AuditMessageCreator getAuditMessageCreator() { public static MessageCreator getMessageCreator() {
return auditMessageCreator; return messageCreator;
} }
public static void setAuditMessageCreator(AuditMessageCreator auditMessageCreator) { public static void setMessageCreator(MessageCreator messageCreator) {
AuditManager.auditMessageCreator = auditMessageCreator; AuditManager.messageCreator = messageCreator;
} }
public static AuditMessageCollector getAuditMessageCollector() { public static MessageCollector getMessageCollector() {
return auditMessageCollector; return messageCollector;
} }
public static void setAuditMessageCollector(AuditMessageCollector auditMessageCollector) { public static void setMessageCollector(MessageCollector messageCollector) {
AuditManager.auditMessageCollector = auditMessageCollector; AuditManager.messageCollector = messageCollector;
} }
public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql) throws SQLException { public static <T> T startAudit(AuditRunnable<T> supplier, BoundSql boundSql) throws SQLException {
AuditMessage auditMessage = auditMessageCreator.create(); AuditMessage auditMessage = messageCreator.create();
if (auditMessage == null) { if (auditMessage == null) {
return supplier.execute(); return supplier.execute();
} }
auditMessage.setExtTime(auditTimeCreator.now()); auditMessage.setExtTime(clock.getTick());
try { try {
return supplier.execute(); return supplier.execute();
} finally { } finally {
auditMessage.setElapsedTime(auditTimeCreator.now() - auditMessage.getExtTime()); auditMessage.setElapsedTime(clock.getTick() - auditMessage.getExtTime());
auditMessage.setQuery(boundSql.getSql()); auditMessage.setQuery(boundSql.getSql());
Object parameter = boundSql.getParameterObject(); 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.io.Serializable;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class AuditMessage implements Serializable { public class AuditMessage implements Serializable {
@ -36,6 +38,8 @@ public class AuditMessage implements Serializable {
private long extTime; // Sql 执行的当前时间单位毫秒 private long extTime; // Sql 执行的当前时间单位毫秒
private long elapsedTime; // Sql 执行消耗的时间单位毫秒 private long elapsedTime; // Sql 执行消耗的时间单位毫秒
private Map<String, Object> metas; //其他信息元信息
public String getPlatform() { public String getPlatform() {
return platform; return platform;
@ -138,6 +142,20 @@ public class AuditMessage implements Serializable {
this.elapsedTime = elapsedTime; 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 @Override
public String toString() { public String toString() {

View File

@ -16,11 +16,10 @@
package com.mybatisflex.core.audit; 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 @Override
public void sendMessages(List<AuditMessage> messages) { public void sendMessages(List<AuditMessage> messages) {

View File

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

View File

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

View File

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

View File

@ -24,31 +24,33 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock; 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 long period = 10;
private ScheduledExecutorService scheduler; private ScheduledExecutorService scheduler;
private AuditMessageSender messageSender = new ConsoleAuditMessageSender(); private MessageReporter messageSender = new ConsoleMessageReporter();
private List<AuditMessage> messages = Collections.synchronizedList(new ArrayList<>()); private List<AuditMessage> messages = Collections.synchronizedList(new ArrayList<>());
private ReentrantReadWriteLock rrwLock = new ReentrantReadWriteLock(); private ReentrantReadWriteLock rrwLock = new ReentrantReadWriteLock();
public DefaultAuditMessageCollector() { public ScheduledMessageCollector() {
scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> { scheduler = Executors.newSingleThreadScheduledExecutor(runnable -> {
Thread thread = new Thread(runnable, "DefaultAuditMessageCollector"); Thread thread = new Thread(runnable, "ScheduledMessageCollector");
thread.setDaemon(true); thread.setDaemon(true);
return thread; return thread;
}); });
scheduler.scheduleAtFixedRate(this, period, period, TimeUnit.SECONDS); scheduler.scheduleAtFixedRate(this, period, period, TimeUnit.SECONDS);
} }
public DefaultAuditMessageCollector(long period, AuditMessageSender messageSender) {
public ScheduledMessageCollector(long period, MessageReporter messageSender) {
this.period = period; this.period = period;
this.messageSender = messageSender; this.messageSender = messageSender;
} }
@Override @Override
public void collect(AuditMessage message) { public void collect(AuditMessage message) {
try { try {