sharding-jdbc源码解析之spring集成配置解析三
说在前面
第三部分主要解析的是分片规则构造的源码实现,这一部分逻辑实现比较多,所以单独拿出来最为一次解析。
上次我们跟踪spring集成配置源码是从这里找到handler
找到了这个类com.dangdang.ddframe.rdb.sharding.spring.namespace.handler.ShardingJdbcNamespaceHandler
解析data-source xml节点
我们跟进去找到这个方法
com.dangdang.ddframe.rdb.sharding.spring.namespace.parser.ShardingJdbcDataSourceBeanDefinitionParser#parseInternal
这一行SpringShardingDataSource这个类初始化的时候做了些什么呢,上次没有说,因为这块实现还是比较巧妙、复杂,所以这次我们单独看下。
构建分片规则
我们进入到SpringShardingDataSource这个类,可以看到在构造器中调用了构建分片规则的实现,我们进一步跟踪下是怎么构建分片规则的。
进入到build方法实现,我们先整体看下实现
DataSourceRule dataSourceRule = buildDataSourceRule();返回一个数据源配置对象,存储了分片的数据库对象集合和默认的数据库对象名称
buildDataSourceRule方法实现
返回上一个方法,Collection tableRules = buildTableRules(dataSourceRule);构建表规则配置,我们先整体看下这个方法的实现
Collection result = new ArrayList<>(shardingRuleConfig.getTables().size());获取表规则配置集合
分片规则配置对象
表规则配置构造器对象
表规则配置对象
.databaseShardingStrategy(buildShardingStrategy(tableRuleConfig.getDatabaseStrategy(), DatabaseShardingStrategy.class))这行代码是构造数据库分片策略并加入到表规则构造器对象。
进入这个方法com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildShardingStrategy
com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildShardingAlgorithmExpression 这个方法实现,如果这里没有指定分片策略类,就走inline表达式解析的逻辑
com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildShardingAlgorithmClassName指定了分片策略实现类就走这个逻辑,整体看下这个方法实现。
回到这个方法com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#buildTableRules的这行代码
.tableShardingStrategy(buildShardingStrategy(tableRuleConfig.getTableStrategy(), TableShardingStrategy.class));构造表分片策略并加入到表规则构造器对象,和构造数据分片实现一样。
buildGenerateKeyColumn(tableRuleBuilder, tableRuleConfig);分布式id解析
分片规则配置对象构造器
分库分表配置对象
返回到com.dangdang.ddframe.rdb.sharding.config.common.api.ShardingRuleBuilder#build方法
最后是装载分片构造器的一些参数
整个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一系列优美的设计,使架构看起来更简洁扩展性更好,能看出作者深通架构优美设计之道,我之前看过一本书,好的架构、代码就像诗一样,让人流连忘发,更像美人一样让人忍禁不禁,由此也可见作者雄厚的架构功力,另我等望尘莫及,瞬间脑海中闪现出一句话“路漫漫其修远兮,吾将上下而求索”。
后面还有各种经典的设计源码解析,如经典设计模式怎么运用的等内容跟大家分享,请关注“天河聊技术”微信公众号,后面更精彩。以上内容仅供参考,有不对的地方欢迎指正。

关注微信公众号

加入技术微信群
