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一系列優美的設計,使架構看起來更簡潔擴展性更好,能看出做者深通架構優美設計之道,我以前看過一本書,好的架構、代碼就像詩同樣,讓人流連忘發,更像美人同樣讓人忍禁不由,由此也可見做者雄厚的架構功力,另我等可望不可即,瞬間腦海中閃現出一句話「路漫漫其修遠兮,吾將上下而求索」。

相關文章
相關標籤/搜索