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/...
相关推荐
Clarify32 分钟前
docker部署go游戏服务器(进阶版)
后端
IT书架1 小时前
golang面试题
开发语言·后端·golang
机器之心2 小时前
全球十亿级轨迹点驱动,首个轨迹基础大模型来了
人工智能·后端
潜洋3 小时前
Spring Boot教程之五:在 IntelliJ IDEA 中运行第一个 Spring Boot 应用程序
java·spring boot·后端
St_Ludwig4 小时前
C语言 蓝桥杯某例题解决方案(查找完数)
c语言·c++·后端·算法·游戏·蓝桥杯
vener_4 小时前
LuckySheet协同编辑后端示例(Django+Channel,Websocket通信)
javascript·后端·python·websocket·django·luckysheet
计算机毕设孵化场4 小时前
计算机毕设-基于springboot的多彩吉安红色旅游网站的设计与实现(附源码+lw+ppt+开题报告)
vue.js·spring boot·后端·计算机外设·课程设计·计算机毕设论文·多彩吉安红色旅游网站
爪哇学长4 小时前
解锁API的无限潜力:RESTful、SOAP、GraphQL和Webhooks的应用前景
java·开发语言·后端·restful·graphql
战神刘玉栋5 小时前
《SpringBoot、Vue 组装exe与套壳保姆级教学》
vue.js·spring boot·后端
码到成功>_<6 小时前
Spring Boot实现License生成和校验
数据库·spring boot·后端