开发喵星球

RuoYi 微服务日志分表实践(400)

在微服务架构中,为了优化日志的查询效率,可以对日志进行分表存储。本文以操作日志表 sys_oper_log 为例,展示如何利用 ShardingSphere 实现基于 HTTP 请求方式的分表策略。

一、引入 ShardingSphere 依赖

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_postsys_oper_log_putsys_oper_log_delete,仅修改表名和注释。

三、配置 ShardingSphere

在 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()));
    }
}

接口说明:

  1. GET /test/operlog/{method}:根据 method 参数插入日志记录。
  2. GET /test/operlog/list:查询所有分表中的日志数据。

五、启动验证

启动 RuoYiSystemApplication 后,访问以下接口进行测试:

测试完成后,检查数据库中相应的分表(如 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 请求方式进行了分表存储,并验证了其可行性。这种分表策略有效提升了查询效率,是日志管理的实用优化方案。

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-11-25 09:47:15 阅读量:56
<<   >>


powered by kaifamiao