前言
鉴于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