Apache ShardingSphere 作为 Apache 顶级项目,是数据库领域最受欢迎的开源项目之一。经过 5 年多的发展,ShardingSphere 已获得超 14K Stars 的关注,270+ 贡献者,建立起了活跃的社区生态。

随着项目的蓬勃发展,版本的不断更迭,Apache ShardingSphere 支持的特性逐渐增多,功能日益强大,配置规则也在不断优化。为了帮助用户更好地理解各项特性和配置规则,方便用户快速测试并运行相关功能组件,找到最佳实现,shardingsphere-example 项目应运而生。

shardingsphere-example 是一个独立的 Maven 项目,位于 Apache ShardingSphere 项目的 examples 目录下。项目地址:

https://github.com/apache/shardingsphere/tree/master/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
│ │ ├── sharding-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-spring-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-example
│ │ └── 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 https://github.com/apache/shardingsphere.git
## 编译源代码
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. 运行准备

  • 准备一个自定义的分片算法,该算法应根据应用需要,实现

    StandardShardingAlgorithmComplexKeysShardingAlgorithm 或 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 参与到开源社区,为世界级的项目贡献力量。

GitHub issue:

https://github.com/apache/shardingsphere/issues

贡献指南:

https://shardingsphere.apache.org/community/cn/contribute/

往期精彩请点击原文链接。

欢迎扫码关注我们

ShardingSphere 知识库更新 | 官方样例集助你快速上手的更多相关文章

  1. 前端开发工具包 WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

    ​ 前端开发工具包WijmoJS在2019年的第一个主要版本2019V1已经发布,本次发布包括了更加易用的在线Demo系统.各控件新增功能.NPM 包的改动,以及全新的浏览器API组件. WijmoJ ...

  2. 【React Native开发】React Native配置执行官方样例-刚開始学习的人的福音(8)

    ),React Native技术交流4群(458982758),请不要反复加群! 欢迎各位大牛,React Native技术爱好者加入交流!同一时候博客左側欢迎微信扫描关注订阅号,移动技术干货,精彩文 ...

  3. c++ map 官方样例

    #include <iostream> #include <string> #include <iomanip> #include <map> temp ...

  4. Boost Python官方样例(三)

    导出C++类(纯虚函数和虚函数) 大致做法就是为class写一个warp,通过get_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出wa ...

  5. Boost Python官方样例(二)

    返回值 使用return_by_value有点像C++ 11的auto关键字,可以让模板自适应返回值类型(返回值类型必须是要拷贝到新的python对象的任意引用或值类型),可以使用return_by_ ...

  6. Boost Python官方样例(一)

    配置环境 $ cat /etc/os-release NAME="Ubuntu" VERSION="16.04 LTS (Xenial Xerus)" ID=u ...

  7. 想知道Vue3与Vue2的区别?五千字教程助你快速上手Vue3!

    从Vue3发布以来,我就一直对其非常感兴趣,就一直想着将其投入公司的生产中,但是开始考虑到很多不确定性就暂时对一些很小的功能进行一些尝试:慢慢的发现组合式Api的形式非常适合开发(个人感觉),尤其是V ...

  8. 必会技能!Docker助你快速上手玩转HBase!

    前言:本文主要讲述了如何使用Docker快速上手HBase,省去繁杂的安装部署环境,直接上手,小白必备.适合HBase入门学习及简单代码测试. 1. Docker 安装 参考地址: https://y ...

  9. SWFUpload简单使用样例 Java版(JSP)

    SWFUpload官方的样例都是PHP的,在这里提供一个Java版的最简单的使用样例,使用JSP页面完毕全部操作. 实现上传,分为三步: 1.JavaScript设置SWFUpload部分(与官方样例 ...

随机推荐

  1. JavaWeb之JavaMail

    时间:2016-12-19 11:58 --邮件协议1.收发邮件    发邮件是从客户端把邮件发送到服务器,收邮件是把邮件服务器的邮件下载到客户端    2.邮件协议概述    与HTTP协议相同, ...

  2. Linux centos 安装 ftp(Vsftp) 与 设置ftp(Vsftp)

    本文章只是简单搭建,因为公司只须要简单使用,虽然简单但是之前也走了一些弯路,所以决定把过程记录下来. 一.Vsftp安装与卸载 安装:yum install vsftpd 卸载:yum remove ...

  3. go GC垃圾回收原理

    目录 1.前言 2. 垃圾回收算法 3. Golang垃圾回收 3.1 垃圾回收原理 3.2 内存标记(Mark) 3.3 三色标记 3.4 Stop The World 4. 垃圾回收优化 4.1 ...

  4. java js转码

    public static String escape(String src) { int i; char j; StringBuffer tmp = new StringBuffer(); tmp. ...

  5. 源码解析.Net中Middleware的实现

    前言 本篇继续之前的思路,不注重用法,如果还不知道有哪些用法的小伙伴,可以点击这里,微软文档说的很详细,在阅读本篇文章前,还是希望你对中间件有大致的了解,这样你读起来可能更加能够意会到意思.废话不多说 ...

  6. Git使用教程七——Git实用技能

    Git实用技能 1.图形管理工具 Github for Desktop Source tree 老牌的GitGUl管理工具了,也号称是最好用的Git GUI工具.功能丰富,基本操作和高 级操作都非常流 ...

  7. JS中原型与原型链

    一. 普通对象与函数对象 JavaScript 中,万物皆对象!但对象也是有区别的.分为普通对象和函数对象,Object .Function等 是 JS 自带的函数对象.下面举例说明. var o1 ...

  8. Linux下Sed命令替换文件中的所有IP

    命令: sed -ri 's/([0-9]{1,3}\.){3}[0-9]{1,3}/localhost/g' es_create_index.sh 如图:

  9. NOIP模拟测试17&18

    NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...

  10. Linux的LCD驱动分析及移植

    测试平台 宿主机平台:Ubuntu 12.04.4 LTS 目标机:Easy-ARM IMX283 目标机内核:Linux 2.6.35.3 LCD驱动分析 LCD屏的驱动总体上分成两块,一块是GUI ...