ShardingSphere 知識庫更新 | 官方樣例集助你快速上手

SphereEx發表於2021-08-20

Apache ShardingSphere 作為 Apache 頂級專案,是資料庫領域最受歡迎的開源專案之一。經過 5 年多的發展,ShardingSphere 已獲得超 14K Stars 的關注,270+ 貢獻者,建立起了活躍的社群生態。

隨著專案的蓬勃發展,版本的不斷更迭,Apache ShardingSphere 支援的特性逐漸增多,功能日益強大,配置規則也在不斷最佳化。為了幫助使用者更好地理解各項特性和配置規則,方便使用者快速測試並執行相關功能元件,找到最佳實現,shardingsphere-example 專案應運而生。

shardingsphere-example 是一個獨立的 Maven 專案,位於 Apache ShardingSphere 專案的 examples 目錄下。 專案地址:

江龍滔

SphereEx 中介軟體研發工程師,Apache ShardingSphere contributor。目前專注於 ShardingSphere 資料庫中介軟體研發及開源社群建設。

侯陽

SphereEx 中介軟體研發工程師,目前從事 ShardingSphere 資料庫中介軟體研發,熱愛開源,希望同大家一起建設更好的社群。


模組詳解

shardingsphere-example 專案包含多個模組,將為使用者帶來水平拆分、讀寫分離、分散式治理、分散式事務、資料加密、強制路由、影子庫等功能的使用及配置樣例,覆蓋 Java API、YAML、Spring Boot、Spring Namespace 等多種業務常用的接入形態。除了 ShardingSphere-JDBC,shardingsphere-example 中還增加了 ShardingSphere-Proxy 和 ShardingSphere-Parser 的使用案例。

所有涉及到 Apache ShardingSphere 的功能特性、接入場景以及各種靈活的配置方式,都可以在官方的 repo 裡找到樣例,方便使用者查詢和參考。下表展示了 shardingsphere-example 的模組分佈情況:

shardingsphere-example
  ├── example-core
  │   ├── config-utility
  │   ├── example-api
  │   ├── example-raw-jdbc
  │   ├── example-spring-jpa
  │   └── example-spring-mybatis
  ├── shardingsphere-jdbc-example
  │   ├── sharding-example
  │   │   ├── sharding-raw-jdbc-example
  │   │   ├── shardi ng-spring-boot-jpa-example
  │   │   ├── sharding-spring-boot-mybatis-example
  │   │   ├── sharding-spring-namespace-jpa-example
  │   │   └── sharding-spring-namespace-mybatis-example
  │   ├── governance-example

  │   │   ├── governance-raw-jdbc-example
  │   │   ├── governance-spring-boot-mybatis-example
  │   │   └── governance-spr ing-namespace-mybatis-example
  │   ├── transaction-example
  │   │   ├── transaction-2pc-xa-atomikos-raw-jdbc-example
  │   │   ├── transaction-2pc-xa-bitronix-raw-jdbc-example
  │   │   ├── transaction-2pc-xa-narayana-raw-jdbc-example
  │   │   ├── transaction-2pc-xa-spring-boot-example
  │   │   ├── transaction-2pc-xa-spring-namespace-example
  │   │   ├── transaction-base-seata-raw-jdbc-examp
le       
  │   │   └── transaction-base-seata-spring-boot-example
  │   ├── other-feature-example
  │   │   ├── encrypt-example
  │   │   │   ├── encrypt-raw-jdbc-example
  │   │   │   ├── encrypt-spring-boot-mybatis-example
  │   │   │    └── encrypt-spring-namespace-mybatis-example
  │   │   ├── hint-example
  │   │   │   └── hint-raw-jdbc-example
  │   │   └── shadow-example
  │   │   │   ├── shadow-raw-jdbc-example
  │   │   │   ├── shadow-spring-boot-mybatis-example
  │   │   │   └── shadow-spring-namespace-mybatis-example
  │   ├── extension-example
  │   │   └── custom-sharding-algortihm-example
  ├── shardingsphere-parser-example

  ├── shardingsphere-proxy-example
  │   ├── shardingsphere-proxy-boot-mybatis-example
  │   └── shardingsphere-proxy-hint-example
  └── src/resources
        └── manual_schema.sql

