在微服务架构中,为了优化日志的查询效率,可以对日志进行分表存储。本文以操作日志表
sys_oper_log
为例,展示如何利用 ShardingSphere 实现基于 HTTP 请求方式的分表策略。
在 ruoyi-system
模块的 pom.xml
文件中添加以下依赖:
<!-- ShardingSphere JDBC 分库分表 -->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
<version>5.1.2</version>
</dependency>
目标是根据 HTTP 请求类型(GET、POST、PUT、DELETE)对操作日志表 sys_oper_log
进行分表。为此,在数据库中创建对应的四个分表。
sys_oper_log_get
DROP TABLE IF EXISTS sys_oper_log_get;
CREATE TABLE sys_oper_log_get (
oper_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '日志主键',
title VARCHAR(50) DEFAULT '' COMMENT '模块标题',
business_type INT(2) DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',
method VARCHAR(100) DEFAULT '' COMMENT '方法名称',
request_method VARCHAR(10) DEFAULT '' COMMENT '请求方式',
operator_type INT(1) DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
oper_name VARCHAR(50) DEFAULT '' COMMENT '操作人员',
dept_name VARCHAR(50) DEFAULT '' COMMENT '部门名称',
oper_url VARCHAR(255) DEFAULT '' COMMENT '请求URL',
oper_ip VARCHAR(128) DEFAULT '' COMMENT '主机地址',
oper_location VARCHAR(255) DEFAULT '' COMMENT '操作地点',
oper_param VARCHAR(2000) DEFAULT '' COMMENT '请求参数',
json_result VARCHAR(2000) DEFAULT '' COMMENT '返回参数',
status INT(1) DEFAULT 0 COMMENT '操作状态(0正常 1异常)',
error_msg VARCHAR(2000) DEFAULT '' COMMENT '错误消息',
oper_time DATETIME COMMENT '操作时间',
PRIMARY KEY (oper_id)
) ENGINE=InnoDB AUTO_INCREMENT=100 COMMENT='GET 操作日志记录';
按相同结构创建 sys_oper_log_post
、sys_oper_log_put
和 sys_oper_log_delete
,仅修改表名和注释。
在 Nacos 配置中心的 ruoyi-system
服务中,添加 ShardingSphere 的相关配置。
spring:
shardingsphere:
datasource:
ds0:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.zaxxer.hikari.HikariDataSource
username: root
password: password
jdbc-url: jdbc:mysql://localhost:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
names: ds0
props:
sql-show: true
rules:
sharding:
sharding-algorithms:
table-inline:
type: INLINE
props:
algorithm-expression: sys_oper_log_$->{request_method}
tables:
sys_oper_log:
actual-data-nodes: ds0.sys_oper_log_get,ds0.sys_oper_log_post,ds0.sys_oper_log_put,ds0.sys_oper_log_delete
table-strategy:
standard:
sharding-column: request_method
sharding-algorithm-name: table-inline
通过 algorithm-expression
配置规则,request_method
字段决定记录写入的分表。
新增测试接口,用于验证日志的分表存储。
位置:TestOperlogController.java
package com.ruoyi.system.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.system.api.domain.SysOperLog;
import com.ruoyi.system.service.ISysOperLogService;
@RestController
@RequestMapping("/test/operlog")
public class TestOperlogController extends BaseController {
@Autowired
private ISysOperLogService operLogService;
@GetMapping("/{method}")
public AjaxResult logOperation(@PathVariable("method") String method) {
SysOperLog operLog = new SysOperLog();
operLog.setTitle("测试日志分表");
operLog.setOperName("admin");
operLog.setRequestMethod(method);
return toAjax(operLogService.insertOperlog(operLog));
}
@GetMapping("/list")
public AjaxResult listLogs() {
return AjaxResult.success(operLogService.selectOperLogList(new SysOperLog()));
}
}
接口说明:
GET /test/operlog/{method}
:根据 method
参数插入日志记录。GET /test/operlog/list
:查询所有分表中的日志数据。启动 RuoYiSystemApplication
后,访问以下接口进行测试:
http://localhost:9201/test/operlog/GET
http://localhost:9201/test/operlog/POST
http://localhost:9201/test/operlog/PUT
http://localhost:9201/test/operlog/DELETE
测试完成后,检查数据库中相应的分表(如 sys_oper_log_get
)是否写入数据。同时,通过 http://localhost:9201/test/operlog/list
接口可以查看所有分表记录。
由于 ShardingSphere 和动态数据源(dynamic-datasource
)模块存在冲突,需要移除动态数据源依赖:
位置:ruoyi-modules-system/pom.xml
<!-- 移除以下依赖 -->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common-datasource</artifactId>
</dependency>
注意:若需同时使用 ShardingSphere 和动态数据源,请参考多数据源集成的相关文档。
通过以上步骤,我们成功地将操作日志表 sys_oper_log
按 HTTP 请求方式进行了分表存储,并验证了其可行性。这种分表策略有效提升了查询效率,是日志管理的实用优化方案。
powered by kaifamiao