下载源码(选择自己喜欢的版本即可)
https://github.com/apache/incubator-shardingsphere/archive/4.0.0-RC2.zip
2、导入工程到IDEA
3、sharding-core-parse编译
注意先编译此工程是因为:工程内的部分类需要依靠antlr4 SQL解析引擎生成,否则直 接编译sharding工程讲报部分类找不到的错误。
编译本工程注意用的是:lifecycle下的install
4、编译全工程
注意是用maven-plugin编译,且编译要记得跳过测试部分
译时:sharding-sql-test工程会报错,直接忽略即可。
编译完成:运行demo可正常执行则说明编译成功
Apache孵化版-模块划分
内核剖析
数据分片-执行过程
解析引擎
解析过程分为词法解析和语法解析。 词法解析器用于将SQL拆解为不可再分的原子符 号,称为Token。并根据不同数据库方言所提供的字典,将其归类为关键字,表达式,字面 量和操作符。 再使用语法解析器将SQL转换为抽象语法树。
SELECT id, name FROM t_user WHERE status = 'ACTIVE' AND age > 18
sql解析整体结构:
路由引擎
内置的分片策略大致可分为尾数取模、哈希、范围、标签、时间等。 由用户方配置的 分片策略则更加灵活,可以根据使用方需求定制复合分片策略。
SQL改写
为路由之后所获取的真
执行引擎
结果归并
将从各个数据节点获取的多数据结果集,组合成为一个结果集并正确的返回至请求客户 端,称为结果归并。
分布式主键
内置生成器支持:UUID、SNOWFLAKE,并抽离出分布式主键生成器 的接口,方便用户自行实现自定义的自增主键生成器。
SNOWFLAKE 雪花算法
能够保证不同进程主键的不重复性,相同进程主键的有序性。二进制形式包 含4部分,从高位到低位分表为:1bit符号位、41bit时间戳位、10bit工作进程位以及12bit 序列号位。
- 符号位(1bit)
预留的符号位,恒为零。
- 时间戳位(41bit)
41位的时间戳可以容纳的毫秒数是2的41次幂,一年所使用的毫秒数是:365 * 24 * 60 * 6 0 * 1000 Math.pow(2, 41) / (365 * 24 * 60 * 60 * 1000L) = 69.73年不重复;
- 工作进程位(10bit)
该标志在Java进程内是唯一的,如果是分布式应用部署应保证每个工作进程的id是不同 的。该值默认为0,可通过属性设置。
- 序列号位(12bit)
该序列是用来在同一个毫秒内生成不同的ID。如果在这个毫秒内生成的数量超过 4096(2的12次幂),那么生成器会等待到下个毫秒继续生成。
Mybatis-SQL执行过程
分库分表源码结构如下