1. example-core

example 核心模組,包含實體、介面定義和其他公用程式碼。

2. shardingsphere-jdbc-example

ShardingSphere-JDBC 示例模組,展示 ShardingSphere-JDBC 的功能特性和各種使用方式。

(1)sharding-example

展示如何使用  ShardingSphere-JDBC 進行資料分片,包含分庫、分表、分庫+分表、讀寫分離、讀寫分離+分庫分表的應用場景。在 ORM 整合方面,本模組也貼心的為使用者提供了 MyBatis 和 JPA 的整合樣例。

(2)governance-example

展示 ShardingSphere-JDBC 在分散式治理方面的應用,包含了分庫分表、讀寫分離、資料加密、影子庫等特性與分散式治理相結合的應用場景。

注意: 分散式治理 example 依賴 Apache ZooKeeper,請自行部署。

(3)transaction-example

展示 ShardingSphere-JDBC 支援的多種分散式事務管理方式,使用者可以根據應用場景選擇適合的分散式事務管理器進行使用。鑑於分散式事務的特殊性,本模組的示例都是基於分庫、分表或分庫+分表的場景設計的。

注意: Seata 事務管理器需要自行部署。

(4)other-feature-example

ShardingSphere-JDBC 其他功能特性的示例,目前包含了 encrypt(資料加密)、hint(強制路由)、shadow(影子庫)幾種型別。

① encrypt-example

資料加密功能示例,同樣包含了 Java API、YAML、Spring Boot、Spring Namespace 等幾種接入方式的樣例。

② hint-example

強制路由功能示例,目前只提供了 YAML 配置方式的案例,更多場景歡迎補充。

③ shadow-example

影子庫功能示例,包含了影子庫特性與資料加密、分庫分表、讀寫分離等特性結合的應用樣例。

(5)extension-example

本模組展示 ShardingSphere-JDBC 的自定義擴充套件能力,使用者可以透過 SPI 或 ShardingSphere 提供的其他方式進行功能擴充套件。

① custom-sharding-algortihm-example

展示瞭如何透過 'CLASS_BASED' 方式進行自定義分片演算法的擴充套件。

3. shardingsphere-parser-example

SQLParserEngine  是 Apache ShardingSphere 定製的 SQL 解析引擎,也是 ShardingSphere-JDBC 和 ShardingSphere-Proxy 的能力基礎。使用者輸入的 SQL 文字 透過  SQLParserEngine   解析成可以識別的語法物件,之後才能進行路由、改寫等增強操作。

從 5.0.0-alpha 版本開始,Apache ShardingSphere 將 SQL 解析這一核心能力開放給使用者,使用者可以透過 API 呼叫  SQLParserEngine,在自己的應用系統中進行高效的 SQL 解析,滿足更多個性化的業務需要。

本模組展示了  SQLParserEngine API 的使用方式,覆蓋了 MySQL、PostgreSQL、Oracle、SQLServer 以及 SQL92 等各種語法形式。

4. shardingsphere-proxy-example

ShardingSphere-Proxy 示例模組,包含了分庫分表、讀寫分離和強制路由等常用場景的配置樣例。由於 ShardingSphere-Proxy 與 ShardingSphere-JDBC 在功能特性的支援度上大體相同,未列舉的示例也可以對照  shardingsphere-jdbc-example  進行參考。

(1)shardingsphere-proxy-boot-mybatis-example

展示了透過 Proxy 配置資料分片,並使用 SpringBoot + MyBatis 的方式進行資料訪問的場景示例。

