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

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

一、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依赖
		 
        <dependency>
            <groupId>org.apache.shardingspheregroupId>
            <artifactId>shardingsphere-jdbc-core-spring-boot-starterartifactId>
            <version>5.0.0version>
        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();
    }

测试

控制台日志

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/723540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存