Comellia

Yapi

YApi 是百度去哪儿网开源的一个接口管理平台。

官方介绍:

YApi 是一个可本地部署的、打通前后端及QA的、可视化的接口管理平台

该项目几乎由 100% 的 JavaScript 编写完成(当然还有 CSS),后端使用 Koa 作为 web 框架和 Mongoose 作为数据持久层框架,所有动态数据都存储于 MongoDB 中。前端使用了 React 和 Antd,还有去哪儿网自研的基于 Webpack 的打包工具 ykit。Github 上的第一次提交是在 5 年前,截至目前共有 5802 次提交,有 80 位贡献者参与。覆盖的功能包括基于分组和项目的权限管理、可视化的接口设计、接口调试、接口 Mock、支持自定义脚本的高级 Mock、自动化接口测试、从 Postman、Swagger 等格式导入导出数据、开放API 等。在社区的支持下,有 SSO 登录、代码生成、Spring 项目自动生成接口文档等等插件。在失去主要维护一年多后,目前 Github 仓库有 25.4k 的 Star。

所以,这不是一个简单的项目。

接口管理对 Web 应用开发是非常常用的功能,我知道很早以前大家用 Word 写接口文档,后来用 Markdown、Swagger 等文本格式,之前也有几个开源的可视化接口管理系统,但大都没有很好的维护了。

目前市面上的接口管理系统,大都包含了以下这些功能:

  1. 可视化接口设计;
  2. 接口调试;
  3. Mock 调用;
  4. 自动化测试及压力测试。

目前商业化做得最好的,当然也是闭源的,有以下这些:

  • Postman (国外的,貌似接口设计这块儿不是其主要功能)
  • Apipost (国内的,SaaS 版免费,但企业内网部署收费)
  • Apifox (国内的,同上)

我知道上面这些在商业上确实做得都不错,至少拿到了很可观的融资。功能体验上,也确实比 YApi 要好很多。我不得不服商业公司的持续开发能力。

但这么多功能普通开发者能用到多少呢?对于我来说,Postman 只用来调试接口,它的团队协作功能放在那里就很鸡肋。而另两个国内的SasS平台,虽然也有桌面客户端可以做和 Postman 一样的事情,接口设计也很强,但貌似用户的数据也会强制上传到他们的服务器。

而 YApi,它的界面简洁,操作方便,容易部署,代码开源,和 本地的 Postman 搭配,可以很高效地完成大部分工作。对我来说,已经足够好了。

但是使用 YApi 也有些令人头疼的问题。其中最大的就是失去官方维护后的安全性隐患。比如去年的远程命令执行漏洞就导致我司自建的 YApi 服务受到攻击,因为我没有用 Docker,木马感染到了主机上,最后不得不回滚磁盘。除此之外,前端界面也有一些小的 Bug,比如添加参数字段时无法在上方添加。还有意想不到的登录过期,在你花了十几分钟设计了一个复杂的接口准备保存时,登录失效自动跳转到了首页,让人崩溃。

当然,我是一个程序员,我可以通过改 YApi 的源代码解决这些问题,所以我把它的代码下载了下来。在我试图本地运行时又遇到了问题。

YApi 开发时用的 Node 版本是 7.6.0,而现在 Node 的 LTS 版本是 18。当然大部分依赖在高版本的 Node 下是可以运行的,直到遇到坑爹的低版本 node-sass。node-sass 依赖的 node-gyp 需要的编译环境在新版本的 Node 下是跑不了的,那么试着升级版本吧。不行!因为 Webpack 插件不支持更高的版本。那我升级下 Webpack 的版本吧。哦,它好像用的不是原生的 Webpack,是自己的 ykit 呢。

到这里,心中一股怒火的我萌生了一个大胆的想法。要不是用最新的技术栈重写一下吧。而之后,我又有了一个更加大胆的想法。仍旧用 Node 和 JavaScript 写多没劲了,不如 Rewrite in Rust

我梳理了一下 YApi 的所有功能,看起来没有很复杂的。然后梳理了主要的接口,大概也就三四十个。后端看起来还行,前端到时候大不了就照着抄呗(前端我确实不敢用 Rust 和 Wasm 重写,暂时)。

到目前为止,这仍是一个 CRUD 的项目,Rust 确实不是非常好的选择,我大可以选择 Node、Go、甚至 Java,遇到的坑肯定会少很多。我选择 Rust,除了是希望在学习了这门语言之后练下手外,还考虑了以下因素。

  1. Rust 可以实现技术栈的完全统一,即前端改为 Rust + Wasm 实现;
  2. Rust 可以方便的使用 Wasm 支持更安全和强大的 Mock 脚本;
  3. 可以使用 Tauri 把前后端一起封装成一体的桌面应用;
  4. 当然,还可以为使用者节省几十兆的内存。

我没有真正的开源项目维护经验,虽然之前考虑过、尝试过很多方向,但都无疾而终。我也许再次尝试仍然会中途放弃,但我希望每次可以走得更远一点。

技术可以发挥的场景浩如烟海,开源世界的造物也如夜空中的繁星一样璀璨。我不具备足够完善的计算机基础素养,我的数学不好,不懂计算机底层原理,也没有足够强大的头脑和毅力。甚至,我也不再年轻了。但我想,我也不是很老嘛。

Rust 是一门入门比较难的语言,它也许永远不会像 Java、Python、Go 一样流行,但是我喜欢它。我喜欢它给我带来的力量感,我能够去看用 Rust 实现的数据库系统的源码,也知道 Rust 可以编写动态语言的解释器,可以写操作系统内核,可以开发嵌入式,而且性能一点都不寒碜。它给了像我这样一个 CRUD 程序员可以想象的空间。

这个项目就叫 YApi.rs 吧。

目前它已经完成了一部分。而随着开发的进行,我意识到这个项目比我预想得要复杂,而且有更多非常枯燥算不上酷的工作。我希望有人可以帮我完成一部分前端的工作,但我其实也不用着急。

慢慢来吧。

Dev Tools