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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
2月前
|
消息中间件 NoSQL Java
spring boot2升级boot3指南
本文介绍了如何将Spring Boot 2.x升级至Spring Boot 3.x,涵盖使用OpenRewrite自动化重构工具进行代码转换、依赖版本升级、配置属性调整及常见问题处理等内容,帮助开发者高效完成升级工作。
1182 6
|
2月前
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
2月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
4月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
931 0
|
1月前
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
7月前
|
人工智能 Java API
MCP协议重大升级,Spring AI Alibaba联合Higress发布业界首个Streamable HTTP实现方案
本文由Spring AI Alibaba Contributor刘军、张宇撰写,探讨MCP官方引入的全新Streamable HTTP传输层对原有HTTP+SSE机制的重大改进。文章解析Streamable HTTP的设计思想与技术细节,并介绍Spring AI Alibaba开源框架提供的Java实现,包含无状态服务器模式、流式进度反馈模式等多种场景的应用示例。同时,文章还展示了Spring AI Alibaba + Higress的完整可运行示例,分析当前实现限制及未来优化方向,为开发者提供参考。
|
2月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
520 5
|
2月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
170 0
探索Spring Boot的@Conditional注解的上下文配置
|
7月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
888 2