由于PC后台管理系统之前由一名工程师独立开发,因此项目文档几乎为0。随着用户数量的不断增加,DB层的压力也越来越大,用户数量也即将突破500万,预计到了年底用户数量会到达千万级,分库分表势在必行

但分库分表的前提是先把业务理清楚,由于文档的缺失,很多业务逻辑就连项目的开发者本身都忘记了,因此重新梳理业务逻辑的第一步,就是引入一个好用的API管理工具

没有最好的,只有最合适的

纵观目前市面上的API管理工具,最终遴选出:Knife4j、Apizza、YApi,这三者各有优劣,这里简单分析一下

Knife4j Apizza YApi
是否收费 小型团队(2人或以下)免费(功能受限),更大型的团队需要收费(功能完整)
是否开源 阉割版是开源的,收费的版本闭源
实现原理 在swagger基础上,提供了定制的web页面,更符合国人习惯 Apizza是一个独立的项目,专门用于API的管理,官方提供有偿的私有部署的服务 YApi是一个独立的项目,可单独部署在远程服务器,专门用于API的管理
文档地址 knife4j (xiaominfo.com) Apizza 帮助中心 (teambition.com) YApi-教程 (baidu.com)

上述表格是一个简单的横向对比,我们再来详细看看它们的优劣

Knife4j

在很早之前它其实不叫Knife4j,叫做swagger-bootstrap-ui,顾名思义,其实就是将swagger原生的页面进行了替换,更符合国人的阅读习惯

优势

随着Knife4j作者不断的更新迭代,Knife4j也越来越强大,不仅仅是基于swagger,它还在swagger的基础上做了一系列的增强,包括但不限于:

  • i18n国际化:接口文档支持中英文

  • 访问页面加权控制:外部人员不知道用户名和密码,无法查看接口文档的web页面

  • 生产环境屏蔽资源:生产环境屏蔽所有swagger相关资源

  • API全局搜索

  • 支持接口mock

  • 易于维护:凡是跟API文档有关的工作,维护必然是关键性的。假设我们有很多的API请求参数都用到了实体A,但梳理业务之后,我们发现实体A中的n个属性是没有必要传入的,将实体A中无用的n个属性删掉即可,接口文档会自动更新,不需要再去一个个的手动维护

等等一系列增强功能,作为一款不收费的开源软件,我觉得它的功能还是很强大的

劣势

  • 侵入性强:Knife4j底层最终还是依赖的是swagger,它基于注解,因此对于我们接口本身具有很强的侵入性,如果我们想要预先生成请求报文,需要在请求报文对应的实体类上加入对应的注解,因此对实体类本身也有侵入

YApi

YApi是去哪儿的研发团队做出来的一款API管理工具,它跟swagger没有任何关系,因此它不会对我们的API造成入侵,而且它的权限做的比较到位,便于团队管理。和Knife4j相比,它更加重量级,因为它已经是一个单独的项目了,专门用于管理API

优势

  • 完善的权限管理
  • 支持内网部署,部署流程简单
  • 代码侵入性为0
  • 支持高级mock

劣势

  • 项目较重:体量相比于knife4j更重,由于是一个独立的项目,需要专门部署在内网中
  • 学习成本略高:由于是一个单独的项目,且完成度很高,因此开发人员需要付出一定的时间去学习和适应
  • 不易维护:假设我们有很多的API请求参数都用到了实体A,但梳理业务之后,我们发现实体A中的n个属性是没有必要传入的,将实体A中无用的n个属性删掉还不够,我们还需要去手动的修改YApi中涉及到实体A的API的请求报文

Apizza

整体风格仿照Postman实现,易于上手,并且在生成接口文档方面进行了优化,可以在文档之间复用公共资源。一处定义,全局使用,同步更新,缺点是收费

优势

  • 整体风格仿照Postman,学习成本低

  • 文档之间复用公共资源

模型定义
模型绑定

假设我们有很多的API请求参数都用到了实体A,但梳理业务之后,我们发现实体A中的n个属性是没有必要传入的,将实体A中无用的n个属性删掉之后,再更新下Apizza中的模型A的定义就可以了,不需要再去修改一个个的API文档(前提是你的报文已经绑定了模型A)

劣势

收费