【Sharding Sphere、Spring Boot】Spring Boot整合Sharding Sphere Jdbc(5.0.0):影子库压测

一、Sharding Sphere基本介绍

官网链接推荐:跳转官网 | 5.0.0中文文档 | 影子库压测介绍

二、环境准备

1、数据库准备

cyun_log_0数据库

CREATE DATABASE `cyun_log_0` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE `cyun_log_0`;

DROP TABLE IF EXISTS `t_sys_log`;
CREATE TABLE `t_sys_log`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

cyun_log_1数据库

CREATE DATABASE `cyun_log_1` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE `cyun_log_1`;

DROP TABLE IF EXISTS `t_sys_log`;
CREATE TABLE `t_sys_log`
(
    `id`               varchar(32) NOT NULL COMMENT '日志ID',
    `application_name` varchar(32) NOT NULL COMMENT '服务名称',
    `log_type`         int(2)      NOT NULL DEFAULT '0' COMMENT '日志类型(0-未知、1-登录日志、2-操作日志、3-定时任务日志)',
    `operate_type`     int(2)               DEFAULT NULL COMMENT '操作类型(0-未知、1-查询、2-添加、3-更新、4-删除、5-导入、6-导出)',
    `log_content`      varchar(1000)        DEFAULT NULL COMMENT '日志描述信息',
    `ip`               varchar(100)         DEFAULT NULL COMMENT 'IP',
    `method`           varchar(500)         DEFAULT NULL COMMENT '请求java方法',
    `request_url`      varchar(255)         DEFAULT NULL COMMENT '请求路径',
    `request_param`    longtext COMMENT '请求参数',
    `request_type`     varchar(10)          DEFAULT NULL COMMENT '请求类型',
    `cost_time`        bigint(20)           DEFAULT NULL COMMENT '耗时(单位:毫秒)',
    `create_by`        varchar(32)          DEFAULT NULL COMMENT '创建人',
    `create_time`      datetime             DEFAULT NULL COMMENT '创建时间',
    `update_by`        varchar(32)          DEFAULT NULL COMMENT '更新人',
    `update_time`      datetime             DEFAULT NULL COMMENT '更新时间',
    PRIMARY KEY (`id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4 COMMENT ='系统日志表';

2、使用Mybatis生成t_sys_log表对应得映射文件

在这里插入图片描述

三、Spring Boot整合Sharding Sphere Jdbc实现影子库压测

1、引入pom.xml依赖

		 <!--sharding-jdbc-->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
            <version>5.0.0</version>
        </dependency>

2、application.yml配置文件

server:
  port: 7207
  servlet:
    context-path: /sharding_sphere/shadow

# ShardingSphere 数据分片 单数据源
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    datasource:
      # 数据源
      names: ds,ds-shadow
      # 日志类型:未知、操作日志
      ds:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:7000/cyun_log_0?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.zaxxer.hikari.HikariDataSource
      # 日志类型:登录日志、定时任务日志
      ds-shadow:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:7000/cyun_log_1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
        username: root
        password: root
        type: com.zaxxer.hikari.HikariDataSource
    # 使用模式,支持三种模式:内存模式、单机模式、集群模式
    mode:
      type: Memory
    props:
      # 打印sql
      sql-show: true
      # 注解影子算法:解析 SQL 注释配置项
      sql-comment-parse-enabled: true
    # 规则
    rules:
      # 影子库配置
      shadow:
        # 影子库开关
        enable: true
        # 数据源配置
        dataSources:
          shadowDataSource:
            # 生产数据源名称
            sourceDataSourceName: ds
            # 影子数据源名称
            shadowDataSourceName: ds-shadow
        tables:
          t_sys_log:
            # 影子表关联影子数据源名称列表(多个值用","隔开)
            dataSourceNames: shadowDataSource
            # 影子表关联影子算法名称列表(多个值用","隔开)
            shadowAlgorithmNames: user-id-insert-match-algorithm,simple-note-algorithm
        # 影子算法名称
        shadowAlgorithms:
          # 自定义算法名称
          user-id-insert-match-algorithm:
            # 影子算法类型:列正则表达式匹配影子算法
            type: COLUMN_REGEX_MATCH
            # 影子算法属性配置
            props:
              operation: insert
              column: create_by
              regex: "[1]"
          simple-note-algorithm:
            # 影子算法类型:注解影子算法
            type: SIMPLE_NOTE
            props:
              foo: bar
              foo1: bar1

3、测试列正则表达式匹配影子算法

url请求接口

	@GetMapping(value = "/add/{userId}")
    public ResultVO add(@PathVariable("userId") String userId) {
        SysLog sysLog = SysLog.builder()
                .id(IdWorker.getIdStr())
                .applicationName("sharding-sphere-server")
                .logType(2)
                .operateType(2)
                .logContent("测试")
                .ip("127.0.0.1")
                .method("测试")
                .requestUrl("测试")
                .requestParam("测试")
                .requestType("get")
                .costTime(5L)
                .createBy(userId)
                .createTime(new Date())
                .updateBy("1")
                .updateTime(new Date())
                .build();

        sysLogService.save(sysLog);
        return ResultVO.ok();
    }

测试
在这里插入图片描述

控制台日志
在这里插入图片描述

4、注解影子算法

mapper新增添加方法
在这里插入图片描述

    /**
     * 自定义新增:测试影子库(添加 SQL 注释 /*shadow:true,foo:bar,..*\/)
     *
     * @param sysLog 日志
     * @return 成功数量
     */
    int add(SysLog sysLog);

mapper.xml新增添加方法

在这里插入图片描述

    <insert id="add">
        INSERT INTO t_sys_log VALUE
            (#{id}, 'sharding-sphere-server', 2, 2, '测试', '127.0.0.1', '测试', '测试', '测试', 'get',
            5, '1', '2022-04-22 18:23:06.988', '1', '2022-04-22 18:23:06.988')/*foo:bar,foo1:bar1*/
    </insert>

server和serverImpl改造
在这里插入图片描述

    /**
     * 自定义新增:测试影子库(添加 SQL 注释 /*shadow:true,foo:bar,..*\/)
     *
     * @param sysLog 日志
     * @return 成功数量
     */
    void add(SysLog sysLog);
    @Override
    public void add(SysLog sysLog) {
        sysLogMapper.add(sysLog);
    }

url请求

	 @GetMapping(value = "/add1")
    public ResultVO add1() {
        SysLog sysLog = SysLog.builder()
                .id(IdWorker.getIdStr())
                .applicationName("sharding-sphere-server")
                .logType(2)
                .operateType(2)
                .logContent("测试")
                .ip("127.0.0.1")
                .method("测试")
                .requestUrl("测试")
                .requestParam("测试")
                .requestType("get")
                .costTime(5L)
                .createBy("123")
                .createTime(new Date())
                .updateBy("123")
                .updateTime(new Date())
                .build();

        sysLogService.add(sysLog);
        return ResultVO.ok();
    }

测试
在这里插入图片描述
控制台日志
在这里插入图片描述

### 解决 Spring Boot 集成 ShardingSphere 时 `Error creating bean` 错误 当在 Spring Boot 中集成 ShardingSphere 并遇到 `Error creating bean with name 'io.shardingsphere'` 的错误时,通常是因为依赖版本不匹配或者配置文件中的某些参数设置不当引起的。以下是可能的原因分析以及解决方案。 #### 可能原因及解决方法 1. **依赖冲突** 如果项目中存在多个不同版本的 ShardingSphere 或者其他数据连接池组件(如 Druid),可能会导致 Bean 初始化失败。建议检查项目的 `pom.xml` 文件并统一依赖版本。 使用以下 Maven 依赖来确保兼容性: ```xml <!-- ShardingSphere JDBC Core --> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.0.0</version> </dependency> <!-- 数据连接池 (可选) --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency> ``` 确保所使用的 ShardingSphere 版本与官方文档一致[^1],并且避免混用旧版依赖[^4]。 2. **Spring BootShardingSphere 版本适配** 不同版本的 Spring Boot 对应不同的 ShardingSphere 支持范围。如果使用的是较新的 ShardingSphere 5.x,则需搭配 Spring Boot 2.3.x 或更高版本。可以通过调整 Spring Boot 版本来解决问题。 在 `pom.xml` 中指定合适的 Spring Boot 版本: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> </parent> ``` 3. **Bean 定义问题** 当某个类未被正确加载到 IOC 容器中时,可能导致 Bean 创建失败。这通常是由于缺少必要的注解或扫描路径配置错误引起[^3]。确认以下几个方面: - 是否在启动类上添加了 `@EnableAutoConfiguration` 注解; - 是否通过 `application.yml` 正确指定了数据源和其他必要属性。 示例 `application.yml` 配置如下: ```yaml spring: shardingsphere: datasource: names: master,slave_0 master: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/master?serverTimezone=UTC&useSSL=false username: root password: root slave_0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3307/slave_0?serverTimezone=UTC&useSSL=false username: root password: root rules: readwrite-splitting: data-sources: default: static-strategy: write-data-source-name: master read-data-source-names: slave_0 ``` 4. **日志排查** 启动应用时开启调试模式 (`logging.level.root=DEBUG`) ,查看具体的异常堆栈信息,定位具体哪个 Bean 导致了创建失败。常见的原因是某些字段未注入成功或配置项缺失。 --- ### 总结 上述方案涵盖了从依赖管理、版本控制到配置细节等多个角度的排查思路。按照这些步骤逐一验证可以有效减少此类问题的发生概率。 ```python # 试代码片段用于验证配置是否生效 from org.apache.shardingsphere import DataSource def test_sharding_sphere(): try: ds = DataSource() print(ds.getMetaData()) except Exception as e: print(f"Exception occurred: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值