0. sharding-jdbc源码之分析准备工作

阿飞Javaer,转载请注明原创出处,谢谢!

为什么阅读sharding-jdbc源码

回答这个问题之前,先回答为什么要阅读某个分库分表中间件的源码,互联网行业海量的数据,导致单库单表远不能承受业务需求,很多互联网产品的单日订单量就已经突破了1000w。海量数据既然单表无法承受,那么就必须要分库分表;目前主流数据库主要基于Proxy和client两种架构:proxy以阿里的corba为代表,client以当当的sharding-jdbc为代表(或者阿里内部的TDDL)。但是不管哪种架构,其最核心的数据处理,都是一样的,即:解析,重写,路由,执行,结果归并;

而之所以选择sharding-jdbc,是因为他的代码足够精炼;其核心源码只有不到3w行(不包括测试用例和配置文件)。而且sharding-jdbc在很多地方有非常独到的优化处理。另外一个私人原因,sharding-jdbc的作者张亮大神比较接地气,有什么疑问可以直接@他请教,哈,另外笔者也认识两个sharding-jdbc的committer同学^^;

可能部分同学会想到分区,然而分区在互联网行业使用的比较少,尤其是核心业务,例如订单表,用户表;因为分区表的能力上限还是单库单表,严重受到连接,IO,网络等制约而无法扩展;而分库分表则不一样;可以将数据保存到N个数据库的N张表中;即使部分数据库宕机且短时间无法修复,也只是影响一部分用户的体验,这是最坏的情况;分区表也不是一无是处,如果QPS要求不高,例如日志表,就很适合用分区表来处理;

sharding-jdbc源码分析准备工作

接下来对sharding-jdbc源码的分析基于tag为1.5.4.1源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性是如何实现的;

概况

sharding-jdbc源码主要有以下几个模块:sharding-jdbc-config-parentsharding-jdbc-coresharding-jdbc-docsharding-jdbc-examplesharding-jdbc-pluginsharding-jdbc-transaction-parent;由模块命名很容易知道模块的作用:
* sharding-jdbc-config-parent:配置相关源码;
* sharding-jdbc-core:核心源码;
* sharding-jdbc-doc:文档,都是markdown格式,对应github上的sharding-jdbc-doc
* sharding-jdbc-example:针对各个模块的测试用例代码;
* sharding-jdbc-plugin:目前只有KeyGenerator的三种实现;
* sharding-jdbc-transaction-parent:事务相关源码;
sharding-jdbc源码结构示意图

依赖的技术栈


  1. lombok(能够简化java的代码,不需要显示编写setter,getter,constructor等代码,其原理是作用于javac阶段。通过反编译class文件能够看到还是有通过lombok省略的setter,getter,constructor等代码)
  2. google-guava(google开源的google使用的Java核心类)
  3. elastic-job(sharding-jdbc-transaction-async-job模块依赖elastic-job实现分布式定时任务)
  4. inline表达式(sharding-jdbc分库分表规则表达式采用inline语法,可以参考InlineParserTest.java这个测试类中一些inline表达式)

在阅读sharding-jdbc源码之前,建议对这些技术有一定的了解;

sharding-jdbc架构图

sharding-jdbc架构图

说明:图片来源于sharding-jdbc官网

sharding-jdbc-doc

请单击sharding-jdbc-doc,阅读sharding-jdbc源码之前,建议看一下sharding-jdbc官方文档,对其原理和一些概念,以及初级使用有一个大概的了解;

sharding-jdbc实现剖析

接下来的源码分析文章大概分析(但不局限于)sharding-jdbc的这些核心功能;
1. 分片规则配置说明
2. SQL解析
3. SQL路由
4. SQL改写
5. SQL执行
6. 结果归并

Debug sharding-jdbc

学习开源组件的最好的办法就是了解它的原理后,下载它的源码,然后Run起来;sharding-jdbc的测试用例写的非常详细,sharding-jdbc-example-jdbc模块中的com.dangdang.ddframe.rdb.sharding.example.jdbc.Main就是一个很好的debug入口,想要正常运行这个测试用例,只需简单的如下几个步骤即可:
1. 在本地安装一个mysql数据库;
2. 创建两个数据库:ds_jdbc_0和ds_jdbc_1;
3. just run it;

说明:sharding-jdbc源码默认使用的访问数据库的用户为root,密码为空字符串;

猜你喜欢

转载自blog.csdn.net/feelwing1314/article/details/80191715