ShardingSphere 5.3.X系列【1】:Spring配置升级指南

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: ShardingSphere 5.3.X系列【1】:Spring配置升级指南

一、背景

5.3.0 版本以前,ShardingSphere-JDBC 同时支持 Java API、YAML、Spring Boot Starter Spring Namespace 等配置方式。其中,为兼容 Spring 的配置方式,给社区带来了以下难题:

● 当新增或更新 API 时,需要调整多项配置文件,工作量大

社区需要维护多重配置文档和示例

Spring Bean 生命周期管理容易受到项目其他依赖的影响,比如 PostProcessor 无法正常执行

Spring Boot StarterSpring Namespace 配置风格与 ShardingSphere 标准的 YAML 有较大差别

Spring Boot Starter Spring NamespaceSpring 版本影响,会带来额外的配置兼容性问题

基于以上考虑,ShardingSphere 社区决定在 ShardingSphere 5.3.0 Release 中移除 Spring 全部依赖和配置支持。

那么,对需要使用 Spring BootSpring Namespace ShardingSphere-JDBC 用户,应当如何接入 ShardingSphere 原有的用户怎样升级呢?本文将解为您答这些疑问。


二、影响范围

2.1 Maven依赖

升级到 ShardingSphere 5.3.0 或更高的版本,以Spring Boot项目举例原有相关的依赖将会失效:

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>${shardingsphere.version}</version></dependency>

调整为:

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core</artifactId><version>${shardingsphere.version}</version></dependency>

2.2 自定义算法

移除 Spring 模块会同时移除 AlgorithmProvided 相关类。若此前用户在自定义算法中有使用到 Bean 注入相关的逻辑,更新后将失效。对需要在算法中使用 Spring Bean 的场景,需开发者主动管理。

2.3 事务

用于支持方法级别事务声明的 @ShardingSphereTransactionType 注解将被同时移除。若用户有在方法级别更改事务类型的需求,请使用 Java API方式。

针对分布式事务稍后单独梳理一篇详细的配置升级文档

2.4 配置文件

在升级 5.3.0 版本后,原有的 Spring Boot Starter Spring Namespace 数据源配置将会失效。


三、升级指南

3.1 ShardingSphereDriver介绍

5.1.2 版本开始, ShardingSphere-JDBC 提供了原生 JDBC 驱动 ShardingSphereDriver,无需修改代码,仅通过配置即可接入使用。通过这种接入方式,可以更加统一 ShardingSphere-JDBC ShardingSphere-Proxy 的配置文件格式,只需少量修改即可复用。

在升级到 5.3.x 版本后,使用 Spring Boot Starter Spring Namespace 的用户,推荐通过 ShardingSphereDriver 方式来接入 ShardingSphere-JDBC

3.2 使用 Spring Boot Starter升级指导

以我的上篇文章进行举例说明:

Spring Boot集成ShardingSphere分片利器 AutoTable (二)—— 自动分片算法示例 | Spring Cloud

请自行参考 2.1 章节更换Maven依赖

3.2.1 配置文件升级

3.2.1.1 升级前

application.yml:

server:  port: 8844spring:  application:    name: @artifactId@
  shardingsphere:# 数据源配置    datasource:      names: ds1,ds2
      ds1:        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.0.35:3306/db1?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
        username: root
        password: '1qaz@WSX'      ds2:        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://192.168.0.46:3306/db2?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
        username: root
        password: '1qaz@WSX'# 定义规则    rules:      sharding:# 采用自动分片算法        autoTables:# 取模          t_auto_order_mod:            actualDataSources: ds$->{1..2}            sharding-strategy:              standard:                sharding-column: order_id
                sharding-algorithm-name: auto_order_mod
# 分布式序列策略            key-generate-strategy:# 自增列名称,缺省表示不使用自增主键生成器              column: order_id
# 分布式序列算法名称              key-generator-name: snowflake
# 散列取模          t_auto_order_hash_mod:            actualDataSources: ds1
            sharding-strategy:              standard:                sharding-column: order_id
                sharding-algorithm-name: auto_order_hash_mod
