简介

设计模式是软件设计中,针对 “反复出现的常见问题” 的 “可复用解决方案”(比如 “如何让多个服务通信更高效”“如何解耦业务与非业务逻辑” 这类高频难题,都有对应的成熟模式)。

Sidecar 模式(边车模式)就是这类设计模式中的一种,并且在现代软件工程中(尤其是分布式系统、云原生架构中)越来越重要(比如之前讲的服务网格,核心就是基于 Sidecar 模式实现的)。

Sidecar 模式的本质是给 “主应用(primary application) ”(比如处理订单的 “订单服务”、管理用户的 “用户服务”)配对一个 “次要进程 / 服务(sidecar,即边车) ”—— 主应用负责核心业务逻辑,边车负责 “辅助性任务(complementary tasks) ”(非业务但必需的工作)。

边车负责的任务都是主应用运行中需要,但又不属于 “核心业务” 的工作,常见包括:

  • 日志(logging):收集主应用的运行日志(如 “用户下单失败” 的记录),统一上报到日志系统;
  • 监控(monitoring):监控主应用的运行状态(如 CPU 使用率、请求响应时间),一旦异常就报警;
  • 代理(proxying):接管主应用的网络通信(如服务网格中的 Sidecar,转发主应用的调用请求);
  • 安全(security):处理主应用的加密 / 解密(如 TLS 证书管理)、身份验证; 配置管理(configuration management):为主应用同步最新配置(如数据库地址、限流阈值),无需主应用重启。

物理共存,逻辑独立:

  • 物理层面:边车与主应用 “一起运行”(runs alongside),共享同一个运行环境(比如在同一台服务器、同一个容器中)—— 确保边车能高效获取主应用的信息(如日志、网络流量);
  • 逻辑与操作层面:边车与主应用 “完全独立”—— 二者代码分离(边车的代码不嵌入主应用)、部署独立(边车升级 / 重启不影响主应用)、故障隔离(边车挂了不会直接导致主应用崩溃)。

Sidecar 可以这样类比:

  • 摩托车(主服务):核心功能是 “载人运输”,对应软件中主应用的 “核心业务逻辑”(如订单服务的 “创建订单”“查询订单”);
  • 边车(辅助服务):功能是 “装工具、载额外乘客”,不影响摩托车的核心运输功能,对应软件中边车的 “辅助任务”(如日志、监控);
  • 类比核心:边车 “扩展了摩托车的能力”(能装更多东西),但不 “绑定” 摩托车(边车可以拆下来,摩托车没边车也能正常跑)—— 对应软件中,边车 “扩展了主应用的能力”(如主应用不用自己写监控代码,边车帮它做),但不 “紧耦合”(主应用和边车互不依赖)。

核心概念

用容器技术(如 Docker、Kubernetes)部署应用时的典型架构—— 即把 “主应用” 和 “Sidecar 辅助服务” 分别打包成两个独立容器,但让它们在同一台主机 / 同一个 K8s Pod 中运行(符合 Sidecar 模式 “物理共存、逻辑独立” 的特性):

  • 应用容器:承载主应用的核心业务逻辑,是整个部署单元的 “价值核心”,直接满足业务需求。
  • Sidecar 容器(sidecar container):“能力增强载体”:为应用容器提供 “辅助能力”,相当于给主应用 “加装插件”,但自身不承担核心业务逻辑。

关键特性:

  • 协同部署(Co-location):Sidecar(边车)与主服务(primary service)必须 “一起部署”,在 Kubernetes(主流容器编排平台)环境中,二者通常被放在同一个 “Pod”(K8s 中最小的部署单元,一个 Pod 可包含多个容器)里。
  • 独立性(Independence):Sidecar 与主应用是 “松耦合” 关系(不是紧绑定),二者在代码、部署、运维上完全独立。
  • 资源共享(Resource Sharing):Sidecar 与主服务运行在同一 “资源载体” 上(如同一台服务器、同一个 K8s Pod),因此会共享该载体的底层硬件 / 软件资源,无需为 Sidecar 单独分配独立的服务器资源。
  • 通信方式(Communication):Sidecar 与主服务之间的通信,不依赖复杂的跨节点网络,而是通过本地方式实现,确保简单、高效且低延迟。