共计 3366 个字符,预计需要花费 9 分钟才能阅读完成。
作者 | 侯志
起源 | 阿里巴巴云原生公众号
看一看日历
这个不同寻常的 2020 年,马上就要完结了。
这一年,有幸参加阿里巴巴组织 ASoC 流动,有一段让我难忘的不平庸经验。
这一年,却已能够称为是国内开源实习倒退历程中不平庸的一年。
参加的起因
初心
Beginner’s mind
唯有守得住初心,能力日益精进。
我先来说说 Seata 这个我的项目的 idea 是怎么来的。始终就有参加开源我的项目的打算,一个事物的衰亡必然或大或小引发肯定的问题,微服务就是这样,分布式事务概念泛化的同时,也带来了一个技术问题,微服务架构下分布式数据一致性该如何保障?这几年涌现出不少分布式事务框架,比方 ByteTCC、TCC-transaction、EasyTransaction 以及最近很火爆的 Seata。想要破解邪恶,就必须靠近它,甚至成为它。我是去年 8 月份从 GitHub 开始关注 Seata 我的项目的,初步相熟后,我感觉它的设计理念十分好,并对它产生了浓重的趣味,那个时候就萌生了我要成为这个我的项目的贡献者。偶尔的机会看到 Seata issue,发现了 ASoC 这个流动。
参加的过程
- 有期待,更美妙
Expect better
在参加流动之前我就先从官网文档开始理解过 Seata,并依据本人的理解,做了一些简略的梳理。看 Seata 源码,持续深入研究,更多的是关注于 SqlParser 模块,在这个过程中,我发现 SqlParser 模块是用 Druid 实现,(Druid 不过多介绍),且 Seata 对于 SqlParser 局部解析性能受限于 Druid,为了不便用户应用,Seata 更加灵便应用数据库语言解析, 有必要扩大一种新的 SqlParser 计划。因为之前有理解过 Antlr,感觉其更加灵便、拓展性更强、档次清晰更易保护。例如 Hive 和 Spark 应用 Antlr 生成词法语法解析器,Twitter 应用 Antlr 来解析用户输出的查问内容,Oracle 把 Antlr 的性能内嵌在 SQL 开发 IDE 中,NetBeans IDE 应用 Antlr 解析 C ++ 语言,也有公司应用 Antlr 来从文件中抽取信息等等 …
Antlr 无疑是 Seata SqlParser 另一个更好的抉择。于是我想把 Antlr 带到 Seata 中。
- 蛊惑
Confuse
在开发工作期间,Antlr 模块是一个 feature 的实现,波及 Seata 对于数据库语言解析的一块(有前辈开发者应用 Druid 去解决相干数据库语言数据,因而我进行了 Druid 源码深入研究,根本相似于应用 Antlr 实现一种轻量级别的 Druid),而整个实现过程,太多的中央须要确定,包含实现数据库品种、Antlr 源文件、Antlr 模块划分,以及明确上下游 API 接口等等。在实现解析数据库每种语法语句的时候,比方 Mysql 新增语法,应用 Antlr Visitor 模式,并不兼容查问、批改、删除语法,一直打翻之前的代码,一直调试,甚至导致 Antlr 源文件变动(Antlr 官网提供的源文件过大,改变很头疼)。最终采纳 Antlr 两种解析模式去解析。Listener 针对于查问、批改,删除语法包含批量操作,最终问题得以解决。
- 顿悟
Epiphany
字符串流重写 LA 遍历办法。这里应用 Antlr v4.0.0 字符串流重写 LA 遍历办法,否则大小写转换出错,调用 MySqlLexer 进行词法剖析、CommonTokenStream 符号分析、MySqlParser 执行语法规定剖析,调用咱们自定义的 InsertSpecificationSql,visit 去遍历 Ast 树,把解析出的信息用 MySqlContext 展现。过程很简略,然而在理论过程中可能会遇到很多问题,比方新增语法、查问语法、批改语法、删除语法以及它们语法规定是否有通用性、实现的办法是否能够专用;不同的 sql 语法,是否同一个办法能反对;批量 sql 的话,怎么去解决等等问题。
在解析 mysql 原生 sql 语句时候,遇到这样一个问题,解析出的 sql 明明是对的,Ast 视图树中也正确,然而返回给客户会呈现上面这种状况:
原生 sql 竟然把空格都给省略掉,一开始我先执行 Ast 树,查问解析后果,发现没有问题,一激灵我想到不是有词法关键词吗,剖析时候必定是基于 Mysql 关键字的,而后把应用到 Mysql 关键词的字符加了空格,重写生成文件,发现是没有问题的。但这词法太多了吧,我都改掉解析会不会呈现问题?果然好多解析呈现了问题,导致 Seata 生成前后镜像呈现问题。遇到事件不能浮躁,沉着 … 它不是有 Ast 树吗,我在它遍历 Ast 树的时候给它加上空格不就好了吗?这样原生的词法文件基本不须要动,也不会引起后续问题,我连忙浏览起了 Antlr java 源码,功夫不负有心人,果然找到了解决办法,我重写了 visitTerminal 办法:
@Override
public StringBuilder visitTerminal(TerminalNode node) {String text = node.getText();
if (text != null && !"".equals(text.trim())) {if (shouldAddSpace(text.trim())) {sb.append(" ");
}
sb.append(text);
}
return sb;
}
private boolean shouldAddSpace(String text) {if (sb.length() == 0) {return false;}
char lastChar = sb.charAt(sb.length() - 1);
switch (lastChar) {
case '.':
case ',':
case '(':
return false;
default:
break;
}
switch (text.charAt(0)) {
case '.':
case ',':
case ')':
return false;
default:
break;
}
return true;
}
播种与领会
思维 - 编程能力
Thinking-programming ability
参加 Seata 过程中在社区意识了很多优良的开发者,这些开发者很多是值得我去学习的,有不了解的中央我的前辈导师包含社区敌人都热心帮我解决。每个阶段实现后,都会有一个小的总结,还参加了 PR Code Review,学习到了开源我的项目罕用的设计模式、SPI 和结构设计等。能够说是学到了优良的编码习惯和思维形式。
参加到开源我的项目中并奉献本人的一份力量并没有设想中的难,凡事不要太焦急,一步一步、好高鹜远的稳步前进,每天都要有点播种就会一直的成长,开源我的项目中的大牛很多,参加开源会使本人变得更加谦卑,还会让本人的思维变得更宽阔,不会局限于自我。
出色完成工作所带来的成就感,切实是种难以言喻的贵重体验。还有什么更好的抉择能比退出开源我的项目带来更为广大的平台?为开源我的项目作出贡献可能让你领会到从无到有构建成绩的满足感,并因而失去抵赖与感谢。必须抵赖的是,领有开源软件奉献经验可能让咱们的简历变得光彩照人。而敌人们恰好都在应用这款软件,由此带来的激励成果要远远超过每天干燥实现的业务利用代码。这种感觉很赞,真的很赞。
导师的帮忙 -Mentor’s help
季敏 (slievrly)前辈是我的导师,从学习 Seata 到第一次提交 Seata pr 期间,前辈总是很急躁地答复我的每一个问题,即便是在他比较忙的时候。有时会本人会问一些比拟白痴的问题,他总是仔细的给我指点迷津、点出问题所在以及为什么会导致这个问题;有时遇到一些技术方向的问题时,前辈也会给出具备指导性的意见。能够说,始终是他推着我后退,因而在这里感激前辈的急躁领导,同时也感激社区 张嘉伟 大佬、陈健斌 大佬、钟正涛 大佬在我的编程之夏之旅中提供的帮忙。
总结
目前 Seata 曾经是 Github 上一个大热的我的项目,Seata 社区十分沉闷,并且在疾速更新迭代。我的项目的技术思维是好的,分布式事务的模式也不止一种,使用方便、高效。本文次要探讨了 Seata 联合 antlr 实现 sqlparser 方面的相干内容,如果有对 Seata 我的项目或是对 sqlparser 方面、antlr 畛域相熟感兴趣的敌人,期待你们退出 Seata 社区一起交流学习!置信 Seata 会成为万众瞩目的分布式事务解决方案。