我的微服务设计方案

API 网关的选型和持续集成

2019-10-23  本文已影响0人  又小拍

2019 年 8 月 31 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·成都站,APISIX 作者温铭在活动上做了《 API 网关的选型和持续集成 》的分享。

OpenResty x Open Talk 全国巡回沙龙是由 OpenResty 中国社区、又拍云发起,邀请业内资深的 OpenResty 技术专家,分享 OpenResty 实战经验,增进 OpenResty 使用者的交流与学习,推动 OpenResty 开源项目的发展。

温铭,深圳支流科技联合创始人,开源微服务 API 网关 APISIX PMC,OpenResty软件基金会发起人,《OpenResty 从入门到实战》专栏作者,创业之前在互联网安全公司工作了 10 年,主要从事服务端的开发和架构,负责开发过木马云查杀、反钓鱼系统和企业安全产品。曾在奇虎 360 担任架构师,开源委员会发起人、委员。

以下是分享全文:

我和院生在做的一个开源的 API 网关项目叫 APISIX,今天介绍这个项目涉及到 OpenResty 的技术和选型,主要包括三个方面:

API 网关的作用

什么是 API 网关

以 Kong 为例,左图没有 API 网关,但是后面挂了很多服务,如果每个服务都要实现包括认证、统计、安全校验等功能,会有很多重复的工作。API 网关的作用就是把这些公共的东西抽取出来,如右图,下面的这几个服务,每个服务都只关心自身业务相关的东西,和业务无关的东西全部都丢到API 网关上,即 API 网关就是把公共的东西如统计、安全、限流、限速、缓存等提取出来做了一个中间层。

API 网关的传统功能

云原生下的新功能

为什么现在包括 Kong、APISIX 还要把传统的东西再做一遍呢?这是因为在云原生和微服务体系下,用户和技术架构有了一些新的变化:

技术架构新变化

应用

举两个例子,介绍下新的 API 网关是做什么的。

它和 Nginx 比好处很明显,是完全动态来实现的,不管是 Kong 或 APISIX,动态的都是最基本的点。在 Nginx 里面修改任何一个配置文件,都需要 reload 之后才能生效的。我们设想一个场景,用 Nginx 做最前面的路由,做负载均衡,突发的流量来了,此时需要快速地增加很多上游服务器,就要不停地修改 Nginx 配置文件,然后 reload,等突发流量过了之后再把上游的服务摘掉,那么这时候还要再改 Nginx 文件并 reload 。这个代价是很大的,但是你如果用 Kong、APISIX 这种 Web 服务器,就不会有这样的问题,通过 API 可以很轻松地实时修改整个集群里面所有机器上游的配置、动态证书的配置,当然性能会比 Nginx 稍微低一点,但是这个低也是可以接受的,因为它带来了很大的灵活性。现在很多的厂商都是在做这样的替换,不仅互联网公司,还有一些传统企业都在把 Nginx 慢慢地拿掉。

近两年安全领域里很火的概念就是零信任,即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及视频:

API 网关的选型 测试和持续集成

上一篇下一篇

猜你喜欢

热点阅读