# 分布式序列策略            key-generate-strategy:# 自增列名称,缺省表示不使用自增主键生成器              column: order_id
# 分布式序列算法名称              key-generator-name: snowflake
# 容量范围          t_auto_order_volume_range:            actualDataSources: ds$->{1..2}            sharding-strategy:              standard:                sharding-column: price
                sharding-algorithm-name: auto_order_volume_range
# 分布式序列策略            key-generate-strategy:# 自增列名称,缺省表示不使用自增主键生成器              column: order_id
# 分布式序列算法名称              key-generator-name: snowflake
# 边界范围          t_auto_order_boundary_range:            actualDataSources: ds$->{1..2}            sharding-strategy:              standard:                sharding-column: price
                sharding-algorithm-name: auto_order_boundary_range
# 分布式序列策略            key-generate-strategy:# 自增列名称,缺省表示不使用自增主键生成器              column: order_id
# 分布式序列算法名称              key-generator-name: snowflake
# 自动日期间隔          t_auto_order_auto_interval:            actualDataSources: ds$->{1..2}            sharding-strategy:              standard:                sharding-column: create_time
                sharding-algorithm-name: auto_order_auto_interval
# 分布式序列策略            key-generate-strategy:# 自增列名称,缺省表示不使用自增主键生成器              column: order_id
# 分布式序列算法名称              key-generator-name: snowflake
# 分片算法配置        sharding-algorithms:# 取模          auto_order_mod:            type: MOD
            props:              sharding-count: 6# 散列取模          auto_order_hash_mod:            type: HASH_MOD
            props:              sharding-count: 6# 容量范围          auto_order_volume_range:            type: VOLUME_RANGE
            props:              range-lower: 0              range-upper: 20000              sharding-volume: 10000# 边界范围          auto_order_boundary_range:            type: BOUNDARY_RANGE
            props:              sharding-ranges: 10,15,100,12000,16000# 自动日期间隔          auto_order_auto_interval:            type: AUTO_INTERVAL
            props:              datetime-lower: 2023-05-07 00:00:00              datetime-upper: 2023-05-10 00:00:00              sharding-seconds: 86400# 分布式序列算法配置(如果是自动生成的,在插入数据的sql中就不要传id,null也不行,直接插入字段中就不要有主键的字段)        keyGenerators:# 分布式序列算法名称          snowflake:# 分布式序列算法类型            type: SNOWFLAKE
    props:      sql-show: true #显示sqlmybatis:  configuration:    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3.2.1.2 升级后

application.yml:将原有的 ShardingSphere 相关配置替换为 ShardingSphereDriver 配置项:

server:  port: 8844spring:  application:    name: @artifactId@
  datasource:    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:shading-auto-tables-algorithm.yaml
mybatis:  configuration:    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

resources 目录下新建 yaml 配置文件,如: shading-auto-tables-algorithm.yaml,并按照 用户手册-YAML配置 改写原有配置内容:

dataSources:  ds1:    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://192.168.0.35:3306/db1?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
    username: root
    password: '1qaz@WSX'    connectionTimeoutMilliseconds: 30000    idleTimeoutMilliseconds: 60000    maxLifetimeMilliseconds: 1800000    maxPoolSize: 50    minPoolSize: 1  ds2:    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    jdbcUrl: jdbc:mysql://192.168.0.46:3306/db2?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&allowMultiQueries=true&serverTimezone=Asia/Shanghai
    username: root
    password: '1qaz@WSX'    connectionTimeoutMilliseconds: 30000    idleTimeoutMilliseconds: 60000    maxLifetimeMilliseconds: 1800000    maxPoolSize: 50    minPoolSize: 1rules:  - !SHARDING
    autoTables:# 取模      t_auto_order_mod:        actualDataSources: ds$->{1..2}        shardingStrategy:          standard:            shardingColumn: order_id
            shardingAlgorithmName: auto_order_mod
