目录
引言:在 AI 原生时代重塑流量管理
在构建高可用、高并发的现代云原生应用时,我们不可避免地会面临一个核心挑战:如何以极致的效率处理海量网络流量?作为在 AWS 上工作的工程师和架构师,我们都知道,仅仅拥有一台强大的服务器是远远不够的。在 2026 年,随着 AI 代理和无服务器架构的普及,流量模式变得更加不可预测且爆发性极强。我们需要的是一个能够站在应用前面,智能地、快速地分发流量的“交通指挥官”,它不仅要快,还要能无缝对接微服务网格和边缘计算节点。
今天,我们要深入探讨的主角是 AWS 网络负载均衡器 (Network Load Balancer, 简称 NLB)。你可能已经听说过应用负载均衡器 (ALB) 或经典负载均衡器 (CLB),但 NLB 凭借其在第 4 层的惊人性能和低延迟,在处理 TCP、UDP 以及非 HTTP 流量方面拥有不可替代的地位。特别是在我们需要保留源 IP 地址或处理超大规模 WebSocket 连接(例如 AI 实时推理流)的场景下,NLB 是唯一的选择。
在这篇文章中,我们将像构建一个真实的生产级系统一样,一起探索 NLB 的核心概念、实战配置代码、迁移策略、2026 年最新的性能优化技巧,以及如何将其集成到现代化的 CI/CD 流程中。无论你是在为实时游戏后端寻找解决方案,还是在处理高吞吐量的微服务通信,这篇文章都将为你提供从理论到实践的全方位指引。
2026 技术视野:为什么 NLB 依然是不可或缺的基石?
在动手敲代码之前,让我们先对齐一下认知。随着 Service Mesh(服务网格)和边缘计算的兴起,有人可能会质疑:“我们还需要 NLB 吗?”答案是肯定的,甚至是更加依赖。
1. NLB 与 AI 原生应用的结合
在我们最近的一个项目中,我们构建了一个基于 LLM 的实时对话系统。这个系统需要处理长时间的 WebSocket 连接,并且必须保证极低的首包延迟。ALB 虽然强大,但在处理数百万并发长连接时,其额外的 L7 处理开销会带来显著的延迟。而 NLB 工作在 L4 层,它就像一根直通的网线,能够以线速转发流量,这对于 AI 应用的“实时反馈”体验至关重要。
2. 静态 IP 与混合云架构
2026 年,混合云架构已经成为常态。许多企业将核心数据保留在私有云,同时利用公有云的弹性算力。在这种情况下,NLB 提供的静态 IP (Elastic IPs) 功能就成了生命线。传统的负载均衡器 IP 是动态变化的,这给防火墙配置带来了噩梦。而 NLB 允许我们为每个可用区固定一个 IP,这意味着我们可以轻松地在企业防火墙中配置白名单,无需担心底层基础设施变动导致的连接中断。
3. 超越 HTTP:UDP 与 QUIC 协议的支持
随着 HTTP/3 的普及,基于 UDP 的 QUIC 协议成为了新的标准。NLB 天然支持 UDP 流量转发,这使其成为支持 HTTP/3 卸载或自定义 IoT 协议(如 MQTT over WebSocket)的最佳入口点。如果你在尝试使用 ALB 处理非 HTTP 流量,你会发现自己碰壁了;而 NLB 则能游刃有余。
核心概念构建:理解 NLB 的基石
让我们先快速回顾一下那些必不可少的 AWS 组件,但我们会结合现代开发理念来看待它们。
- 目标组: 这是一个逻辑上的集合。在 2026 年,我们不再仅仅将 EC2 实例注册为目标。通过 AWS VPC Lattice 或 EKS Anywhere,我们可以将 Lambda 函数、On-Premise 服务器甚至是其他 AWS 账户中的服务打包进同一个目标组。NLB 并不关心后端是什么,它只负责把流量分发过去。
- 监听器: 它是 NLB 的“前台接待”。在最新的架构中,我们通常配置多端口监听。例如,在同一台 NLB 上,端口 443 处理 HTTPS 流量,端口 50051 处理 gRPC 流量。这大大减少了我们需要维护的负载均衡器数量,简化了网络拓扑。
- 跨可用区 (Cross-Zone) 负载均衡: 这是一个经典的权衡。默认情况下,NLB 尽量在同区域内路由以节省成本。但在现代“可用区容忍”架构中,为了防止某个 AZ 彻底宕机导致服务中断,我们通常会在生产环境中强制开启跨区域负载均衡,哪怕这意味着要支付额外的跨 AZ 流量费。
实战演练:使用 AWS Infrastructure as Code (IaC) 创建 NLB
好了,理论已经足够了。让我们戴上工程师的帽子,开始构建我们的基础设施。为了达到生产级别的要求,并且符合 2026 年的开发标准,我们将分步骤进行,并展示如何通过 CLI 精确控制每一个字节。
准备工作
确保你已经安装了 AWS CLI v2 并配置了相应的凭证。我们将假设你已经有一个运行中的 VPC。
1. 创建网络负载均衡器
首先,我们需要定义 NLB 的骨架。我们将创建一个面向互联网的 NLB,并指定子网映射。
# 创建一个名为 "ai-prod-nlb-2026" 的网络负载均衡器
# --type network 明确指定我们要创建的是 NLB
# --subnet-mappings 允许我们精细化控制每个 AZ 的 IP 分配
aws elbv2 create-load-balancer \
--name ai-prod-nlb-2026 \
--subnet-mappings SubnetId=subnet-0123456789abcdef0,AllocationId=eipalloc-0123456789abcdef0 SubnetId=subnet-abcdef0123456789,AllocationId=eipalloc-abcdef0123456789 \
--scheme internet-facing \
--type network \
--ip-address-type ipv4
代码解析:
-
--subnet-mappings: 这里我们不仅指定了子网,还直接绑定了我们预先分配好的弹性 IP (EIP)。这是生产环境最佳实践,确保我们的入口 IP 永远不会变。 - 返回的 JSON 中会包含 INLINECODEa3dee238,请保存它,这是我们后续操作的关键 ID(以下简称 INLINECODEbbe208cd)。
2. 配置目标组与高级健康检查
我们需要告诉 NLB,流量要发给谁。在这个例子中,我们将配置一个基于 TCP 的目标组,并启用更激进的健康检查策略,以应对现代应用快速重启的场景。
# 创建一个 TCP 目标组,监听端口 8080
# 注意:我们将健康检查间隔缩短,以实现更快的故障转移
aws elbv2 create-target-group \
--name ai-tcp-targets \
--protocol TCP \
--port 8080 \
--vpc-id vpc-0123456789abcdef0 \
--health-check-protocol TCP \
--health-check-interval-seconds 10 \
--health-check-timeout-seconds 5 \
--healthy-threshold 2 \
--unhealthy-threshold 2 \
--target-type instance
代码解析:
-
--health-check-interval-seconds 10: 默认是 30 秒。在现代化的容器环境中,我们希望容器挂掉后能立刻被摘除,所以我们将检查间隔缩短为 10 秒。 -
--healthy-threshold 2: 连续 2 次成功即认为健康。这大大加快了新实例上线接收流量的速度。
3. 注册目标实例
现在,我们要把具体的 EC2 实例“填入”目标组。
# 将具体的实例 ID 注册到目标组
aws elbv2 register-targets \
--target-group-arn \
--targets Id=i-0123456789abcdef0,Port=8080 Id=i-0abcdef0123456789,Port=8080
实战提示: 在生产环境中,我们很少手动注册实例。通常,我们会配合 Auto Scaling Group (ASG) 或 ECS/EKS Service,将目标组挂载到服务上。这样当容器扩缩容时,NLB 会自动发现并路由流量。
4. 创建监听器与流量转发
最后,我们需要打通“任督二脉”。
# 创建监听器:监听 80 端口,转发流量到我们的目标组
aws elbv2 create-listener \
--load-balancer-arn \
--protocol TCP \
--port 80 \
--default-actions Type=forward,TargetGroupArn=
进阶配置:保留源 IP 与 Proxy Protocol v2
这是我们在处理安全审计和精准日志记录时最常遇到的需求。默认情况下,后端服务器看到的源 IP 是 NLB 的节点 IP,而不是真实的客户端 IP。这在我们要做基于 IP 的限流或地理位置阻断时是个大问题。
解决方案:启用 Proxy Protocol v2
我们可以在目标组设置中启用它。这会在 TCP 数据包前面加一个小头,包含原始连接信息。
# 修改目标组以启用 Proxy Protocol v2
aws elbv2 modify-target-group-attributes \
--target-group-arn \
--attributes Key=proxy_protocol_v2.enabled,Value=true
开发者提示: 开启这个后,你的后端应用代码需要能够解析这个额外的头部。否则,连接会失败或日志乱码。以下是 Nginx 的配置示例:
server {
listen 8080 proxy_protocol;
set_real_ip_from 172.16.0.0/12; # NLB 内部 IP 段
real_ip_header proxy_protocol;
location / {
# 你的应用逻辑...
}
}
深入性能优化:在 2026 年榨干 NLB 的潜力
在配置好基础功能后,让我们思考如何让它跑得更快、更稳。以下是我们在生产环境中总结的几条经验。
1. 客户端连接保持
现代浏览器和客户端通常会建立大量并发连接。NLB 的多可用区架构天然支持高并发,但我们需要注意客户端的连接复用。对于 HTTP/2 或 gRPC 流量,确保后端服务器能够正确处理多路复用,避免在 NLB 处形成连接瓶颈。虽然 NLB 支持 TLS 卸载,但在高吞吐场景下,我们建议直透 TLS 到后端实例,让后端服务器处理加密,这样可以减轻 NLB 的 CPU 压力,同时保留端到端加密的安全性。
2. 监控与可观测性
不要只依赖 CloudWatch 的默认指标。在 2026 年,我们建议大家重点关注以下两个指标:
- TargetResponseTime: 虽然这是 ALB 的特性,但 NLB 可以通过
TargetHealthState变化事件来推断。结合 X-Ray,我们可以追踪到后端具体的延迟分布。 - ProcessNLBBytes: 如果这个数值飙升,而你的请求量没变,说明你的数据包大小可能异常(例如某次 API 更新导致响应体膨胀)。
3. 故障排查:当一个健康的实例无法被访问
这是我们常遇到的“灵异事件”:目标组显示 Healthy,但用户无法连接。原因通常出在 安全组 上。
排查思路:
- 检查后端 EC2 的安全组入站规则。必须允许 NLB 的安全组 ID(或者 NLB 所在的 VPC CIDR)访问应用端口。
- 如果你启用了 Proxy Protocol,但后端没配置,Nginx 通常会返回 400 Bad Request,或者直接断开连接。
- 检查 Network ACL。NACL 是无状态的,如果忘记放行回程流量,连接就会卡死。
替代方案与决策指南:何时弃用 NLB?
尽管 NLB 很强大,但它不是万能药。以下场景你可能需要考虑其他方案:
- 需要复杂的路由逻辑: 如果你需要根据 URL 路径、Header 或 Cookie 将流量路由到不同服务,应用负载均衡器 (ALB) 是更好的选择。虽然 NLB 也能做一定的端口转发,但它无法解析 HTTP 内容。
- 纯 Serverless 架构: 如果你的后端完全是 Lambda 函数,且不需要极度稳定的静态 IP,使用 API Gateway 或 ALB 会更省心,因为它们与 Lambda 的集成更深。
- 全球加速需求: 如果你的用户遍布全球,且对跨大洋延迟极其敏感,可以考虑将 NLB 与 AWS Global Accelerator 结合使用。Global Accelerator 利用 AWS 的全球骨干网,为流量提供一条“专用高速公路”,自动绕过互联网拥堵。
总结与未来展望
通过这篇文章,我们从零开始构建了一个符合 2026 年标准的 AWS 网络负载均衡器。我们不仅掌握了基础配置,还深入探讨了源 IP 保持、静态 IP 配置、Proxy Protocol 以及性能优化技巧。
作为工程师,你的下一步应该是:
- 动手尝试: 不要只看,去你的 AWS 控制台或使用 CLI 按照上述步骤创建一个 NLB,并尝试绑定 EIP。
- 集成 AI 工具: 尝试使用 GitHub Copilot 或 Cursor 生成 Terraform 脚本来部署上述架构,体验现代开发的快感。
- 压力测试: 使用 JMeter 或 k6 对 NLB 进行压测,观察 LCU 计费与性能拐点,建立对系统边界的直观认知。
随着云原生的不断演进,NLB 作为 AWS 架构中的“定海神针”,依然是我们构建高并发应用不可或缺的工具。希望这篇深入浅出的指南能帮助你更好地驾驭它!