SpringBoot 3.x.x整合ShardingSphere-JDBC 5.5.0 实现读写分离,数据分片,数据脱敏功能

一、前言

  • 随着业务的迭代发展,并发量逐渐变大,在不考虑缓存等其他方案的前提下,数据库性能就可能出现瓶颈,为了解决并发性能,就需要进行读写分离,将流量进行分流,写操作走主库,读操作走从库,同时伴随着数据的增多,单库单表也会出现性能问题,通过分库分表对数据进行分治,从而提高性能. 不过读写分离和分库分表也会带来其他问题,比如主从延迟,分布式事务,跨库联表查询等等,所以要根据实际情况确定详细的方案.这里就不进行阐述.

二、集成ShardingSphere-JDBC

  • ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。ShardingSphere官网
  • 在实际的集成过程中,会遇到各种各样的问题,网上的文章大多数版本比较低,ShardingSphere版本更新变化也比较大,会出现各种依赖问题,配置格式不对,功能不生效等等.
  • 版本号:spring 3.2.4 + ShardingSphere-JDBC 5.5.0
  • pom的引入,shardingsphere-jdbc-core-spring-boot-starter作者不进行维护了,所以按照官网介绍引入指定的依赖.
  • application 配置文件
  • sharding 配置文件(重点)
yaml 复制代码
dataSources:
  ds0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/demo_ds?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: admin123
    poolName: test0
    minPoolSize: 2
    maxPoolSize: 20
  ds1:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: admin123
    poolName: test1
    minPoolSize: 5
    maxPoolSize: 20
  ds2:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: admin123
    poolName: test2
    minPoolSize: 5
    maxPoolSize: 20
rules:
  #  - !SINGLE
  #    tables:
  #      - "*.order_*"
  - !READWRITE_SPLITTING
    dataSources:
      readwrite_ds:
        writeDataSourceName: ds0
        readDataSourceNames:
          - ds1
          - ds2
        loadBalancerName: ROUND_ROBIN
    loadBalancers:
      ROUND_ROBIN:
        type: ROUND_ROBIN
  - !SHARDING
    #    autoTables:
    #      order:
    #        actualDataSources: ds1,ds2
    #        shardingStrategy:
    #          standard:
    #            shardingColumn: order_id
    #            shardingAlgorithmName: auto_mod
    tables:
      order:
        actualDataNodes: readwrite_ds.order_${0..1}
        tableStrategy:
          standard:
            shardingColumn: order_id
            shardingAlgorithmName: order_inline
    #          complex:
    #            shardingColumns: customer_id,order_id
    #            shardingAlgorithmName: customer
    defaultTableStrategy:
      none:
    shardingAlgorithms:
      auto_mod:
        type: MOD
        props:
          sharding-count: 2
      order_inline:
        type: INLINE
        props:
          algorithm-expression: order_${order_id % 2}
      customer:
        type: CLASS_BASED
        props:
          strategy: COMPLEX
          algorithmClassName: com.example.shardingsphere.service.CustomerShardingAlgorithm
  - !MASK
    tables:
      order:
        columns:
          delivery_address:
            maskAlgorithm: keep_first_n_last_m_mask

    maskAlgorithms:
      keep_first_n_last_m_mask:
        type: KEEP_FIRST_N_LAST_M
        props:
          first-n: 1
          last-m: 2
          replace-char: '*'
props:
  sql-show: true
#  sql-simple: true
  • 注意点:
  • 图中画线的要注意,使用内置的分片策略要配合自动分片标签配置,官网只有简单场景的配置示例,所以在实际业务配置过程中容易出现问题,看了github的issues大多数都是配置不正确导致的,当时觉得官网文档不能覆盖各种场景,配置过于复杂,后来发现作者在examples模块做了说明,并且可以生成各种配置示例.
  • demo链接:github.com/huang-xuan/...
相关推荐
uzong2 小时前
技术故障复盘模版
后端
GetcharZp2 小时前
基于 Dify + 通义千问的多模态大模型 搭建发票识别 Agent
后端·llm·agent
桦说编程3 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
IT毕设实战小研3 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi3 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
阿华的代码王国4 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Jimmy4 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
AntBlack5 小时前
不当韭菜V1.1 :增强能力 ,辅助构建自己的交易规则
后端·python·pyqt
bobz9655 小时前
pip install 已经不再安全
后端
寻月隐君6 小时前
硬核实战:从零到一,用 Rust 和 Axum 构建高性能聊天服务后端
后端·rust·github