分库分表ShardingSphere-jdbc 5.5.2 + spring boot 配置

Apache ShardingSphere 是一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。

Apache ShardingSphere 设计哲学为 Database Plus,旨在构建异构数据库上层的标准和生态。 它关注如何充分合理地利用数据库的计算和存储能力,而并非实现一个全新的数据库。 它站在数据库的上层视角,关注它们之间的协作多于数据库自身。

ShardingSphere-JDBC 定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。

环境准备

版本

软件 版本
spring boot 3.4.5
shardingsphere-jdbc 5.5.2
druid 1.2.24
postgreSQL 17
JDK 21

功能

已实现配置功能:

  1. 单机模式服务;
  2. 数据源(druid加解密数据库密码);
  3. 规则配置:
    数据分片:多个分库分表键策略
    读写分离
    数据加密:SM4自定义算法
    单表
    算法:自定义雪花算法动态worker.id
    其他

待新增补充功能:
混合规则等。

数据库说明

本示例数据库为PostgreSQL,以一主二从作为集群架构演示,转为数据库架构时,可自定义修改配置。

集群

一主二从:
逻辑主库:ds_basic、ds0000、ds0001(ds_basic为数据简单、量少的元数据库)
逻辑从库:ds0000_slave1、ds0001_slave1、ds0000_slave2、ds0001_slave2
在这里插入图片描述

Maven依赖

         <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>shardingsphere-jdbc</artifactId>
            <version>5.5.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.shardingsphere</groupId>
                    <artifactId>shardingsphere-test-util</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.yaml</groupId>
            <artifactId>snakeyaml</artifactId>
            <version>2.2</version>
        </dependency>

配置

配置文件

在这里插入图片描述

spring boot配置

application.yml

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

shardingsphere-jdbc配置

完整的基础配置

sharding.yaml


mode:
  type: Standalone
  repository:
    type: JDBC
databaseName: aya_db
dataSources:
  ds_aya_basic:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_basic
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictableIdleTimeMillis: 600000
    timeBetweenEvictionRunsMillis: 300000
    testOnBorrow: true
    testWhileIdle: true
    filters: config, stat, wall
    connectProperties:
      connectTimeout: 5000
      socketTimeout: '20000'
      config.decrypt: 'true'
      config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==

  ds_aya_0000:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_0000
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictableIdleTimeMillis: 600000
    timeBetweenEvictionRunsMillis: 300000
    testOnBorrow: true
    testWhileIdle: true
    filters: config, stat, wall
    connectProperties:
      connectTimeout: 5000
      socketTimeout: '20000'
      config.decrypt: 'true'
      config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==

  ds_aya_0001:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_0001
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictableIdleTimeMillis: 600000
    timeBetweenEvictionRunsMillis: 300000
    testOnBorrow: true
    testWhileIdle: true
    filters: config, stat, wall
    connectProperties:
      connectTimeout: 5000
      socketTimeout: '20000'
      config.decrypt: 'true'
      config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==

  ds_aya_0000_slave1:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_0000_slave1
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictableIdleTimeMillis: 600000
    timeBetweenEvictionRunsMillis: 300000
    testOnBorrow: true
    testWhileIdle: true
    filters: config, stat, wall
    connectProperties:
      connectTimeout: 5000
      socketTimeout: '20000'
      config.decrypt: 'true'
      config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==

  ds_aya_0001_slave1:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_0001_slave1
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictableIdleTimeMillis: 600000
    timeBetweenEvictionRunsMillis: 300000
    testOnBorrow: true
    testWhileIdle: true
    filters: config, stat, wall
    connectProperties:
      connectTimeout: 5000
      socketTimeout: '20000'
      config.decrypt: 'true'
      config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==

  ds_aya_0000_slave2:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_0000_slave2
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictableIdleTimeMillis: 600000
    timeBetweenEvictionRunsMillis: 300000
    testOnBorrow: true
    testWhileIdle: true
    filters: config, stat, wall
    connectProperties:
      connectTimeout: 5000
      socketTimeout: '20000'
      config.decrypt: 'true'
      config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ05kvOTSV2shvQ/nK632kXMe10o1fNcu+cA6TAYEh2bxhjnJ4DAoqooSpPhgjCGtzjpGhglrcMryq/olbDOOXMCAwEAAQ==

  ds_aya_0001_slave2:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: org.postgresql.Driver
    url: jdbc:postgresql://127.0.0.1:5433/aya_0001_slave2
    username: postgres
    password: iDtU7OG+pSIRUKZR4oHIqg4ApomOt8NhPafBHJ9i9WZMKnsoLR3oj19M8CvRnNVzZGqy4S8iVFQQ/xDyaBeK6w==
    initialSize: 1
    minIdle: 1
    maxActive: 64
    maxWait: 20000
    validationQuery: SELECT 1
    validationQueryTimeout: 30000
    minEvictableIdleTimeMillis: 300000
    maxEvictable
### 集成和配置 ShardingSphere-JDBC 5.5.2Spring Boot #### Maven 依赖配置 为了在 Spring Boot 中集成 ShardingSphere-JDBC,首先需要引入相应的 Maven 依赖。这可以通过修改 `pom.xml` 文件来完成。 ```xml <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId> <version>5.5.2</version> </dependency> ``` 此依赖项会自动加载并初始化 ShardingSphere 所需的核心组件[^1]。 #### 数据源配置 接着,在 `application.yml` 或者 `application.properties` 文件中定义数据源的相关属性: ```yaml spring: shardingsphere: datasource: names: ds_0,ds_1 ds_0: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_0?serverTimezone=UTC&useSSL=false username: root password: root ds_1: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://localhost:3306/db_1?serverTimezone=UTC&useSSL=false username: root password: root ``` 上述配置指定了两个不同的 MySQL 数据库实例作为分布式系统的组成部分。 #### 分片规则设置 通过 YAML 文件继续扩展配置以支持分片逻辑: ```yaml rules: sharding: tables: t_order: actual-data-nodes: ds_${0..1}.t_order${0..1} table-strategy: standard: sharding-column: order_id precise-algorithm-class-name: com.example.demo.algorithm.ModuloShardingTableAlgorithm key-generate-strategy: column: order_id key-generator-class-name: org.apache.shardingsphere.core.keygen.DefaultKeyGenerator ``` 这段代码片段展示了如何指定实际的数据节点以及用于路由到特定表的策略类。 #### 加密功能实现 对于敏感字段加密的需求,可以采用如下方式声明加密器及其应用范围: ```yaml props: sql-show: true encryptor: name: sm4Encryptor type: SM4 props: cipher-key: your_cipher_key_here tables: t_user: columns: pwd: logic-column: pwd cipher-column: pwd_cipher encryptor-ref: sm4Encryptor ``` 这里设置了密码列 (`pwd`) 使用国密标准中的 SM4 对称加密算法进行保护。 #### 测试验证 最后一步是编写单元测试案例来检验整个架构的有效性和正确性。确保所有业务流程都能正常运作,并且查询结果符合预期。 ```java @SpringBootTest public class OrderServiceTest { @Test void testQueryOrders() { List<OrderDTO> orders = orderService.queryAll(); assertNotNull(orders); } // More tests... } ``` 以上就是关于如何在 Spring Boot 应用程序内集成交互式部署 Apache ShardingSphere JDBC 组件的方法概述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值