美文网首页我爱编程
sharding-jdbc源码解析之spring集成配置解析三

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

作者: 天河2018 | 来源:发表于2018-05-25 19:20 被阅读0次

    说在前面

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

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

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

    关注微信公众号

    加入技术微信群

    相关文章

      网友评论

        本文标题:sharding-jdbc源码解析之spring集成配置解析三

        本文链接:https://www.haomeiwen.com/subject/wciujftx.html