sharding-jdbc源码解析之spring集成分片构造实现

说在前面java

本文转自“天河聊技术”微信公众号web

 

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

上次咱们跟踪spring集成配置源码是从这里找到handler数据库

找到这个类api

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<TableRule> tableRules = buildTableRules(dataSourceRule);构建表规则配置,咱们先总体看下这个方法的实现

Collection<TableRule> 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一系列优美的设计,使架构看起来更简洁扩展性更好,能看出做者深通架构优美设计之道,我以前看过一本书,好的架构、代码就像诗同样,让人流连忘发,更像美人同样让人忍禁不由,由此也可见做者雄厚的架构功力,另我等可望不可即,瞬间脑海中闪现出一句话“路漫漫其修远兮,吾将上下而求索”。

相关文章
相关标签/搜索