(2)shardingsphere-proxy-hint-example

展示了透過 Proxy 配置強制路由,並使用 Java 客戶端進行資料訪問的場景示例。


近期最佳化

在 Apache ShardingSphere 5.0.0-beta 版本釋出之際,社群貢獻者對 shardingsphere-example 也進行了升級和最佳化,主要包括:

  • JDK 版本升級

  • 元件版本升級

  • 類命名最佳化

  • 配置檔案最佳化

  • SQL 指令碼最佳化

以下是升級相關的詳細內容:

JDK 版本升級

在以 Java 作為主要語言的專業開發者中,Java 8 LTS(長期支援版本)仍然是最受歡迎的版本。

來源《JetBrains 公司 2020 關於 Java 的報告》:https://blog.jetbrains.com/zh-hans/idea/2020/10/java-2020/

shardingsphere-example 升級以後要求 Java 8 作為最低版本。如果您當前使用的是 Java 7 或更早版本,則需要先升級 JDK。

Spring 依賴升級

shardingsphere-example 對 Spring 相關元件進行升級。

  • spring-boot version 由 1.5.17 升級到 2.0.9.RELEASE

  • springframework version 由 4.3.20.RELEASE 升級到 5.0.13.RELEASE

  • mybatis-spring-boot-start version 由 1.3.0 升級到 2.0.1

  • mybatis-spring version 由 1.3.0 升級到 2.0.1

持久層框架升級

shardingsphere-example 對持久層框架 MyBatis 和 Hibernate 進行了升級。

  • mybatis version 由 3.4.2 升級到 3.5.1

  • hibernate version 由 4.3.11.Final 升級到 5.2.18.Final

資料庫連線池升級

shardingsphere-example 對資料庫連線池 HikariCP 進行了升級。

  • HikariCP artifactId 由 HikariCP-java7 升級到 HikariCP

  • HikariCP version 由 2.4.11 升級到 3.4.2

資料庫驅動升級

shardingsphere-example 對 MySQL 和 PostgreSQL 連線驅動進行了升級。

  • mysql-connector-java version 由 5.1.42 升級到 5.1.47

  • postgresql version 由 42.2.5.jre7 升級到 42.2.5


Example 執行示例

從這裡開始,我們將透過幾個典型場景來說明如何配置和執行 example。

由於 shardingsphere-example 專案模組眾多,本次挑選幾個關注度較高的 ShardingSphere-JDBC 應用場景來舉例說明。

前置準備

1. shardingsphere-example 使用 Maven 作為構建工具,請提前準備 Maven 環境;

2. 準備 Apache ShardingSphere,如果你的裝置中尚未安裝 Apache ShardingSphere,可以按照如下方式進行下載和編譯:

## 克隆 Apache ShardingSphere 專案
git  clone 
## 編譯原始碼
cd shardingsphere
mvn clean install -Prelease

3. 將 shardingsphere-example 專案匯入自己的 IDE 中;

4. 準備一個可管理的資料庫環境,例如本地的 MySQL 例項;

5. 如需執行讀寫分離測試,請確保資料庫的主從同步機制工作正常;

6. 執行資料庫初始化指令碼:examples/src/resources/manual_schema.sql

場景示例

  • sharding-spring-boot-mybatis-example「分庫分表場景」

1. 模組路徑

examples/shardingsphere-jdbc-example/sharding-example/sharding-spring-boot-mybatis-example

2. 場景目標

本示例展示 ShardingSphere-JDBC 結合 SpringBoot 和 MyBatis 進行分庫分表的應用場景。此次分片的目標是 2 庫 4 表,即將一張邏輯表拆分為 4 個分片,均勻儲存在 2 個不同的資料庫中。

3. 執行準備

  • 配置 application.properties

    • 將 spring.profiles.active 設定為  sharding-databases-tables

  • 配置 application-sharding-databases-tables.properties

    • 將  jdbc-url   修改為自己的資料庫地址,並配置正確的使用者名稱密碼等資訊

    • 將  spring.shardingsphere.props.sql-show  屬性設定為  true

