1. 程式人生 > >面試官問我:看過sharding-jdbc的原始碼嗎?我吧啦吧啦說了一通!!

面試官問我:看過sharding-jdbc的原始碼嗎?我吧啦吧啦說了一通!!

## 寫在前面 > 在產品初期快速迭代的過程中,往往為了快速上線而佔據市場,在後端開發的過程中往往不會過多的考慮分散式和微服務,往往會將後端服務做成一個單體應用,而資料庫也是一樣,最初會把所有的業務資料都放到一個數據庫中,即所謂的單例項資料庫。隨著業務的迅速發展,將所有資料都放在一個數據庫中已經不足以支撐業務發展的需要。此時,就會對系統進行分散式改造,而資料庫業務進行分庫分表的拆分。那麼,問題來了,如何更好的訪問和管理拆分後的資料庫呢?業界已經有很多成熟的解決方案,其中,一個非常優秀的解決方案就是:Apache ShardingSphere。今天,我們就從原始碼級別來共同探討下sharding-jdbc的核心原始碼。 ## sharding-jdbc經典用法 Sharding-Jdbc 是一個輕量級的分庫分表框架,使用時最關鍵的是配製分庫分表策略,其餘的和使用普通的 MySQL 驅動一樣,幾乎不用改程式碼。例如下面的程式碼片段。 ```java try(DataSource dataSource = ShardingDataSourceFactory.createDataSource( createDataSourceMap(), shardingRuleConfig, new Properties()) { Connection connection = dataSource.getConnection(); ... } ``` 我們在程式中拿到Connection物件後,就可以像使用普通的JDBC一樣來使用sharding-jdbc操作資料庫了。 ## sharding-jdbc包結構 ```bash sharding-jdbc ├── sharding-jdbc-core 重寫DataSource/Connection/Statement/ResultSet四大物件 └── sharding-jdbc-orchestration 配置中心 sharding-core ├── sharding-core-api 介面和配置類 ├── sharding-core-common 通用分片策略實現... ├── sharding-core-entry SQL解析、路由、改寫,核心類BaseShardingEngine ├── sharding-core-route SQL路由,核心類StatementRoutingEngine ├── sharding-core-rewrite SQL改寫,核心類ShardingSQLRewriteEngine ├── sharding-core-execute SQL執行,核心類ShardingExecuteEngine └── sharding-core-merge 結果合併,核心類MergeEngine shardingsphere-sql-parser ├── shardingsphere-sql-parser-spi SQLParserEntry,用於初始化SQLParser ├── shardingsphere-sql-parser-engine SQL解析,核心類SQLParseEngine ├── shardingsphere-sql-parser-relation └── shardingsphere-sql-parser-mysql MySQL解析器,核心類MySQLParserEntry和MySQLParser shardingsphere-underlying 基礎介面和api ├── shardingsphere-rewrite SQLRewriteEngine介面 ├── shardingsphere-execute QueryResult查詢結果 └── shardingsphere-merge MergeEngine介面 shardingsphere-spi SPI載入工具類 sharding-transaction ├── sharding-transaction-core 介面ShardingTransactionManager,SPI載入 ├── sharding-transaction-2pc 實現類XAShardingTransactionManager └── sharding-transaction-base 實現類SeataATShardingTransactionManager ``` ## sharding-jdbc中的四大物件 所有的一切都從 ShardingDataSourceFactory 開始的,建立了一個 ShardingDataSource 的分片資料來源。除了 ShardingDataSource(分片資料來源),在 Sharding-Sphere 中還有 MasterSlaveDataSourceFactory(主從資料來源)、EncryptDataSourceFactory(脫敏資料來源)。 ```java public static DataSource createDataSource( f