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

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



关注微信公众号

加入技术微信群

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 阿飞Javaer,转载请注明原创出处,谢谢! 上篇文章sharding-jdbc源码之数据源介绍了通过Java硬编...
    阿飞的博客阅读 3,312评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • “我们计划今年销售炎陵黄桃50万斤,这些黄桃将全部从自家果园和周边炎陵黄桃种植农户手中直接采摘发货,解决果农种植户...
    炎陵黄桃果园阅读 217评论 0 1
  • 回家之前,我跟同事说,这次回去我要带新买的书回去看。她说你还是别带了吧,怎么带回去的又该怎么带回来,费劲儿!我信誓...
    Lyn小恩阅读 145评论 0 0
  • 男高音在业界又被称为“难高音”,被视为声乐演唱中的“大熊猫”,因稀缺而格外引人瞩目。这夜,上海大剧院音乐厅内座无虚...
    夏耶阅读 221评论 0 1