面試官問我:看過sharding-jdbc的原始碼嗎?我吧啦吧啦說了一通!!
阿新 • • 發佈:2020-09-10
## 寫在前面
> 在產品初期快速迭代的過程中,往往為了快速上線而佔據市場,在後端開發的過程中往往不會過多的考慮分散式和微服務,往往會將後端服務做成一個單體應用,而資料庫也是一樣,最初會把所有的業務資料都放到一個數據庫中,即所謂的單例項資料庫。隨著業務的迅速發展,將所有資料都放在一個數據庫中已經不足以支撐業務發展的需要。此時,就會對系統進行分散式改造,而資料庫業務進行分庫分表的拆分。那麼,問題來了,如何更好的訪問和管理拆分後的資料庫呢?業界已經有很多成熟的解決方案,其中,一個非常優秀的解決方案就是: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