一、网关概述
网关的出现可以说是互联网产品技术发展到一定阶段自然演进的产物,大体来说,网关从诞生到形成当下大家熟悉的形态,大体经过了下面的几个发展阶段。
1.1 硬负载网关
在早期 web 应用中,大多数互联网产品使用远未达到今天的规模,所以企业在应用部署上对网关的职能并无太高要求。基本上来讲,只要网关能满足从域名解析到 IP 地址背后的服务代理即可,即所谓服务代理转发。有必要的话,还需满足服务的负载均衡。那个时代,诸如 nginx 这类软负载均衡软件的出现时机尚未成熟,所以很多企业选择类似于 F5 这类硬件设备作为第一选择,也就是基于 web 应用下的硬负载网关。这时候网关职能简单,从部署到使用的流程也简单。
1.2 软载网关
随着互联网产品的使用规模越来越大,技术、网络、服务器等基础设施的完备,传统硬负载网关的使用成本,维护成本越来越高。加上这类硬件设施在面对层出不穷的新问题时,开始显得力不从心,以 nginx 为代表的软负载均衡软件开始规模化应用。软负载网关的好处是明显的,以使用成本低,部署简单,灵活性强,可移植性好等众多的优势逐渐替代传统的 F5 这类硬负载网关。
同时,nginx 网关在面对更加复杂的互联网场景时,也逐步开始支持集成更多外部的插件提供快速易用的解决方案,从而逐渐取代传统的硬负载网关。更重要的是,nginx 代表的新型网关开始在微服务化的架构体系下逐渐呈现出新的优势,比如可以对 API 资源可做定向的路由规则配置,轻量化的负载均衡等。
1.3 微服务网关
移动互联网时代让众多的互联网产品被推上流量的风口,这种情况下,以微服务架构为主流的形态流行起来。一个对外提供服务的应用系统来说,背后是少则几个,多则几十个甚至上百个微服务的共同协作,其实就是不同微服务之间 API 资源的复杂的调用,通过 API 传送不同业务数据促使一个业务流程的正常运转。
面对越来越复杂的业务场景,微服务架构面临的一个新问题就是对 API 的治理,而 API 治理中的一个比较大的痛点就是如何对 API 纳入统一的管控,这包括:服务发现,服务治理,认证鉴权,灰度发布,流量监控,限流降级等,说到底,API 作为互联网企业最宝贵的服务资源,企业需要积累起统一管理这些分散的 API 资源能力从而让 API 更好的输出自身的价值,在这种情况下,微服务网关就应运而生。
1.4 云原生网关
从 2016 年开始,容器化技术开始走进互联网技术圈,容器化这个名词以 docker 为代表的出现开始在不少互联网公司尝试并加以运用。而经历了移动互联网的高速发展,容器化技术的深度使用让人们看到了它的优势,以及为企业的生产带来的价值增长,于是以 k8s 为代表的新一代云原生技术架构开始统治市场,成为一种既定的行业标准。
在这种情况下,微服务架构模式下的应用亟需开始布局产品从传统的微服务部署模式到支持云原生部署模式的转变。而微服务网关作为整个微服务架构下非常重要的基石服务,可以说是打头阵,庆幸的是,为了解决很多企业对于网关适配云原生下的部署架构,开始陆续出现很多新型的支持云原生部署模式下的网关,以 k8s 中 ingressController 为代表的云原生网关,事实上逐渐成为一种标准和接入规范。云原生网关以面临的场景更复杂,需求更加多样,定制程度更高,且对流量的管控更苛刻为特点,逐渐为人们认识,作为接下来微服务架构的治理转型和部署演进趋势,不少互联网公司对此进行提前的布局。
二、API 网关演进历史
通过上面的介绍,对网关的作用有了基本的认识,在产品的部署架构上,不管是哪种网关,说到底都是为了解决对底层 API 资源的访问做到精细化,透明化,合理化的访问控制,接下来聊聊作为应用服务最重要的资源入口,API 网关的发展历史。
2.1 API 网关来源
网关对于任何一个互联网产品来说都必不可少,作为系统架构最底层也是最宝贵的 API 资源,在面临复杂的外部环境时,对 API 资源的保护也成了架构规划和治理中的重中之重,通常来说,对于一个生产系统的 API 来说,常用的保护措施如下:
- 反向代理,隐藏真实的 API 路径;
- 对入口的热点请求 API 统一限流;
- 防刷监控告警;
- API 访问授信,访问鉴权;
- ...
经历过互联网项目早期开发的同学,比较快捷且简单的办法是在项目中写一段公共程序,在这段代码中对过来的请求 URL 进行鉴权,鉴权通过,才允许对 API 进行访问,对 API 的限流保护也是做类似的操作,但是这样的做法问题也是明显的,
- 鉴权或限流的业务与主线业务耦合严重,给后续的拆分埋下了技术难点;
- 难以对 API 资源的统一管控做精细化管理;
- 架构扩展困难,当系统流量上去之后,鉴权或限流逻辑容易成为系统瓶颈;
- 支撑的后续业务场景容易受到制约;
- ...
举个简单的例子来说,假如说一开始能够预知某个 API 后期被调用的频率很高,提前对该 API 做限流,但是随着业务的增长,更多的 API 需要限流,这就需要项目代码中不断做调整,设想如果有一个公共的可以实现流量管控的地方统一管理,这个问题岂不就迎刃而解了吗?这就是所谓 API 集中治理的痛点。基于这个痛点,API 网关就产生了。
2.2 nginx 统一 API 路由
nginx 的出现和大规模生产实践可以说为 API 资源的统一治理奠定了重要的基础。在大多数场景下,nginx 主要作为服务端 API 的反向代理服务器,统一管控服务端的路由地址列表,相当于是 API 服务网关。
如下为一段使用 nginx 配置后端服务的反向代理路由配置,相信稍有经验的同学应该不陌生,这样做带来的好处也是明显的,不仅对外隐藏了真实的 API 地址,起到了一定的安全保护作用,同时也提供了一个统一的对外流量访问入口,从这个角度来看,nginx 在这里,承载了一个作为 API 网关的角色。
server {
listen 9001;
server_name www.abc.com;
location /user {
proxy_pass http://platform_user/user/;
}
location /manage {
proxy_pass http://platform_manage/manage/;
}
}
2.3 微服务可编程式网关
尽管 nginx 功能很强,可以发挥系统对外的网关作用,但是不难发现,在微服务架构体系下,nginx 能够发挥的作用依然是有限的,具体来说,当出现如下场景时,使用 nginx 网关就很难处理:
- 对请求来源的身份进行识别,即请求的认证鉴权;
- 对平台内部应用的请求频率做定向定量的分析;
- 对不同来源的请求进行日志审计,并接入告警监控;
- ...
类似的场景还有很多,此时像传统网关 F5 或 nginx,在应对这类场景问题的解决上就显得力不从心了。究其原因,微服务架构下看似众多的服务模块属于一种松散的“耦合”聚在在一起,服务之间大多数情况下是处于一种相对“无状态”的模式下,这种情况下,要解决上面这些场景的痛点,无疑需要在整个微服务架构之前,架设一道应用级的 API 网关,即所谓的可编程式的 API 网关,比如在微服务技术解决方案中,出现了很多可编程式的网关,像 springcloud 中 zuul,gateway 等优秀的可编程式网关,可编程网关的优势更加突出,主要具备如下特点:
2.3.1 路由配置规则更丰富
相比 nginx,可编程式网关在路由规则的配置上灵活性更高,动态性更好,支持的场景也更丰富,学习成本更低等特性。
2.3.2 支持编程式扩展
可编程式网关相比传统 nginx 等网关最灵活的一点,莫过于可根据业务的需求通过编程的方式实现功能的快速扩展。比如说,现在需要对某一类的请求进行风险识别,如果是 nginx,尽管现在可以通过集成其他插件进行编码,但这个成本是相当巨大,而且给后续的运维带来了高昂的代价,而这个需求在编程式网关中可以说是非常简单了,支持主流的编程语言,只需简单的几行代码,不管是开发,运维,测试等人员,都可以快速的做到。
2.3.3 支持高度定制化
一种技术在选型阶段时,一个重要的考量指标就是这种技术是否能满足很多复杂的定制化场景,以限流来说,nginx 能够提供的限流解决方案是很有限的,譬如对来源 IP,网段,黑白名单中特定 IP 源,或请求参数等场景,但涉及到更高级的限流,比如对热点请求限流、特定应用限流,甚至具体到 API 级别的限流场景时,nginx 这类网关就显得力不从心了,而这些带有定制化场景下的限流解决方案,是需要通过定制化的编程才可能完成。
2.3.4 支持API的动态治理
服务治理说到底具体表现就是对服务的 API 治理,利用可编程式网关的能力,架设 API 网关服务,在网关服务中,可以对 API 资源做更加丰富的场景化,模块化,定制化,生态化的治理,比如在分布式 API 链路追踪与监控还不够成熟的情况下,通过接入 API 网关,在 API 网关中通过编码的方式监控所有的入口请求,就可以做到对 API 调用的实时监控,甚至对恶意请求进行风控、告警,为后续 API 级别的热点请求做限流提供数据的可观测性支持。
三、云原生网关
从云基础设施的逐渐完善,到云原生技术的规模化实践,越来越多的厂商开始拥抱云技术带来的变更。以 k8s 生态为代表的云原生技术被越来越多的人接受,并在自身的产品中进行尝鲜探索。这其中,作为流量的入口,云原生网关的出现逐渐弥补并充实了云原生技术生态在统一流量治理方面的难题。如下为近些年比较流行的云原生网关 apisix 的典型应用场景图。从图中可以看到,云原生网关深耕于当下流行的 k8s 云原生技术,利用自身的产品化优势为微服务进行 k8s 的生产实践扩展新的配置使用入口,这也是典型的云原生网关的特点。
而随着云原生技术的不断演进和需求的增长,现在陆续出现了很多不同的网关产品,有基于 NGINX 的,有基于 Envoy 的,还有很多新的基于 Golang 的网关产品,云原生的发展给网关提出了新的要求,具体来说,作为云原生网关,至少需要具备下面的特点:
3.1 能够实现配置规则的热加载
使用过 nginx 的同学应该不陌生,如果需要给 nginx 配置新的路由访问规则,配置完成后,需要重启 nginx,规则才能生效,这在大规模生产环境下可以说是一个长久以来一直没有很好解决的难题,随着微服务应用的增多,服务的配置变更可能非常频繁,每秒甚至都有几十甚至上百个配置规则需要配置,在这种情况下,重启 NGINX 将不可避免的带来服务的短暂性不可用的尴尬情形。所以,云原生网关需要解决的首要问题就是如何实现配置规则的热加载生效。
3.2 能够实现集群化管理
我们知道,nginx 集群的搭建需要借助其他的中间组件,而且在实际运维过程中,nginx 集群并不是很友好,其实是具备相当的人力成本的,尤其是在对 nginx 集群的管理中,一个让人头疼的地方就是同样的配置规则需要在多处进行修改。假如说,能够方便地修改一个地方,然后所有的控制流量 API 网关都能够生效的话,这就大大解放了人力,所以云原生网关需要具备这样的能力,方便开发和运维人员能够方便的通过网关实现集群化管理。
3.3 能够支持二次定制化场景开发
作为 API 流量的入口,控制着所有入口的流量,不管是传统的 API 网关,还是云原生网关,都应该具备流量治理能力,流量治理说到底就是网关需要能够结合实际业务的需要,比如针对不同的语言,不同的协议,能够快速的进行简单的二次开发,以满足众多的个性化场景,像 Apisix,Kong,Higress 等云原生网关产品,都已经初步具备二次开发能力。
3.4 具备优良的性能
尽管 nginx 在云原生网关的场景下看起来有些不合时宜了,但是 nginx 作为一款经久不衰的反向代理和负载均衡服务,性能方面可以说是很高的,而云原生网关的出现,尽管弥补了 nginx 在其他方面的不足,但归结到现实的产品落地使用时,性能是否足够优秀仍然是考验网关的第一标准,如果牺牲了网关的性能,最终也很难经受住市场的考验。
3.5 支持插件化扩展
不管是从开发还是运维的视角,一款优秀的软件之所以能够保持长久的生命力,一个不可忽视的因素就是该软件的生态圈是否足够大。以编辑器 vsocde 来说,从早期的文本编辑功能,到如今集成并支持成百上千个内置可扩展的插件单元,让 vscode 在行业内始终保持很高的竞争力,类似的 Jenkins 也不例外。
随着微服务技术生态的扩展,各种与微服务相关的中间件层出不穷,以服务注册中心来说,大家熟悉的 zookeeper,eureka,consul,nacos 等,众多的中间件让微服务技术架构在选型时有了更宽的视角,说到网关,试想如果一款云原生网关无法兼容对市场主流的 API 鉴权组件,API 限流组件,服务注册组件等,那么在未来注定被抛弃,而插件化的模式也逐渐被很多云原生网关产品所吸收并使用,利用插件化的技术,开发运维人员可以很方便的根据场景的需要,快速接入新的外部组件到网关中,适配个性化的场景。
四、微服务网关发展趋势
4.1 趋势一:支撑丰富的插件化生态
插件化趋势已经在不少应用软件领域取得了卓有成效的效果,插件化模式的好处是显而易见的,为了让更多的技术开发者,开源生态技术快速融入你的应用,插件化是一个快速、高效的体验模式,比如当你需要在 jenkins 上快速体验某个新功能时,无需多想,去应用市场中搜一把再说,几个点击的动作就可以完成技术的尝鲜。
对于网关来说,技术选型阶段,抛开那些必备的功能性技术点,是否具备快速接入接入市场主流的技术栈,满足用户复杂多样的使用场景,也是一个极其重要的考虑因素。以云原生网关 apisix 来说,经历了市场多年的沉淀,从部署上,支撑裸机部署,容器化部署,k8s 部署,从使用上,支撑 api 规则配置,可视化界面配置,在与微服务架构的对接使用中,apisix 与 springcloud-alibaba 等众多开源的组件进行无缝融合,这样一来,使用 apisix 对微服务在进行云原生的部署中也可以很好的实现无障碍跨域,这对技术架构选型无疑是一大亮点。
4.2 趋势二:统一 API 标准,向云原生微服务架构演进
随着云原生技术的迅猛发展,云原生网关大有统一并取代微服务网关的趋势,众多的互联网厂商也是看到了这一点,开始布局云原生网关,以期在云原生技术的实施落地中抢占制高点。
前面提到,作为微服务架构中最底层也是最核心的 API 资源,可以说是整个云原生架构的基石,不管未来云原生的商业化运用以何种技术呈现,API 的标准实现规范仍旧是最根本的。基于一套 API 可以有不同的实现,既让用户不被具体实现锁定,又可以桥接技术演进的鸿沟。或许有一天 K8s 会消失,docker也不复存在,但面向抽象的 API 标准定会长存。
在流量网关领域,尽管发展到今天,Ingress API 已经成为标准,但是对于微服务网关等更复杂的使用场景,Ingress 受限于其简单的协议字段,需要通过 Ingress 注解等方式进行能力扩展,现阶段来说还很难被标准化。因此诸如 Contour、Emissary、Kong、APISIX 等都开始定义自己的 HTTP 路由等 CRD,这就是说,从当前的现状来看,微服务网关的 API 定义开始呈现碎片化的模式。
这一背景之下,Gateway API 标准应运而生,并且在过去的一年里已经从 alpha 演进到了 beta 阶段。虽然目前 Gateway API 还未最终定稿,涉及到的标准协议仍会发生变动,不建议用于生产,但 API 统一趋势已经不可阻挡,不过是时间问题了。
下图是使用Gateway API 的一个用例场景,不同于 Ingress API,将集群运维和业务运维的职责进行了划分,这样业务开发人员不再需要关心网站证书等集群级的细节,只需专注业务本身的 DevOps,集群运维任务可以交给 SRE 人员进行统一处理。
而采用三合一的架构后(下图所示),可以显著降低成本,同时提高系统整体可用性,水平动态扩展性。这也符合 DevSecOps 的微服务演进趋势,微服务开发者可以更多地从业务接口视角关注安全性,而不是在每一层做过于繁琐的安全防护措施以增加系统的复杂性。
五、写在文末
网关作为应用系统的流量防卫兵,可以说在保障整个系统的稳定运转过程中发挥着不可或缺的作用。不管未来的技术形态如何演进,不管是否能出现云原生架构全面取代传统的部署模式,可以确定的是,微服务网关的持续性规划和建设对于一个互联网公司来说,都是一项值得长期投入的工作,可以预见的是,在不久的未来,网关将以特殊的角色扮演,在企业系统对外提供产品服务价值的基础上发挥不可估量的作用。