ShardingSphere 全新示例模块实现原理以及使用说明
问题分析
ShardingSphere 经过几年的迅速发展,核心的功能模块已经有六个,并且支持了不同的注册中心如 ZooKeeper, Nacos、分布式事务以及不同的开发框架,功能是十分强大且完善的。那么如何将这么强大而且完善的功能让用户轻松的上手使用就是一个比较大的难题。由此,我们开发了一个 example 模块,通过对于不同功能特性、注册中心、服务框架的组合以及业务逻辑的抽象,形成了我们的 example 体系。如下图所示:
图 1 ShardingSphere 旧 example 目录结构
但是,经过不断的发展,example 模块融合的功能点越来越多,用户没办法快速的找到自己想要的示例,并且由于共用性的业务逻辑代码导致示例十分难以理解。经过讨论,当前的 example 主要存在如下问题:
- 示例模块较为模糊,层次抽象和 ShardingSphere 的模块层次有出入,不能清楚的表示 ShardingSphere 特征和结构情况
- 依赖的公共业务代码过于复杂,包含了太多通用性和抽象的代码,用户学习成本较大
- 配置较为单一,并且配置使用方式不够标准化,为了能够最大限度支持更多的场景,有太多的逻辑处理,而非 ShardingSphere 自身的能力。
- 样例组合比较少,不够灵活,我们应该支持不同的服务框架和模块,如 jdbc、spring boot + jdbc 等等
- ShardingSpher Proxy 示例不应该引入过多的逻辑示例,对于 Proxy 的示例而言应该更关注于配置。
实现原理
上述问题中,核心问题就是代码示例耦合太过严重,并且不够灵活,用户学习成本比较大,我们的目标就是用户可以自由组合选择他需要的 ShardingSphere 支持的模块和功能,并且可以有不同组合排列,通过分析调研,我们基于 freemarker 模版引擎,提前将 ShardingSphere 的模块拆解成最小组合单元,将这些组合单元分别预制在不同的场景下,用户选择场景组合时自动抽离出对应的逻辑单元进行排列组合,生成对应的示例工程。如图 2 所示为加密模块的最小逻辑单元。
图 2 加密模块最小逻辑单元
通过对功能代码的最小逻辑单元的拆分,我们可以基于用户的的选择,灵活地组合功能特性,达到按需取用的目的。同时,除了核心功能模块的代码逻辑的拆分,我们将原来公共业务逻辑的代码模版化,取消业务代码的抽象逻辑,降低用户的学习成本。如下图 3 所示:
图 3 公共业务逻辑模版
为了更加贴合 ShardingSphere 的特点以及目录层次,我们抽象出了几种类型的配置,例如从整体的产品使用角度我们分为 jdbc 和 proxy,功能特性上我们分为了加解密、读写分离、分库分表等等,支持的配置类型详情见表 1。
表 1 抽象的配置类型
名称 | 释义 | 可选值 |
products | 产品类型 | jdbc、proxy |
features | 功能特性 | sharding、readwrite-splitting、encrypt、shadow、db-discovery、mask |
frameworks | 服务框架 | jdbc、spring-boot-starter-jdbc、spring-boot-starter-jpa、spring-boot-starter-mybatis、spring-namespace-jdbc、spring-namespace-jpa、spring-namespace-mybatis |
modes | 运行模式 | standalone、cluster-zookeeper、cluster-etcd |
transactions | 事务类型 | local、xa-atomikos、xa-narayana、xa-bitronix、base-seata |
基于我们抽离的配置类型,梳理和重新定义了模块示例代码的模块名称,以便于用户查找和使用。如下所示。
shardingsphere-${product}-sample/${feature}--${framework}--${mode}--${transaction}
总的来说,新的 example 基于 freemarker 模版引擎,通过功能代码拆分最小的逻辑单元、业务代码抽象业务模版以及标准化模块的名称,极大的扩展了 example 模块的灵活性,整体生成的逻辑如下:
图 4 示例生成引擎逻辑结构
基于此框架下,我们生成的每一个模块都是完整独立的项目,我们可以测试单独使用。
怎么使用
学习完成实现的具体的原理后,我们来具体的讲解一下如何使用。
1. 认识新示例生成模块
进入 ShardingSphere 项目目录,找到对应的 example 模块中的 shardingsphere-example-generator 模块,这个模块为示例生成模块,所有模版文件以及生成逻辑在这个模块中。
图 5 生成引擎的项目结构
2. 配置生成引擎的参数
shardingsphere-example-generator 模块是一个标准的 Java 项目,项目的配置文件是在 resources/config.yaml,在这个文件中,我们声明了生成引擎所支持的一些基本参数。为了更方便的支持用户使用,除了上文说到一些功能的模版参数外,我们也提供了一些便捷性的配置,用户可以根据自己的需求进行配置。具体参数的含义如表 2 所示:
表 2 生成引擎参数配置释义
名称 | 释义 | 说明 |
output | 生成示例的输出路径 | 支持缺省配置,默认生成路径为:。/examples/shardingsphere-example-generator/target/generated-sources/ |
products | 产品类型,支持同时配置多个 | 可支持的配置项:jdbc、proxy |
features | 功能特性,支持同时配置多个,功能特性之间会相互排列组合 | 可支持的配置项:sharding、readwrite-splitting、encrypt、shadow、db-discovery、mask |
frameworks | 服务框架,支持同时配置多个 | 可支持的配置项:jdbc、spring-boot-starter-jdbc、spring-boot-starter-jpa、spring-boot-starter-mybatis、spring-namespace-jdbc、spring-namespace-jpa、spring-namespace-mybatis |
modes | 运行模式,支持同时配置多个 | 可支持的配置项:standalone、cluster-zookeeper、cluster-etcd |
transactions | 事务类型,支持同时配置多个 | 可支持的配置项:local、xa-atomikos、xa-narayana、xa-bitronix、base-seata |
props | 更多的一些属性配置,目前主要针对 mysql,后续扩展更多属性。 | host:MySQL 的地址 port:MySQL 的端口 username:MySQL 账号名 password:MySQL 对应账号的密码 |
3. 通过引擎生成对应的配置模块
修改好配置后,我们可以进行生成对应的配置模块,触发生成主要有两种方式。一种是运行主类:找到shardingsphere-example-generator 模块下的ExampleGeneratorMain 类,运行 main 方法即可在对应配置的目录下生成示例。另一种是使用 maven 命令行:同样的,我们支持了maven命令行,使用方式如下:
// 基于config.yaml生成配置
./mvnw -B clean install -f examples/shardingsphere-example-generator/pom.xml -Pexample-generator
// 基于命令参数生成配置
./mvnw -B clean install -f examples/shardingsphere-example-generator/pom.xml -Pexample-generator -Dproducts=jdbc -Dmodes=cluster-zookeeper -Dtransactions=local -Dfeatures=shadow -Dframeworks=jdbc
4. 查看和使用示例
触发生成后,相关的示例代码会生成在配置好的 output 目录下,一般而言:
生成在 shardingsphere-example-generator/target/generated-sources/ 目录下。
生成的目录结构如下图 4 所示:
图 6 生成示例的目录结构
在生成目录下,每一个项目模块都是一个标准的 Maven 项目,我们可以直接使用 idea 直接打开,运行,生成的项目结构如图 7 所示:
图 7 生成的示例项目结构
未来规划
目前,我们完成了示例生成代码的模版引擎,基于这个引擎,我们实现了 JDBC 的第一版本示例,目前的示例拆分的最小逻辑单元力度还是比较粗的,并且也相对而言比较简单单一,需要配合着使用文档一起增加更多的配置,后续我们期望进一步细化最小的逻辑单元,提供更高的灵活性和完整性,也期待大家的一起参与,让 ShardingSphere 更好、更强大!
文章转载自公众号: ShardingSphere官微