云原生架构两大“黑科技”——Sidecar和 Serverless
🛵 Sidecar 模式:给应用配个“全能保镖”
在微服务时代,你的业务代码(比如一个 Java 写的订单服务)不仅要处理核心逻辑,还得操心一大堆杂事:怎么发现别的服务?网络断了要不要重试?请求要不要加密?流量要不要限流?
如果把这些逻辑全写在业务代码里,代码会变得极其臃肿且难以维护。Sidecar 模式就是来解决这个问题的。
1. 什么是 Sidecar?边车模式
想象你骑着一辆摩托车(你的主业务容器),旁边挂了一个挎斗(Sidecar 容器)。这个挎斗里坐着一个“全能保镖”。
从此以后,你只管骑车(处理业务逻辑),所有的对外联络、挡风遮雨、导航探路(网络通信、熔断限流、安全加密)全由这个保镖代劳。
在 Service Mesh(服务网格,如 Istio)中,这个保镖通常就是大名鼎鼎的 Envoy 代理。
2. 底层原理:它是怎么“半路劫持”流量的?
最神奇的地方在于:你的业务代码完全不需要修改一行代码,甚至根本不知道保镖的存在,但发出的所有流量都被保镖接管了。 这是怎么做到的?
答案藏在 Linux 内核的 iptables(或 eBPF)里。
当 Kubernetes 启动一个 Pod 时,会先运行一个初始化容器(Init Container)。它会在这个 Pod 的网络命名空间里,提前埋下几条 iptables 规则(相当于在路口设了关卡):
- 出站拦截:只要是你业务进程想往外发的 TCP 请求,统统被 iptables 拦截,强制转发到 Sidecar 监听的端口(比如
15001)。 - 入站拦截:凡是外面想发给你业务进程的请求,也被 iptables 拦截,先送到 Sidecar 的另一个端口(比如
15006)安检一遍,再放行给你的业务。
代码落地:手动模拟 iptables 流量劫持
假设你的业务监听在 9080 端口,Sidecar 监听在 15001。Init 容器会执行类似这样的命令:
# 把所有发往 9080 端口的流量,全部重定向到 Sidecar 的 15001 端口
iptables -t nat -A OUTPUT -p tcp --dport 9080 -j REDIRECT --to-port 15001
这样一来,你的业务代码以为自己直接访问了目标服务,实际上数据包早就被 Sidecar 拿去做了负载均衡、加解密、打监控日志等一系列操作。
3. 控制面与数据面:大脑与手脚
Service Mesh 还有一个经典的架构:控制面(Control Plane) + 数据面(Data Plane)。
- 数据面(Sidecar/Envoy):就是那个“保镖”,负责实际转发每一个数据包,执行具体的策略。
- 控制面(Istiod):是“保镖总部的指挥中心”。它不碰流量,只负责把配置(比如路由规则、熔断策略)通过 xDS 协议动态下发给所有的 Sidecar。
优缺点总结:
- 优点:业务代码零侵入(不用引 SDK)、语言无关(Java、Go、Python 通吃)、升级方便(升级 Sidecar 镜像就行,不用动业务)。
- 缺点:每个 Pod 都要多跑一个 Sidecar 容器,会额外消耗 CPU 和内存;而且多了一跳代理,理论上会增加一点点网络延迟(通常在毫秒级)。
4.缺点:全能保镖的副作用
-
资源开销增加
每个 Pod 里都要多运行一个 Sidecar 代理容器(比如 Envoy)。这意味着原本只跑一个业务容器的资源,现在要分出一部分给 Sidecar。通常情况下,这会导致集群的 CPU 和内存占用增加 10%~30%。在大规模微服务场景下,这笔额外的资源账单是不容忽视的。 -
架构与调试复杂度上升
引入 Sidecar 后,原本简单的网络请求路径变长了。流量不再是服务A -> 服务B,而是变成了服务A -> SidecarA -> SidecarB -> 服务B。当出现网络延迟或调用失败时,排查问题的链路变得更长、更复杂,运维人员必须非常熟悉数据平面(Sidecar)的工作原理才能快速定位故障。 -
潜在的通信与资源竞争
因为 Sidecar 与主应用共享同一个 Pod 的网络命名空间和计算资源,如果 Sidecar 在高并发下占用了过多的 CPU 或内存,会直接挤压主业务的性能(资源竞争)。此外,虽然本地回环通信很快,但在极高频率的调用下,多经过一层代理转发依然会引入一定的通信开销。
⚡ Serverless:云计算的“滴滴打车”(无服务器架构)
Serverless 并不是真的没有服务器,而是你作为开发者,再也不用关心服务器的死活。底层的运维、扩容、打补丁,全交给云厂商(阿里云、AWS 等)。
Serverless 的核心代表就是 FaaS(函数即服务),比如阿里云的函数计算、AWS Lambda。
1. 什么是 Serverless?
传统的云服务器(ECS/EC2)就像买房:不管住不住,你都得按月交房租(为闲置资源付费),水管坏了还得自己修(运维操作系统)。
Serverless 就像滴滴打车:有需求时(事件触发),车子秒级出现带你走(自动分配资源);到了目的地付钱下车(按实际调用次数和运行时长计费);车坏了、没油了跟你没关系(免运维)。
2. 底层原理:从“冷启动”看容器复用
当你上传一段 Python 或 Node.js 代码到云平台,平台是怎么运行的?
- 打包与调度:你把代码打成 ZIP 包或镜像传上去。云平台接收到触发事件(比如一个 HTTP 请求,或者 S3 存储桶里上传了一张图片),会立刻在某个节点上启动一个轻量级的容器(通常是 Firecracker 这种微型虚拟机)来加载你的代码。
- 冷启动(Cold Start):如果是第一次调用,平台需要拉镜像、启容器、加载运行时环境,这个过程可能需要几百毫秒到几秒。这就是 Serverless 被人诟病的“冷启动延迟”。
- 热启动(Hot Start):聪明的云平台不会用完就把容器销毁。它会把容器放在一个“保温池”里。如果你在几十秒内再次调用,它直接把请求扔给已经热身好的容器,响应速度瞬间变成毫秒级。
代码落地:一个典型的 Serverless 函数
以阿里云函数计算为例,你只需要写一个 Handler 函数:
# 这是一个处理图片上传事件的函数
def handler(event, context):
# event 里包含了触发信息,比如 OSS 文件上传的路径
info = json.loads(event)
file_path = info['oss']['object']['key']
# 你的业务逻辑:压缩图片
compress_image(file_path)
return "图片处理成功!"
你完全不用写 Web 框架(如 Flask/Spring Boot),也不用管监听哪个端口。云平台的 API 网关会自动把 HTTP 请求转换成 event 传给你的函数。
3. 核心特征与适用场景
- 事件驱动:一切由事件触发(HTTP 请求、定时任务 Cron、数据库变更、消息队列)。
- 极致弹性:哪怕上一秒没人用,下一秒突然来了 10 万并发,云平台也能在几秒内自动帮你创建成千上万个实例扛住流量,结束后自动缩容到 0。
- 按量付费:代码不运行就不花钱。特别适合那些平时没啥流量、偶尔突发高峰的场景(比如抢票系统、报表生成、物联网设备数据上报)。
4.Service Mesh 与 Serverless 的区别
这两者经常被放在一起讨论,但它们的核心使命和适用战场完全不同。简单来说:Service Mesh 是为了管好复杂的微服务通信,而 Serverless 是为了让你彻底忘掉服务器。
| 维度 | Service Mesh (如 Istio) | Serverless (如 AWS Lambda) |
|---|---|---|
| 核心目标 | 解决微服务间通信治理难题(路由、熔断、安全、监控) | 消除服务器运维负担,实现极致弹性与按量付费 |
| 底层形态 | 给每个微服务挂载一个 Sidecar 代理(数据面) | 事件触发的短生命周期函数或容器实例 |
| 适用场景 | 多语言技术栈、强合规要求、已有 K8s 基础的复杂微服务集群 | 事件驱动任务(文件处理/定时任务)、流量波峰波谷明显的业务 |
| 状态管理 | 适合有状态的长连接服务(如 WebSocket、数据库连接池) | 仅适合无状态、短时任务(执行时间通常 < 15分钟) |
| 对开发影响 | 业务代码零侵入,只需关注核心逻辑 | 需按 FaaS 规范编写函数,且面临一定的厂商锁定风险 |
一句话总结: 如果你的痛点是“几百个微服务互相调用太乱、太难管”,选 Service Mesh;如果你的痛点是“不想养一堆闲置服务器、想按秒计费”,选 Serverless。它们甚至可以互补共存。
5.Serverless 冷启动问题如何解决?
冷启动(Cold Start)是指 Serverless 平台在没有现成实例时,从零开始拉取镜像、创建容器、加载代码并初始化运行环境的过程。这个过程通常会带来几百毫秒甚至数秒的延迟。
解决冷启动主要从平台优化和开发者策略两个层面入手:
1. 开发者可落地的四大实战方案
- 保持实例温热(预热机制)
最传统的方法是使用定时任务(如 Cron Job 或 Amazon EventBridge),每隔几分钟自动向函数发送一个“心跳请求”。这样可以让平台的实例保温池里始终保留几个“热身”好的容器,避免真正的业务请求触发冷启动。 - 配置预留并发(Provisioned Concurrency)
这是各大云厂商提供的“氪金”解决方案。你可以花钱指定一定数量的实例始终保持初始化和就绪状态(例如 AWS Lambda 的预置并发)。这些实例就像随时待命的专车,能确保在两位数毫秒内响应请求,非常适合对延迟极度敏感的 Web 后端或同步 API。 - 代码与依赖瘦身
冷启动包含“下载和解压代码包”的时间。通过精简代码、剔除不必要的第三方库依赖,可以大幅缩短这个阶段的耗时。例如,Node.js 和 Go 语言的冷启动通常比 Java 快,很大原因就是它们的运行时和依赖包更轻量。 - 利用快照恢复技术(进阶黑科技)
以 AWS Lambda 的 SnapStart 为例,它允许你在发布函数版本时,先完成所有的初始化工作(加载类、解析配置等),然后把这个内存状态打个快照保存下来。下次冷启动时,直接从快照恢复内存,而不是重新跑一遍初始化流程,能将某些场景下的冷启动延迟降低 90% 以上。
2. 云厂商底层的硬核优化
除了上述方法,云平台自身也在疯狂优化底层设施来缩短冷启动时间:
- 轻量级虚拟化:抛弃笨重的传统虚拟机,改用 Firecracker 等微型虚拟机(microVM)或安全容器(如 gVisor、Kata Containers),将实例启动速度压缩到亚毫秒级。
- 镜像加速分发:利用 P2P 树状结构分发、本地节点镜像缓存、RDMA 共享内存等技术,让几百兆的容器镜像能在瞬间被节点获取。
- 智能实例池化:平台会根据历史流量预测,提前在后台悄悄创建好一批通用环境的实例放入池中,以此实现“空间换时间”。
不完全总结
| 维度 | Sidecar (Service Mesh) | Serverless (FaaS) |
|---|---|---|
| 核心解决什么问题 | 微服务之间复杂的通信治理(路由、安全、监控) | 基础设施的运维负担和资源浪费 |
| 底层核心技术 | iptables 流量劫持、反向代理 (Envoy) | 容器快速调度、事件驱动模型 |
| 对业务的影响 | 业务无感知,零代码侵入 | 业务需改写成短小、无状态的函数 |
| 典型应用场景 | 大规模微服务集群(成百上千个服务互相调用) | 事件处理、异步任务、低频突发流量的 API |
简单来说,Sidecar 是为了让你的微服务跑得更有秩序,而 Serverless 是为了让你彻底忘掉服务器的存在。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)