本文适配 SpringBoot 3.x,PIG JDK17 版本

目标

本章节以尽量短的时间,演示 PIG 框架如何整合 Apache ShardingSphere 完成分表操作。

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

快速上手

1. 添加 Maven 依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
</dependency>

2. 添加四张测试表

CREATE TABLE `sys_log_GET` (
    `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
    `type` char(1) DEFAULT '1' COMMENT '日志类型',
    `title` varchar(255) DEFAULT '' COMMENT '日志标题',
    `service_id` varchar(32) DEFAULT NULL COMMENT '服务 ID',
    `log_type` varchar(32) DEFAULT NULL COMMENT '日志类型',
    `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 '更新人',
    PRIMARY KEY (`id`),
    KEY `sys_log_create_by` (`create_by`),
    KEY `sys_log_request_uri` (`request_uri`),
    KEY `sys_log_type` (`type`),
    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 '编号',
    `type` char(1) DEFAULT '1' COMMENT '日志类型',
    `title` varchar(255) DEFAULT '' COMMENT '日志标题',
    `service_id` varchar(32) DEFAULT NULL COMMENT '服务 ID',
    `log_type` varchar(32) DEFAULT NULL COMMENT '日志类型',
    `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 '更新人',
    PRIMARY KEY (`id`),
    KEY `sys_log_create_by` (`create_by`),
    KEY `sys_log_request_uri` (`request_uri`),
    KEY `sys_log_type` (`type`),
    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 '编号',
    `type` char(1) DEFAULT '1' COMMENT '日志类型',
    `title` varchar(255) DEFAULT '' COMMENT '日志标题',
    `service_id` varchar(32) DEFAULT NULL COMMENT '服务 ID',
    `log_type` varchar(32) DEFAULT NULL COMMENT '日志类型',
    `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 '更新人',
    PRIMARY KEY (`id`),
    KEY `sys_log_create_by` (`create_by`),
    KEY `sys_log_request_uri` (`request_uri`),
    KEY `sys_log_type` (`type`),
    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 '编号',
    `type` char(1) DEFAULT '1' COMMENT '日志类型',
    `title` varchar(255) DEFAULT '' COMMENT '日志标题',
    `service_id` varchar(32) DEFAULT NULL COMMENT '服务 ID',
    `log_type` varchar(32) DEFAULT NULL COMMENT '日志类型',
    `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 '更新人',
    PRIMARY KEY (`id`),
    KEY `sys_log_create_by` (`create_by`),
    KEY `sys_log_request_uri` (`request_uri`),
    KEY `sys_log_type` (`type`),
    KEY `sys_log_create_date` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='日志表';

3. 配置 Nacos

nacos/pig-upms-biz-dev.yml 中添加配置:

spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:sharding.yaml 

4. 配置 ShardingSphere

pig-upms-biz/resources/sharding.yaml 中添加配置:

dataSources:
  ds_0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    jdbcUrl: jdbc:mysql://127.0.0.1:3306/pig?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

5. 业务测试

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

♥️ 获取支持

遇到问题?

如果您在使用过程中遇到任何问题、有功能建议或需求,请点击此卡片前往 Gitee 仓库提交 Issue。