詳細配置說明請閱讀配置手冊:

https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/spring-boot-starter/sharding/

4. 啟動執行

執行啟動類:   ShardingSpringBootMybatisExample.java

此時即可透過日誌中的「Logic SQL」和「Actual SQL」觀察每一條 SQL 語句的路由情況,理解分庫分表的執行機制。

  • sharding-raw-jdbc-example「讀寫分離場景」

1. 模組路徑

examples/shardingsphere-jdbc-example/sharding-example/sharding-raw-jdbc-example

2. 場景目標

本示例展示如何使用 YAML 配置 ShardingSphere-JDBC 的讀寫分離功能。此次演示的場景是一個寫庫 + 兩個讀庫的分離配置。

3. 執行準備

  • 配置 META-INF/readwrite-splitting.yaml

    • 將  jdbc-url  修改為自己的資料庫地址,並配置正確的使用者名稱密碼等資訊

    • 將  props.sql-show  屬性設定為   true

詳細配置說明請閱讀配置手冊:

https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/yaml/readwrite-splitting-/

4. 啟動執行

開啟啟動類: ShardingRawYamlConfigurationExample.java ,將  shardingType  設定為  ShardingType.READWRITE_SPLITTING ,並啟動執行。

此時即可透過日誌中的「Logic SQL」和「Actual SQL」觀察每一條 SQL 語句的路由情況,理解讀寫分離的執行機制。

注意: 如果主從資料庫無法正常同步,將會發生查詢異常。

  • custom-sharding-algortihm-example「自定義演算法場景」

1. 模組路徑:

examples/shardingsphere-jdbc-example/extension-example/custom-sharding-algortihm-example/class-based-sharding-algorithm-example

2. 場景目標

本示例展示如何使用  CLASS_BASED  方式進行自定義演算法擴充套件,讓 ShardingSphere-JDBC 在進行分片路由時,使用使用者提供的演算法來計算分片結果。此次演示的場景是使用自定義分片演算法進行分庫。

3. 執行準備

  • 準備一個自定義的分片演算法,該演算法應根據應用需要,實現  

    StandardShardingAlgorithm ComplexKeysShardingAlgorithm  或  HintShardingAlgorithm  其中一個介面,如示例中提供的  ClassBasedStandardShardingAlgorithmFixture

  • 配置 META-INF/sharding-databases.yaml

    •   jdbc-url   修改為自己的資料庫地址,並配置正確的使用者名稱密碼等資訊

    • 將  props.sql-show  屬性設定為  true

    • 注意  shardingAlgorithms  配置項,當  type  為  CLASS_BASED   時,可以透過  props  指定自定義演算法的類別和全路徑,這樣就可以完成自定義演算法的配置。

詳細配置說明請閱讀配置手冊:

https://shardingsphere.apache.org/document/current/cn/user-manual/shardingsphere-jdbc/configuration/built-in-algorithm/sharding/

4. 啟動執行

執行啟動類:

YamlClassBasedShardingAlgorithmExample.java

此時即可透過日誌觀察分庫執行情況,並可以透過 DEBUG 等方式檢查自定義演算法的輸入輸出是否符合預期。


結語

以上就是本次知識庫分享的全部內容。有關 ShardingSphere-JDBC、ShardingSphere-Proxy 和 ShardingSphere-Parser 的示例將在未來繼續為大家分享。如果讀者有感興趣的場景需求,或是發現了新的問題、新的提升點,歡迎在 GitHub issue 列表提出建議,也可提交 Pull Request 參與到開源社群,為世界級的專案貢獻力量。


往期精彩請點選原文連結。


歡迎掃碼關注我們

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70001955/viewspace-2788039/,如需轉載,請註明出處,否則將追究法律責任。

相關文章