整合 shardingsphere分库分表

背景

依赖版本
PIGX5.9
架构模式微服务
shardingsphere5.5.0

实现效果: 日志表根据 请求方法的不同 拆分为 GET、POST、PUT、DELETE 数据库

分库分表效果图

快速上手

1. 目标微服务添加 maven 依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc</artifactId>
    <version>5.5.0</version>
    <exclusions>
        <exclusion>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-test-util</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 添加四张测试表

CREATE TABLE `sys_log_GET` (
                           `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
                           `log_type` char(1) DEFAULT '1' COMMENT '日志类型',
                           `title` varchar(255) DEFAULT '' COMMENT '日志标题',
                           `service_id` varchar(32) DEFAULT NULL COMMENT '服务ID',
                           `remote_addr` varchar(255) DEFAULT NULL COMMENT '操作IP地址',
                           `user_agent` varchar(1000) DEFAULT NULL COMMENT '用户代理',
                           `request_uri` varchar(255) DEFAULT NULL COMMENT '请求URI',
                           `method` varchar(10) DEFAULT NULL COMMENT '操作方式',
                           `params` text COMMENT '操作提交的数据',
                           `time` mediumtext COMMENT '执行时间',
                           `del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
                           `exception` text COMMENT '异常信息',
                           `create_time` datetime DEFAULT NULL COMMENT '创建时间',
                           `update_time` datetime DEFAULT NULL COMMENT '更新时间',
                           `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
                           `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
                                                      `tenant_id` bigint DEFAULT '0' COMMENT '所属租户',

                           PRIMARY KEY (`id`),
                           KEY `sys_log_create_by` (`create_by`),
                           KEY `sys_log_request_uri` (`request_uri`),
                           KEY `sys_log_create_date` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表';

CREATE TABLE `sys_log_POST` (
                           `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
                           `log_type` char(1) DEFAULT '1' COMMENT '日志类型',
                           `title` varchar(255) DEFAULT '' COMMENT '日志标题',
                           `service_id` varchar(32) DEFAULT NULL COMMENT '服务ID',
                           `remote_addr` varchar(255) DEFAULT NULL COMMENT '操作IP地址',
                           `user_agent` varchar(1000) DEFAULT NULL COMMENT '用户代理',
                           `request_uri` varchar(255) DEFAULT NULL COMMENT '请求URI',
                           `method` varchar(10) DEFAULT NULL COMMENT '操作方式',
                           `params` text COMMENT '操作提交的数据',
                           `time` mediumtext COMMENT '执行时间',
                           `del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
                           `exception` text COMMENT '异常信息',
                           `create_time` datetime DEFAULT NULL COMMENT '创建时间',
                           `update_time` datetime DEFAULT NULL COMMENT '更新时间',
                           `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
                           `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
                                                      `tenant_id` bigint DEFAULT '0' COMMENT '所属租户',

                           PRIMARY KEY (`id`),
                           KEY `sys_log_create_by` (`create_by`),
                           KEY `sys_log_request_uri` (`request_uri`),
                           KEY `sys_log_create_date` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表';


CREATE TABLE `sys_log_PUT` (
                           `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
                           `log_type` char(1) DEFAULT '1' COMMENT '日志类型',
                           `title` varchar(255) DEFAULT '' COMMENT '日志标题',
                           `service_id` varchar(32) DEFAULT NULL COMMENT '服务ID',
                           `remote_addr` varchar(255) DEFAULT NULL COMMENT '操作IP地址',
                           `user_agent` varchar(1000) DEFAULT NULL COMMENT '用户代理',
                           `request_uri` varchar(255) DEFAULT NULL COMMENT '请求URI',
                           `method` varchar(10) DEFAULT NULL COMMENT '操作方式',
                           `params` text COMMENT '操作提交的数据',
                           `time` mediumtext COMMENT '执行时间',
                           `del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
                           `exception` text COMMENT '异常信息',
                           `create_time` datetime DEFAULT NULL COMMENT '创建时间',
                           `update_time` datetime DEFAULT NULL COMMENT '更新时间',
                           `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
                           `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
                                                      `tenant_id` bigint DEFAULT '0' COMMENT '所属租户',

                           PRIMARY KEY (`id`),
                           KEY `sys_log_create_by` (`create_by`),
                           KEY `sys_log_request_uri` (`request_uri`),
                           KEY `sys_log_create_date` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表';

CREATE TABLE `sys_log_DELETE` (
                           `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
                           `log_type` char(1) DEFAULT '1' COMMENT '日志类型',
                           `title` varchar(255) DEFAULT '' COMMENT '日志标题',
                           `service_id` varchar(32) DEFAULT NULL COMMENT '服务ID',
                           `remote_addr` varchar(255) DEFAULT NULL COMMENT '操作IP地址',
                           `user_agent` varchar(1000) DEFAULT NULL COMMENT '用户代理',
                           `request_uri` varchar(255) DEFAULT NULL COMMENT '请求URI',
                           `method` varchar(10) DEFAULT NULL COMMENT '操作方式',
                           `params` text COMMENT '操作提交的数据',
                           `time` mediumtext COMMENT '执行时间',
                           `del_flag` char(1) DEFAULT '0' COMMENT '删除标记',
                           `exception` text COMMENT '异常信息',
                           `create_time` datetime DEFAULT NULL COMMENT '创建时间',
                           `update_time` datetime DEFAULT NULL COMMENT '更新时间',
                           `create_by` varchar(64) DEFAULT NULL COMMENT '创建人',
                           `update_by` varchar(64) DEFAULT NULL COMMENT '更新人',
                                                      `tenant_id` bigint DEFAULT '0' COMMENT '所属租户',
                           PRIMARY KEY (`id`),
                           KEY `sys_log_create_by` (`create_by`),
                           KEY `sys_log_request_uri` (`request_uri`),
                           KEY `sys_log_create_date` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表';

3. nacos/pigx-upms-biz-dev.yml 添加配置

# 原有mysql 指向 ShardingSphere
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
      url: jdbc:shardingsphere:classpath:sharding.yaml

4. pigx-upms-biz/resources/sharding.yaml 添加配置

dataSources:
  ds_0:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://pigx-mysql:3306/pigxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
rules:
  - !SINGLE
    tables:
      - "*.*"
  - !SHARDING
    tables:
      sys_log:
        actualDataNodes: ds_0.sys_log_GET,ds_0.sys_log_POST,ds_0.sys_log_PUT,ds_0.sys_log_DELETE
        tableStrategy:
          standard:
            shardingAlgorithmName: table-inline
            shardingColumn: method
    shardingAlgorithms:
      table-inline:
        props:
          algorithm-expression: sys_log_$->{method}
        type: INLINE
props:
  sql-show: true

4. 业务测试

编辑角色、新增角色 查看数据库中日志表记录

特别说明

  • 本文档仅供参考,具体实现请根据实际需求进行调整。
  • ShardingSphere 与系统现有的动态数据源模块(common-datasource)存在冲突,因此二者需择一使用。
  • 如启动单体应用,请注释掉 pigx-codegen 模块以避免不必要的依赖问题。
版本兼容性说明
  1. ShardingSphere 各版本间存在很大配置差异,请严格遵循本文档指定的 5.5.0 版本及对应配置项
  2. 若需使用其他版本,请务必参考官方版本迁移指南
  3. 其他技术问题请优先查阅官方文档 或通过 GitHub Issues 提交问题