vlambda博客
学习文章列表

​API网关与服务网格

Service的短板

Service支持的四层网关主要承担网络接入的职责,通过对负载均衡设备的整合,实现外部客户端到集群内部的路由和网络转换。

  • Service支持TCP和UDP协议。对HTTP2或GRPC支持不够友好

  • IP+端口模式,运维不够友好

  • 安全性,不支持HTTPS

  • 健康检查,自身不具备健康检查功能,只能依赖其他组件

API网关

API网关是一组微服务提供统一API访问的组件,基于不同场景,使其承担的职责从单纯请求转发到安全保证、流量控制、可观察性等高级功能。其协议转换功能使得散落部署的异构的微服务系统在API层面统一起来。API网关本质上是一组专门用于网络请求转发的应用服务实例,作为集群的入站流量入口,API网关将各系统对外暴露的服务聚合在一起,所有调用这些服务的系统都需要通过API网关进行访问,基于这种方式,网关可以对API进行统一管控,例如认证、鉴权、流量控制、协议转换、监控等。

智能路由

智能路由是 一组微服务的唯一访问入口,负载均衡是API网关的最基本的功能,用户访问统一的API网关入口,再基于请求Header进行“L7规则”匹配,并由API网关选择上游服务,以及状态健康的实例。基于路由和负载均衡这两个基本功能,API网关就可以提供高级的灰度发布功能,管理人员就可以通过设置规则将请求转发至应用的不同版本。

安全保障

API网关提供TLS Termination功能,当用户通过API网关调用服务时,HTTPS请求首先被API网关处理,再由网关发起新的HTTP请求到上游服务器。

流量控制

在微服务系统中,微服务之间的依赖关系非常复杂。在 极端情况下,单个服务可能会导致整个生态系统不可用。为避免此类情况的发生,每个微服务都需要考虑两件事:如何自我保护,以及如何不把上游“压垮”。限流规则可以使微服务设置自己能接收的最大请求数,超出的请求会被直接返回,保护自己不被过量请求压垮。熔断规则使得微服务可以设置自己访问上游服务的最大并发数,防止把上游压垮,缓存机制可以进一步减少对上游请求的压力。

可观测性

API网关作为流量入口,可以提供统一的日志、Metrics和Tracing解决方案

可管理性

API网关离不开控制平面(Control Plane)组件和数据平台组件(Data Plane)。在网络管理中,控制平台组件是指控制数据如何转发的组件。Kubernetes管理组件、API网关的模型抽象和对应的控制器组成了控制平台组件。业界基于kubernetes的成熟控制平面组件方案包括轻量级API网关方案kubernetes Ingress、VMWare Contour及istio。这些组件可以自动化生成反向代理软件的配置文件,完成数据转发。反向代理软件包括Nginx、HAProxy、Envoy等,用于转发网络请求,因此也被称为转发平面(Forwarding Plane)组件或数据平面组件。

以社区的ingress为例,kubernetes中定义API网关的路由转发功能的对象是ingress,其实现需要配合ingress controller和对应的代理软件。(这里有点绕,也就是我们平时说的一个ingress对应多个ingress controller的意思)

ingress与服务网格的差别

     API网关与服务网格的功能对比

     

API网关 服务网格
处理南北流量 处理东西流量
将服务发布至集群(或私有网络)外部供外部客户端访问 集群内部服务之间互相访问
将外部请求转换成内部请求 内部服务代理
针对某一业务功能发布可供访问的API 处于应用和网络之间,业务功能内部微服务之间

在此种部署模式下,微服务和微服务之间都有调用关系,所有调用关系都经过API网关,最终的调用链如图所示:

此种模式存在如下缺点:

  • 额外的网络跳转:通常应用的部署模式是,一个业务流的所有相关的微服务会部署在同一集群中,这样微服务之间的调用就在同一集群或数据中心内部的网络中就完成了,业务会有更低的网络延迟,然而API网关的存在,使得所有的微服务调用从集群内部先转发到负载均衡器,再到API网关,最后转发给目标服务。这些额外的跳转增加了网络延迟和超时出错的概率。

  • 负载均衡和API网关的设备及管理成本投入:所有流量都要经过负载均衡器,如果微服务之间的传输流量较大,那么对负载均衡设备的需求也会很大,因此需要更多的API网关类负载流量。更多的设备也就带来了更多的管理成本。

  • 错误域的控制:API网关是集中部署的,是整个集群的通用服务。如果API网关出现故障,则所有微服务都不可用。因此,在生产系统实践过程中,我们需要考虑对错误域的控制。有时需要根据不同的业务域划分API网关,以减小影响。

​API网关与服务网格

那么如何优化部署以减少对API网关的依赖呢?答案就是:使用服务网格。

服务网格是一个可配置的,低延迟的网络架构,与API网关的功能有很多共通性,两者都需要处理服务发现、请求路由、认证、鉴权、限流、监控等等。

两者之间的区别在于服务网格的目标是管理微服务之间的通信,而API网关的目标是管理外部客户到服务之间的通信。

从负载均衡的角度看服务网格,所谓服务“网格”就是流量网格化,在每个服务进程旁边部署一个负载均衡组件,当服务之间发生网络调用时,负载均衡组件截获所有请求和响应,作为代理层负责服务发现和数据传输,其数据转发路径如图所示:

如图所示:API网关与服务网格的功能在大多数时候可以互补,API网关处理南北流量、服务网格处理东西流量,进而配合使用来实现一个完整的业务功能。