SpringBoot自定義注解+異步+觀察者模式實現業務日志保存

一、前言我們在企業級的開發中,必不可少的是對日志的記錄,實現有很多種方式,常見的就是基于AOP+注解進行保存,但是考慮到程序的流暢和效率,我們可以使用異步進行保存,小編最近在spring和springboot源碼中看到有很多的監聽處理貫穿前后:這就是著名的觀察者模式?。?
二、基礎環境項目這里小編就不帶大家創建了,直接開始?。?
1. 導入依賴小編這里的springboot版本是:2.7.4
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Druid --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.16</version></dependency><!--jdbc--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- mybatis-plus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency>2. 編寫yml配置server:port: 8088spring:datasource:#使用阿里的Druidtype: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.239.131:3306/test?serverTimezone=UTCusername: rootpassword: root三、數據庫設計數據庫保存日志表的設計,小編一切從簡,一般日志多的后期會進行分庫分表 , 或者搭配ELK進行分析,分庫分表一般采用根據方法類型,這需要開發人員遵循rest風格,不然肯定都是post,純屬個人見解哈??!大笺炆以根据准s旱墓鏡囊蠼脅鉤涔 。?
DROP TABLE IF EXISTS `sys_log`;CREATE TABLE `sys_log`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '日志主鍵',`title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模塊標題',`business_type` int(2) NULL DEFAULT 0 COMMENT '業務類型(0其它 1新增 2修改 3刪除)',`method` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '方法名稱',`request_method` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '請求方式',`oper_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作人員',`oper_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '請求URL',`oper_ip` varchar(128) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主機地址',`oper_time` datetime(0) NULL DEFAULT NULL COMMENT '操作時間',PRIMARY KEY (`id`) USING BTREE) ENGINE = InnoDB AUTO_INCREMENT = 1585197503834284034 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志記錄' ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;實體類:
import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import java.time.LocalDateTime;/** * 操作日志記錄表 sys_log * */@Data@TableName("sys_log")public class SysLog {private static final long serialVersionUID = 1L;/*** 日志主鍵*/@TableIdprivate Long id;/*** 操作模塊*/private String title;/*** 業務類型(0其它 1新增 2修改 3刪除)*/private Integer businessType;/*** 請求方式*/private String requestMethod;/*** 操作人員*/private String operName;/*** 請求url*/private String operUrl;/*** 操作地址*/private String operIp;/*** 操作時間*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime operTime;}四、主要功能大體思路:先手寫一個注解--->切面來進行獲取要保存的數據--->一個發布者來發布要保存的數據--->一個監聽者監聽后保存(異步)
完整項目架構圖如下:

SpringBoot自定義注解+異步+觀察者模式實現業務日志保存

文章插圖
1. 編寫注解import com.example.demo.constant.BusinessTypeEnum;import java.lang.annotation.*;/** * 自定義操作日志記錄注解 * @author wangzhenjun * @date 2022/10/26 15:37 */@Target(ElementType.METHOD) // 注解只能用于方法@Retention(RetentionPolicy.RUNTIME) // 修飾注解的生命周期@Documentedpublic @interface Log {String value() default "";/*** 模塊*/String title() default "測試模塊";/*** 功能*/BusinessTypeEnum businessType() default BusinessTypeEnum.OTHER;}

推薦閱讀