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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
Java Spring
Spring boot 运行服务jar外配置配置文件方式总结
Spring boot 运行服务jar外配置配置文件方式总结
390 0
|
2月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
4天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
49 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
6天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
17天前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
53 5
|
21天前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
1月前
|
运维 Java Nacos
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
Spring Cloud应用框架:Nacos作为服务注册中心和配置中心
|
18天前
|
Java Spring 开发者
解锁 Spring Boot 自动化配置的黑科技:带你走进一键配置的高效开发新时代,再也不怕繁琐设置!
【8月更文挑战第31天】Spring Boot 的自动化配置机制极大简化了开发流程,使开发者能专注业务逻辑。通过 `@SpringBootApplication` 注解组合,特别是 `@EnableAutoConfiguration`,Spring Boot 可自动激活所需配置。例如,添加 JPA 依赖后,只需在 `application.properties` 配置数据库信息,即可自动完成 JPA 和数据源设置。这一机制基于多种条件注解(如 `@ConditionalOnClass`)实现智能配置。深入理解该机制有助于提升开发效率并更好地解决问题。
32 0
|
18天前
|
API 开发者 Java
API 版本控制不再难!Spring 框架带你玩转多样化的版本管理策略,轻松应对升级挑战!
【8月更文挑战第31天】在开发RESTful服务时,为解决向后兼容性问题,常需进行API版本控制。本文以Spring框架为例,探讨四种版本控制策略:URL版本控制、请求头版本控制、查询参数版本控制及媒体类型版本控制,并提供示例代码。此外,还介绍了通过自定义注解与过滤器实现更灵活的版本控制方案,帮助开发者根据项目需求选择最适合的方法,确保API演化的管理和客户端使用的稳定与兼容。
54 0
|
18天前
|
Java Spring 开发者
Spring 框架配置属性绑定大比拼:@Value 与 @ConfigurationProperties,谁才是真正的王者?
【8月更文挑战第31天】Spring 框架提供 `@Value` 和 `@ConfigurationProperties` 两种配置属性绑定方式。`@Value` 简单直接,适用于简单场景,但处理复杂配置时略显不足。`@ConfigurationProperties` 则以类级别绑定配置,简化代码并更好组织配置信息。本文通过示例对比两者特点,帮助开发者根据具体需求选择合适的绑定方式,实现高效且易维护的配置管理。
29 0