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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 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
目录
相关文章
|
15天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
36 0
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
2月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
38 0
|
2月前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
25天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
2月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
146 1
|
3月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
227 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
3月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
239 1
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
47 0
|
2月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
82 0