在《DistSQL:像数据库一样使用 Apache ShardingSphere》和《SCTL 涅槃重生:投入 RAL 的怀抱》中,我们介绍了DistSQL的设计初衷和语法体系,并通过实际操作展示了DistSQL创建分布式数据库表的强大能力。它以新的形式展示了ApacheShardingSphere的交互体验。为了让大家对DistSQL有更深入的了解,同时根据自己的需要定制自己的DistSQL语法,本文将为大家分析一下DistSQL的设计和开发过程。从需求到设计、开发、测试的完整过程。兰成祥,SphereEx中间件研发工程师,ApacheShardingSphere贡献者,目前专注于DistSQL的设计和开发。什么是DistSQL?分布式SQL是ApacheShardingSphere独有的运行语言。它的使用方式与标准SQL完全相同。它用于提供增量SQL级别的操作能力来管理资源和规则。有关DistSQL的更多信息,请参阅《DistSQL:像数据库一样使用 Apache ShardingSphere》。DistSQL的意义DistSQL设计的目的是打破中间件和数据库的界限,让开发者可以像使用数据库一样使用ApacheShardingSphere。因此,DistSQL的设计会尽可能贴合现有的数据库语法,从而降低学习成本;另外,DistSQL的作用是在SQL层面管理资源和规则,完全替代配置文件也是它的优势之一。为开发DistSQL做准备,在开发前需要了解以下工具1.ANTRL4作为分析工具,是开发DistSQL的基础。ANTLR4的使用请参考【ANTLR4简明教程】:https://wizardforcel.gitbooks...在IntelliJIDEA开发中也需要使用插件ANTLRv4,(https://plugins.jetbrains.com...)功能是测试ANTRL4定义的语法规则。使用方法如下:a.在相应的规则上选择测试规则。在ANTLR预览中输入需要验证的语句。在了解语法和插件的基础上,还需要对DistSQL的执行过程有一定的了解。但DistSQL完整的执行过程相对繁琐,而ShardingSphere良好的架构使得开发者无需关注整个过程即可完成DistSQL功能的开发。开发DistSQL需要注意的核心流程如下。这里以分片功能为例。不同的功能对应不同的访问者:了解了DistSQL的执行过程之后,接下来就是演示如何开发自己的DistSQL。一文中实际演示了使用DistSQL创建分片规则,使用showshardingtablerules显示分片规则。现在,我们提出一个新需求:通过DistSQL快速查询每个分片表的分片数。设计语法如下:showshardingtablescount[fromschema];环境准备MySQL服务,包括分片的数据库和表Zookeeper服务,作为注册中心ShardingSphere-Proxy5.0.0实战演示1.在src/main中创建语法定义在/antlr4/imports中添加如下语法定义/sharding/RQLStatement.g4文件。添加后,可以使用ANTLRv4来测试语法定义。添加语法定义时,需要考虑语法中的关键字是否已经定义。这里的COUNT是未定义的关键字,需要在src/main/antlr4/imports/sharding/Keyword.g4中定义。语法定义好后,需要添加到ShardingDistSQLStatement.g4文件中,可以理解为解析后的路由。完成以上步骤后,编译shardingsphere-sharding-distsql-parser,生成语法对应的上下文对象。2.完成语法定义的分析。在对语法进行处理之前,需要在shardingsphere-distsql-statement中添加一个语法定义对应的DistSQLStatement对象,用于保存语句中的变量属性。例如,当前语法定义中的schemaName需要保存到DistSQLStatement对象中。ShardingSphere中使用ANTLR的Visitor模式,所以语法定义的处理需要重写ShardingDistSQLStatementVisitor中的visitShowShardingTableCount方法。该方法的作用是创建一个ShowShardingTablesCountStatement对象,将语法中的变量属性保存到DistSQLStatement对象中。shardingsphere-distsql-statement有shardingsphere-sharding-distsql-parser依赖,所以需要编译shardingsphere-distsql-statement。3.数据处理和结果返回数据的处理主要通过Handler或Executor中的execute方法进行处理,结果主要通过getRowData方法返回,但不同类型对应的语法定义可能侧重点不同。结果返回的语法定义使用DistSQLResultSet作为结果存储的对象,结果数据会在execute方法中组装。本例为处理方法,下面是本例对应的DistSQLResultSet。在ShardingTablesCountResultSet中,init方法负责数据的获取和组装,getRowData方法负责返回行数据。另外不难发现这个类中有一个getType方法,属于TypedSPI接口,所以ShardingTablesCountResultSet还需要在src/main/resources/META中添加org.apache.shardingsphere.infra.distsql-INF/services当前模块的目录。query.DistSQLResultSet文件只能用来完成SPI注入。路径和内容如下:至此,基本完成了该语法定义的函数的开发。4、单元测试和分析测试在完成基本功能开发后,为保证其持续可用性,需要对新的类或方法增加测试用例,对新的语法增加分析测试。下面是ShardingTablesCountResultSet的单元测试。除了单元测试之外,还需要在shardingsphere-parser-test中对语法定义添加解析测试,将输入的DistSQL解析为DistSQLStatement并与预期的TestCase对象进行比较,步骤如下。A。在src/main/resources/sql/supported/rql/show.xml中添加测试SQL;b.在src/main/resources/case/rql/show.xml中添加测试用例;C。添加TestCase对象用于保存案例中定义的预期结果;d.使用SQLParserTestCases类加载TestCase;e.添加对应的Assert对象,添加到ShowRulesStatementAssert判断中;F。执行DistSQLParserParameterizedTest中的测试方法,测试结束。最后可以在命令行工具中执行开发的DistSQL校验函数。结束语作为5.0.0版本发布的新特性之一,DistSQL会在这个版本的基础上继续发力。我们也希望更多的社区小伙伴加入进来,构建更完善的语法体系,提供更强大的功能,真正打破中间地带。文件和数据库之间的边界。最后,近期成立了DistSQLSIG,致力于DistSQL特性的持续优化、新的使用场景的拓展以及宣传和问答。欢迎您点击此处链接关注并了解DistSQL和ShardingSphere项目的最新进展。欢迎加社区管理员微信(ss_assistant_1)进交流群,与众多ShardingSphere爱好者一起交流进步
