SpringBoot2.x整合ShardingSphere5.0.0-alpha(仓库只有这个版本)

2,562 阅读2分钟

前言

       鉴于ShardingSphere官网的SpringBoot示例是基于1.x的,本人也在学习和研究这个框架,在踩了不少坑后,决定写个示例供后来人参考(减少踩坑,尽快上手)。

ShardingSphere官网ShardingSphere官方示例Mybatis-plus代码生成器官方示例示例项目源码Github

项目框架

1、SpringBoot 2.4.1+Mybatis-plus 3.4.1 + ShardingSphere 5.0.0-alpha。
2、项目的目标:按照时间分表(1个小时60分钟,即:分60张表,玩点大的),Snowflake算法生成主键,根据主键反解析出时间戳来进行分表路由。

3、用Gradle管理依赖(吐槽:这掘金的代码块怎么排版?)。

项目源码说明

1、项目的基本框架,示例的实体是TOrder(看这个实体就行了,其他是用于其他测试的)(推荐用Mybatis-plus的代码生成器生成,项目挺简单的)。

2、自定义分表路由规则,主要是实现分表算法接口,根据我的业务,这里实现StandardShardingAlgorithm接口就行了。

3、SpringBoot配置文件配置DB、指定路由规则等,这个也是在官网的示例上通过自己看源码一个个摸索过来的,这里的下面会说下。

测试用例(记得打开sql日志,即:application.yml -> sql-show:true)

1、创建分表(记得先建好数据库,我的连接库是:demo_ds)。

2、插入数据(说明:路由规则是路由键(这里是t_order表的主键order_id)按照分钟进行路由,比如Snowflake生成的主键反解析出的时间戳的部分时间是9:39,那么会路由到表t_order_39)。

3、按照主键查询。

4、Mybatis-plus代码生成器测试类(官网的示例改造的,够用),建议:复制其中的一张分表改成t_order表(不带分表序号),指定该表生成实体(逻辑实体是不需要真实表的,ShardingSphere都已经帮我们处理好了)等。

示例项目源码-Github

踩坑说明

1、SpringBoot 2.x配置之所以需要common节点,是解析处理逻辑如此。

1.1、ShardingSphere配置类org.apache.shardingsphere.spring.boot.SpringBootConfiguration

1.2、 解析配置文件类org.apache.shardingsphere.spring.boot.datasource.DataSourceMapSetter

1.3、SpringBoot 1.x和2.x解析不同

org.apache.shardingsphere.spring.boot.util.PropertyUtil

1.3.1、 分别解析SpringBoot 1.x和2.x配置文件

1.3.2、 官网示例SpringBoot 1.x 解析出的结果是空Map,没有问题

1.3.3、 本人示例SpringBoot 2.x 解析出错(备注:注释配置文件的common节点)

疑问(有知道的小伙伴给我讲解下):

1、为什么SpringBoot 1.x和2.x要分别解析?

2、SpringBoot 2.x的解析逻辑是?

这个在Github上也有issue,issue链接

2、 配置文件的自定义属性的props不能为null原因。

原因和common节点是一样的,因为都是调用org.apache.shardingsphere.spring.boot.util.PropertyUtil的handle函数处理的。

注册自定义算法失败。

org.apache.shardingsphere.spring.boot.registry.AbstractAlgorithmProvidedBeanRegistry