sharding-jdbc源码解析之spring集成配置解析三

说在前面

第三部分主要解析的是分片规则构造的源码实现,这一部分逻辑实现比较多,所以单独拿出来最为一次解析。

上次我们跟踪spring集成配置源码是从这里找到handler

sharding-jdbc源码解析之spring集成配置解析三_第1张图片

找到了这个类com.dangdang.ddframe.rdb.sharding.spring.namespace.handler.ShardingJdbcNamespaceHandler

解析data-source xml节点

sharding-jdbc源码解析之spring集成配置解析三_第2张图片

我们跟进去找到这个方法

com.dangdang.ddframe.rdb.sharding.spring.namespace.parser.ShardingJdbcDataSourceBeanDefinitionParser#parseInternal

sharding-jdbc源码解析之spring集成配置解析三_第3张图片

这一行SpringShardingDataSource这个类初始化的时候做了些什么呢,上次没有说,因为这块实现还是比较巧妙、复杂,所以这次我们单独看下。

构建分片规则

我们进入到SpringShardingDataSource这个类,可以看到在构造器中调用了构建分片规则的实现,我们进一步跟踪下是怎么构建分片规则的。

sharding-jdbc源码解析之spring集成配置解析三_第4张图片

进入到build方法实现,我们先整体看下实现

sharding-jdbc源码解析之spring集成配置解析三_第5张图片

DataSourceRule dataSourceRule = buildDataSourceRule();返回一个数据源配置对象,存储了分片的数据库对象集合和默认的数据库对象名称

sharding-jdbc源码解析之spring集成配置解析三_第6张图片

buildDataSourceRule方法实现

返回上一个方法,Collection tableRules = buildTableRules(dataSourceRule);构建表规则配置,我们先整体看下这个方法的实现

sharding-jdbc源码解析之spring集成配置解析三_第7张图片

Collection result = new ArrayList<>(shardingRuleConfig.getTables().size());获取表规则配置集合

分片规则配置对象

sharding-jdbc源码解析之spring集成配置解析三_第8张图片

表规则配置构造器对象

sharding-jdbc源码解析之spring集成配置解析三_第9张图片

表规则配置对象

sharding-jdbc源码解析之spring集成配置解析三_第10张图片

.databaseShardingStrategy(buildShardingStrategy(tableRuleConfig.getDatabaseStrategy(), DatabaseShardingStrategy.class))这行代码是构造数据库分片策略并加入到表规则构造器对象。

进入这个方法com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildShardingStrategy

sharding-jdbc源码解析之spring集成配置解析三_第11张图片

com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildShardingAlgorithmExpression 这个方法实现,如果这里没有指定分片策略类,就走inline表达式解析的逻辑

com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildShardingAlgorithmClassName指定了分片策略实现类就走这个逻辑,整体看下这个方法实现。

sharding-jdbc源码解析之spring集成配置解析三_第12张图片

回到这个方法com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildTableRules的这行代码

.tableShardingStrategy(buildShardingStrategy(tableRuleConfig.getTableStrategy(), TableShardingStrategy.class));构造表分片策略并加入到表规则构造器对象,和构造数据分片实现一样。

buildGenerateKeyColumn(tableRuleBuilder, tableRuleConfig);分布式id解析

分片规则配置对象构造器

sharding-jdbc源码解析之spring集成配置解析三_第13张图片

分库分表配置对象

sharding-jdbc源码解析之spring集成配置解析三_第14张图片

返回到com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#build方法

最后是装载分片构造器的一些参数

sharding-jdbc源码解析之spring集成配置解析三_第15张图片

整个sharding-jdbc与spring集成配置源码解析就完了。

sharding-jdbc配置数据模型总结

com.dangdang.ddframe.rdb.sharding.parsing.lexer.Lexer 此法解析器,不同的数据库有不同的子类

com.dangdang.ddframe.rdb.sharding.config.common.api.config.StrategyConfig 分片策略配置

com.dangdang.ddframe.rdb.sharding.config.common.api.config.ShardingRuleConfig 分片规则配置

com.dangdang.ddframe.rdb.sharding.config.common.api.config.TableRuleConfig 表规则配置

com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule 数据源配置

com.dangdang.ddframe.rdb.sharding.api.rule.TableRule 表规则配置

com.dangdang.ddframe.rdb.sharding.api.rule.DataNode 分库分表数据单元,动态分配有子类实现

com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule.ShardingRuleBuilder 分片规则配置对象构造器

com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule 分库分表规则配置

数据模型对领域模型驱动设计很重要,比如我们新搭建一个项目的时候当然也是先设计表,用过grails框架的都知道,我们也是先编写数据模型然后一条命令就生成了一个web实现的骨架,都是基于面向对象思想延伸而来,因此学习一个框架先了解数据模型设计很重要。

现在是不是对分片的架构设计、实现、数据模型清晰了一些呢,程序中再遇到这块的问题应该能秒级定位了吧,

说到最后


源码看到这里,本人感慨良多,作者大量用到了java特性,如多态(重载、重写、上转型)、框架级的封装、炉火纯青的继承使用、 还有链式调用、guava、lombok一系列优美的设计,使架构看起来更简洁扩展性更好,能看出作者深通架构优美设计之道,我之前看过一本书,好的架构、代码就像诗一样,让人流连忘发,更像美人一样让人忍禁不禁,由此也可见作者雄厚的架构功力,另我等望尘莫及,瞬间脑海中闪现出一句话“路漫漫其修远兮,吾将上下而求索”。

sharding-jdbc源码解析之spring集成配置解析三_第16张图片

后面还有各种经典的设计源码解析,如经典设计模式怎么运用的等内容跟大家分享,请关注“天河聊技术”微信公众号,后面更精彩。以上内容仅供参考,有不对的地方欢迎指正。



关注微信公众号

sharding-jdbc源码解析之spring集成配置解析三_第17张图片

加入技术微信群

sharding-jdbc源码解析之spring集成配置解析三_第18张图片

你可能感兴趣的:(sharding-jdbc源码解析之spring集成配置解析三)