4.4 七层负载均衡
4.4.1 代理
四层负载均衡的工作模式属于“转发”,客户端与响应请求的真实服务器维持着同一条 TCP 通道,但七层的负载均衡模式就无法再转发了。
如图 4-13 所示,一个七层 HTTP/2 负载均衡器,此时客户端(client)、负载均衡器(Load Balancer)、业务服务器(RealServer)的工作模式。
图 4-13 七层负载均衡工作模式
此时,客户端与七层负载均衡器建立一个 HTTP/2 TCP 连接,负载均衡器根据负载均衡策略和两个业务后端建立了连接。当客户端向负载均衡器发送两个 HTTP/2 stream 时:
- stream1 会被发送到 RealServer1;
- stream2 会被发送到 RealServer2。
因此,即使不同客户端的请求数量差异巨大,这些请求也可以被平衡到各个业务后端。因为七层负载均衡具备检测应用层流量的能力,所以做出更多、更明智的决策,也能玩出更多的花样。
七层负载均衡的能力更强,那是否意味着四层负载均衡已经没用了?肯定不,几乎所有的现代大型分布式系统都使用 L4/L7 两级部署的原因是:
两者分工明确:四层负载均衡器可以在前端快速处理大量请求,进行初步的流量分发(SYN 泛洪、通用包泛洪攻击),而七层负载均衡器则可以在后端进行更精细的流量管理和处理(如 SSL 卸载、请求重写、缓存、内容路由)。
容错:七层负载均衡的部署更为广泛且频繁,因此更容易出现 bug。在七层负载均衡之前添加一层四层负载均衡,可以在调整七层负载均衡配置时进行健康检查和流量排除,这比单独依赖四层负载均衡要可靠得多。
4.4.2 从代理到网关系统
早期的七层负载均衡,仅仅实现应用层请求的代理,无法满足现代分布式系统对动态路由、精细化流量管理、API 管理等方面的需求。
把非业务功能,如路由请求、鉴权、监控、缓存、限流和日志记录等集中在一层处理,实现 API Gateway as a Service,让各个服务直接接入,在管理平台上管理,可视化配置等等,这样就实现了一个全局的视图统一管理这些功能,这就是七层负载均衡的升级 —— 网关(API Gateway)。
目前,业界已经出现了非常多的开源网关解决方案。根据实现语言以及应用场景来说,主流方案如表4-1所示。
表 4-1 业内网关代表方案
网关 | 特点 |
---|---|
OpenResty | 基于 Nginx 和 LuaJIT 的高性能 Web 平台。通过 LuaJIT 引擎,OpenResty 允许用户在 Nginx 中编写 Lua 脚本。这使得开发者可以在请求处理的不同阶段(如请求、响应、重写、日志等)动态地执行自定义逻辑 ,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。 |
Kong | 社区活跃、成熟度高、Postgres 存储、二次开发成本高 |
Spring Cloud Gateway | Spring Cloud Gateway 是 Spring 生态系统中的一个网关解决方案,适用于 SpringBoot 和 SpringCloud 构建的微服务系统 |
Traefik | Docker、Kubernetes 等容器编排系统紧密结合。 |
Envoy | Envoy 是 Lyft 开发的一款面向服务网格的高性能网络代理,支持高级的路由控制、负载均衡策略、服务发现和健康检查等。Envoy 与 Istio 等服务网格解决方案紧密结合,通常作为它们的数据平面代理使用。 |
这些现代化的网关方案各有各的特点,实现的功能也非常强大,笔者就不再一介绍,简单列举部分网关功能,以便读者对“强大功能”有个直观的感受。
协议支持:网关对应用层协议了解的越多,就可以处理更复杂的事情。如系统可观测、高级负载均衡和路由等。云原生网关的典型代表 Envoy 支持如下七层协议的解析和路由:HTTP/1、HTTP/2、gRPC、Redis、MongoDB、DynamoDB 等等。
动态配置: 服务管理的动态配置包括路由、上游服务(Upstream)、SSL证书、消费者等等,数据的替换和更新不会产生任何中断,从而将线上流量的影响降低到最低。
流量治理:很多微服务架构中,流量治理都需要在七层中进行,譬如超时、重试、限速、熔断、流量镜像、缓存等等。现代网关系统在服务以及流量的管理上可对多业务进行收敛统一处理,降低多套网关的运维成本。
可观测性:互联网快速发展的今天,基础设施与应用的部署构建都发生了极大变化,特别是基于分布式、微服务的体系架构,传统的监控方式已经无法适应云原生的场景。服务治理的可观测性输出是网关系统提供的最重要的特性。系统度量、分布式跟踪以及自定义日志等功能现在几乎是七层负载均衡解决方案的标配。需要指出的是,丰富的可观测数据并不是没有代价的,负载均衡器需要做一些额外的工作才能产生这些数据。但是,这些数据带来的收益要远远大于为产生它们而增加的那点性能损失。
可扩展性:例如典型网关 OpenResty,通过编写可插拔的插件能够轻松地对网关系统实现各种流量处理以及各类自定义功能,譬如流量限速、日志记录、安全检测、故障注入等等。
高可用以及无状态设计:现代网关系统不仅提供数据面实现,还提供控制面实现,二者目标都在朝向无状态设计,可以轻松地实现水平扩展。网关架构整体上也默认高可用,不存在单点故障。