2019 年 8 月 31 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·成都站,APISIX 做者温铭在活动上作了《 API 网关的选型和持续集成 》的分享。html
OpenResty x Open Talk 全国巡回沙龙是由 OpenResty 中国社区、又拍云发起,邀请业内资深的 OpenResty 技术专家,分享 OpenResty 实战经验,增进 OpenResty 使用者的交流与学习,推进 OpenResty 开源项目的发展。前端
温铭,深圳支流科技联合创始人,开源微服务 API 网关 APISIX PMC,OpenResty软件基金会发起人,《OpenResty 从入门到实战》专栏做者,创业以前在互联网安全公司工做了 10 年,主要从事服务端的开发和架构,负责开发过木马云查杀、反钓鱼系统和企业安全产品。曾在奇虎 360 担任架构师,开源委员会发起人、委员。vue
如下是分享全文:nginx
我和院生在作的一个开源的 API 网关项目叫 APISIX,今天介绍这个项目涉及到 OpenResty 的技术和选型,主要包括三个方面:数据库
以 Kong 为例,左图没有 API 网关,可是后面挂了不少服务,若是每一个服务都要实现包括认证、统计、安全校验等功能,会有不少重复的工做。API 网关的做用就是把这些公共的东西抽取出来,如右图,下面的这几个服务,每一个服务都只关心自身业务相关的东西,和业务无关的东西所有都丢到API 网关上,即 API 网关就是把公共的东西如统计、安全、限流、限速、缓存等提取出来作了一个中间层。json
为何如今包括 Kong、APISIX 还要把传统的东西再作一遍呢?这是由于在云原生和微服务体系下,用户和技术架构有了一些新的变化:ubuntu
举两个例子,介绍下新的 API 网关是作什么的。segmentfault
它和 Nginx 比好处很明显,是彻底动态来实现的,无论是 Kong 或 APISIX,动态的都是最基本的点。在 Nginx 里面修改任何一个配置文件,都须要 reload 以后才能生效的。咱们设想一个场景,用 Nginx 作最前面的路由,作负载均衡,突发的流量来了,此时须要快速地增长不少上游服务器,就要不停地修改 Nginx 配置文件,而后 reload,等突发流量过了以后再把上游的服务摘掉,那么这时候还要再改 Nginx 文件并 reload 。这个代价是很大的,可是你若是用 Kong、APISIX 这种 Web 服务器,就不会有这样的问题,经过 API 能够很轻松地实时修改整个集群里面全部机器上游的配置、动态证书的配置,固然性能会比 Nginx 稍微低一点,可是这个低也是能够接受的,由于它带来了很大的灵活性。如今不少的厂商都是在作这样的替换,不只互联网公司,还有一些传统企业都在把 Nginx 慢慢地拿掉。api
近两年安全领域里很火的概念就是零信任,即zero trust。在传统的安全领域里面,咱们认为边界防御很是重要,因此会用防火墙对进来的流量作一层校验,这个校验实际上是命中规则的校验,若是是黑的就把它拒绝掉。那么这个时候就会有一个问题:若是一些规则更新不及时,它就能够穿越防火墙,之前的安全更可能是基于边界的防御,过了边界内网是能够畅通无阻的。浏览器
可是零信任网关能够完全解决这个问题,它认为全部的流量都是不安全的,之前的边界防御是非黑即白。如今的零信任安全网关则是非白即黑,你不是白的,那么你就是黑的,因此它是彻底基于身份来认证的。一个 API 的请求过来会到身份认证的服务器,第三方的身份认证厂商好比 Author0、OKTA 的身份认证服务器认证你的身份,身份认证过了,请求才能够经过,否则就直接拒绝掉,这是是安全领域的一个趋势。
全部企业用户的最大需求都是:不要锁定用户。API 网关是整个流量的入口,不能把用户锁定在里面。好比你用了阿里云的 API 网关,其实你就已经被它锁定了,由于它是流量的入口,你没有办法分发到其它云厂商上。此外还须要可回退,我使用了这个API 网关,好比原来是 Nginx,我能够很轻松地回退过去,这也是咱们在作 APISIX 会考虑到的。可能用户以为用了一段时间不爽,想退回 Nginx,咱们也能够支持这种能力。
APISIX 虽然每月的迭代很是快,每月有 200 多个 commit,有 10 个左右大的功能,可是 APISIX 里面有一个叫 core 的目录变化是不多的,咱们会保持它的核心是稳定的。功能迭代能够很快,可是核心很稳定。
不管是国内仍是国外的企业,都没有办法拿产品去适应全部的需求。若是你适应了全部的需求,那么你就作成了一个巨无霸,会是个很大很杂的产品,它的性能、可扩展性就会降的很低。因此咱们就有插件,若是你须要有个性化的东西,就去定制本身的插件,须要什么功能就把这个插件放上去,不须要就把它拿掉。我能够保证最下面核心层是很稳定的,上面那层能够根据用户需求定制。
这个是咱们选型的思路,咱们作选型并非先从技术上去作,而是先看整个行业,Gartner 的报告能够做为参考。如上图所示,谷歌、IBM、RedHat 等头部玩家吃掉全球大部分 API 市场,虽然技术圈都知道 Kong,但它其实处于远见者的地位,此外Kong 做为新兴的玩家仍是第一个将自身 API 网关开源出来的。
Gartner 的报告更偏商业化,能够在此基础之上参考开源社区中云原生软件基金会CNCF 维护的全景图,不少开源和闭源项目都被其分层、分功能地罗列出来。全景图中云原生领域有十几款软件是作 API 网关选型时能够选择的,其中有一半是大厂的产品,如 3SCALE 是Red Hat 的产品,剩下的 Kong、APISIX、TYK 等是开源项目,若是要作 API 选型能够在其中作选择。
在参考 Gartner 报告和 CNCF 全景图以后,咱们比较了主流的 API 网关,决定不用已有的 API 网关而是要本身作一个。
apigee 是最大的玩家,其优点在于全生命周期,即从 API 设计、开发、文档、测试以及上线等所有是谷歌全家桶。但 apigee 是闭源项目,没法进行定制化开发,并且是被谷歌云锁定的。
Kong 解决了 apigee 的痛点,既不会锁定也支持自定义开发,但 Kong 是 2015 年开发的,当时是把数据都放在Postgres 比较重的关系性数据库里,代码繁杂,性能存在问题。Kong 的优点在于产品思路好,方向看得准。
APISIX 借鉴 Kong 的思路,选型时彻底基于 etcd,将全部的数据都放在 etcd 里面,完成 Kong 在postgres 上作的大量重复代码,例如消息分发、高可用和可扩展性都是基于 etcd 进行,操做更加简单。APISIX 的不足在于开源时间短,从 2019 年 6 月 6 号开源到如今还没有经受大用户的检验,但优点明显:二次开发难度比 Kong 小不少。以限流限速功能开发举例, 在 APISIX 的文件里增长六七十行代码就能完成,但 Kong 则须要修改五六个文件、两三百行代码。
API 网关的核心组件:
选型原则:作云原生友好的、高性能的、开源的 API 网关
APISIX 的选型
APISIX 独有的功能
大公司都有专门的 QA 团队作测试,开发部门只须要写完代码简单自测后提交给 QA 团队。但开源项目没有 QA 团队,甚至连开发团队都是兼职,此时就必须用自动化的测试,即测试驱动开发的方式才能玩转开源项目。
OpenResty 的开源项目将近 70 个,其商业公司有将近 100 个闭源的项目,总共将近 200 个项目不到 10 我的维护。若是手工测试,那就什么都作不了,因此要想办法实现解决这个问题。
刚开始较慢,由于开发完一个新功能须要一块提交对应的测试案例,不然PR 不会被合并。例如给 OpenResty 贡献一个功能却没有提交对应的测试案例,或者提交了测试案例但不全,无论功能写的有多好,此PR 必定不会被合并,由于破坏了整个开源项目的原则,测试须要是自动化跑起来的。
APISIX 多引入一个条件,即代码的覆盖率不能低于70%,如今已经改成不能低于 80%。若是你的改动引入新代码,也增长了测试案例,可是下降了原有测试案例的覆盖率,那也不能被接受合并。
测试案例彻底基于 test:nginx ,能够认为 test:Nginx 是一个小语言或者一个DSL,文档较少,学习门槛比较高,我和院生对它比较熟悉才彻底基于此进行测试。
Luackeck 很是好用,能够用于 Lua 和 OpenResty,提供有几个参数进行选择,还可使用春哥写的 lua-relang。咱们是两个程序都跑起来作代码风格检测,以确保无论是新的提交者仍是咱们本身的代码风格的一致性。
代码覆盖率检测使用luacov,这是标准 lua 的一个功能,能够将代码覆盖率跑起来。
合并 PR 是在上述测试即 test:nginx 测试、代码风格测试、代码覆盖率测试都跑过的前提下进行,每个月 6 号发行新版本时进行性能测试,比较新老版本之间性能的差别。通常会跑火焰图,同时按期作fuzzing 测试,混乱输入如 uri、args 等作压力测试。毕竟 APISIX 是一个 API 网关,做为流量的入口要保证足够的稳定。
测试不能依赖于人,不然总有一天会跑不下去。那么如何让单元测试、性能测试、代码风格检测等测试不依赖于人稳定地运行呢?
查看演讲PPT及视频:
本文由博客一文多发平台 OpenWrite 发布!