云原生时代,API 网关为何如此重要?( 二 )

以 Apache APISIX 为例,下面的架构图,诠释了以上两个创新:

云原生时代,API 网关为何如此重要?

文章插图

云原生时代,API 网关为何如此重要?

文章插图
云原生时代下的挑战
过去十年,IT 领域最大的技术变革就是云原生 。诞生于 2013 年的 Docker 拉开了云原生的帷幕,从此裸金属、虚拟机开始被容器所替代,单体架构开始被微服务所替代 。但是云原生并不是简单的技术革命,其背后的推动力主要来自互联网产品的快速发展和激烈竞争,云原生相关的技术生逢其时,迅速流行并替代了之前的很多技术组件和方案 。
具体到 API 网关在云原生中的挑战,主要来自以下两个方面:
单体架构到微服务的转型
在微服务架构逐渐被开发者认可和落地后,该架构释放了巨大的技术红利:每个微服务可以按照自己的节奏进行升级和发布,不需要担心与其他服务的耦合 。产品的迭代因此变得敏捷,每天都可以进行几十次甚至几百次的发布 。
但与此同时,微服务的发展也带来了一些副作用,比如:
  • API 和微服务的数量从最初的几十个,增长到几千个,甚至几万个;
  • 出现故障时如何快速定位是哪一个 API 引起的?
  • 如何保证 API 的安全?
  • 如何做到服务熔断和服务降级?
API 网关无法独立解决安全性、可观察性、灰度发布等问题 。它需要与 Prometheus、Zipkin、Skywalking、Datadog、Okta 等众多开源项目和 SaaS 服务合作,为企业提供更好的解决方案 。
动态和集群化管理
容器和 Kube.NETes 的普及,让动态成为所有云原生基础组件的标准特性 。在 Kubernetes 的环境中,容器在不断的生成和销毁,弹性伸缩成为一个必选项而不是可选项 。
想象一个场景:一家互联网电商公司做了一次促销,大量的用户在一个小时内涌入,促销结束后就会离开 。对于传统架构的公司来说,他们需要事先采购一批物理服务器,来应对这些高峰时候的 API 流量;但是对于云原生架构的公司来说,就可以随时使用公有云上的弹性资源,根据 API 请求的数量,自动的调整网络、计算、数据库等资源的规模即可 。那么伴随着容器弹性伸缩而来的技术挑战如下:
  • 上游服务不断更换 IP 地址和端口;
  • IP 黑白名单的频繁更新;
  • 【云原生时代,API 网关为何如此重要?】服务健康的及时检测和异常处理;
  • API 的频繁发布;
  • 服务注册和发现的及时性;
  • SSL 证书的热更新和自动轮转 。
想要解决上述这些挑战,均需要依赖于动态 。以 NGINX 为代表的第一代 API 网关,动态能力是非常弱的 。因为 NGINX 是本地静态配置文件驱动的,所以变更任何配置都需要重启 NGINX 服务才能生效,这在云原生时代是不能被企业接受的 。这就是第一代 API 网关的技术痛点之一 。
在中国,有一家类似微软 office 365 的 SaaS 办公软件公司 -- wps,他们有数百台物理机在运行着 Apache APISIX,有近万核 CPU 在处理来自客户端的 API 请求,每天处理数百亿次 API 请求 。
在这个超大规模的 API 网关环境下,开发者不可能去逐个修改每一个 API 网关的配置然后 Reload,他们希望有一个统一的控制台来操作整个集群 。可惜的是,第一代 API 网关诞生的年代,并没有这么大的实例规模,也就没有考虑集群管理的需求 。
云原生时代,API 网关为何如此重要?

文章插图
下一代 API 网关的发展
上述挑战和痛点,逐渐催生了新一代的 API 网关 。
和第一代 API 网关不同的是,云原生时代诞生的下一代 API 网关是在开源社区的驱动下快速成长的 。借助社区和众多开源贡献者的力量,这些 API 网关有机会形成一个正向的迭代和进化:
  • 更快速的收集一线开发者及用户的需求和痛点
  • 在开源项目中尝试解决这些问题
  • 开源项目变得更加好用,吸引更多开发者使用
于是,我们看到下一代 API 网关突破了传统网关的负载均衡和反向代理的定位,而是承担起了 API 和流量的连接、调度、过滤、分析、协议转换、治理、集成等更多的职责 。
云原生时代,API 网关为何如此重要?

文章插图
支持更低成本的二次开发
同时,让开发者能够以更低的成本进行二次开发,也成为了下一代 API 网关的亮点 。集成是 API 网关的重要功能之一,对于下游是协议解析和各种协议的转换,包括 GraphQL、gRPC、Dubbo 等;对于上游是集成 Okta、Keycloak、Datadog、Prometheus 等身份认证、可观测性服务,以及公司内部的认证、日志、审计等服务 。API 网关不可能覆盖集成过程中所有的组件,这时候不可避免地需要开发者通过插件的方式进行二次开发,来满足自己的业务需求 。不同的 API 网关提供了不同的二次开发的编程语言和开发方式,Apache APISIX 和 Kong 都可以使用 Lua 来编写原生插件,Envoy 是使用 C++ 编写原生插件 。同时,Apache APISIX 还可以使用 Go、Python/ target=_blank class=infotextkey>Python、Node、JAVA 和 Wasm 来编写插件,这些主流的开发语言已经可以覆盖绝大部分开发者了 。


推荐阅读