# 分布式序列策略        keyGenerateStrategy:# 自增列名称,缺省表示不使用自增主键生成器          column: order_id
# 分布式序列算法名称          keyGeneratorName: snowflake
# 散列取模      t_auto_order_hash_mod:        actualDataSources: ds1
        shardingStrategy:          standard:            shardingColumn: order_id
            shardingAlgorithmName: auto_order_hash_mod
# 分布式序列策略        keyGenerateStrategy:# 自增列名称,缺省表示不使用自增主键生成器          column: order_id
# 分布式序列算法名称          keyGeneratorName: snowflake
# 容量范围      t_auto_order_volume_range:        actualDataSources: ds$->{1..2}        shardingStrategy:          standard:            shardingColumn: price
            shardingAlgorithmName: auto_order_volume_range
# 分布式序列策略        keyGenerateStrategy:# 自增列名称,缺省表示不使用自增主键生成器          column: order_id
# 分布式序列算法名称          keyGeneratorName: snowflake
# 边界范围      t_auto_order_boundary_range:        actualDataSources: ds$->{1..2}        shardingStrategy:          standard:            shardingColumn: price
            shardingAlgorithmName: auto_order_boundary_range
# 分布式序列策略        keyGenerateStrategy:# 自增列名称,缺省表示不使用自增主键生成器          column: order_id
# 分布式序列算法名称          keyGeneratorName: snowflake
# 自动日期间隔      t_auto_order_auto_interval:        actualDataSources: ds$->{1..2}        shardingStrategy:          standard:            shardingColumn: create_time
            shardingAlgorithmName: auto_order_auto_interval
# 分布式序列策略        keyGenerateStrategy:# 自增列名称,缺省表示不使用自增主键生成器          column: order_id
# 分布式序列算法名称          keyGeneratorName: snowflake
# 分片算法配置    shardingAlgorithms:# 取模      auto_order_mod:        type: MOD
        props:          sharding-count: 6# 散列取模      auto_order_hash_mod:        type: HASH_MOD
        props:          sharding-count: 6# 容量范围      auto_order_volume_range:        type: VOLUME_RANGE
        props:          range-lower: 0          range-upper: 20000          sharding-volume: 10000# 边界范围      auto_order_boundary_range:        type: BOUNDARY_RANGE
        props:          sharding-ranges: 10,15,100,12000,16000# 自动日期间隔      auto_order_auto_interval:        type: AUTO_INTERVAL
        props:          datetime-lower: "2023-05-07 00:00:00"          datetime-upper: "2023-05-10 00:00:00"          sharding-seconds: 86400# 分布式序列算法配置(如果是自动生成的,在插入数据的sql中就不要传id,null也不行,直接插入字段中就不要有主键的字段)    keyGenerators:# 分布式序列算法名称      snowflake:# 分布式序列算法类型        type: SNOWFLAKE
props:  sql-show: true

四、结语

此次升级,大大减少了 ShardingSphere-JDBCShardingSphere-Proxy 在配置方面的差异,为 ShardingSphere-JDBC 用户顺利过渡到 ShardingSphere 集群架构打好了基础,在 API 标准化、提升配置兼容性方面迈出了坚实的一步。

对于 ShardingSphere 新用户而言,ShardingSphereDriver 的配置方式也能减少配置侵入性,上手更简单。



本文转载自:https://blog.csdn.net/ctwy291314/article/details/130600123

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
136 73
|
2月前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
68 0
|
3月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
63 4
|
3月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
58 0
|
9天前
|
Java Spring
【Spring配置相关】启动类为Current File,如何更改
问题场景:当我们切换类的界面的时候,重新启动的按钮是灰色的,不能使用,并且只有一个Current File 项目,下面介绍两种方法来解决这个问题。
|
9天前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
9天前
|
Java Spring
【Spring配置】创建yml文件和properties或yml文件没有绿叶
本文主要针对,一个项目中怎么创建yml和properties两种不同文件,进行配置,和启动类没有绿叶标识进行解决。
|
17天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
67 14
|
14天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
52 6
|
3月前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。