所谓的边车模式,对应于我们生活中熟知的边三轮摩托车。也就是说,我们可以通过给一个摩托车加上一个边车的方式来扩展现有的服务和功能。这样可以很容易地做到"控制"和"逻辑"的分离。

也就是说,我们不需要在服务中实现控制面上的东西,如监视、日志记录、限流、熔断、服务注册、协议适配转换等这些属于控制面上的东西,而只需要专注地做好和业务逻辑相关的代码,然后,由“边车”来实现这些与业务逻辑没有关系的控制功能。

边车模式设计

具体来说,你可以理解为,边车就有点像一个服务的Agent,这个服务所有对外的进出通讯都通过这个Agent来完成。这样,我们就可以在这个Agent上做很多文章了。但是,我们需要保证的是,这个Agent要和应用程序一起创建,一起停用。

边车模式有时候也叫搭档模式,或是伴侣模式,或是跟班模式。就像我们在《编程范式游记》中看到的那样,编程的本质就是将控制和逻辑分离和解耦,而边车模式也是异曲同工,同样是让我们在分布式架构中做到逻辑和控制分离。

对于监视、日志、限流、熔断、服务注册、协议转换等等这些功能,其实都是大同小异,甚至是完全可以做成标准化的组件和模块的。一般来说,我们有两种方式。

这两种方式各有优缺点。

于是,我们的应用服务则可以完全做到专注于业务逻辑。

注意,如果把Sidecar这个实例和应用服务部署在同一台机器中,那么,其实Sidecar的进程在理论上来说是可以访问应用服务的进程能访问的资源的。比如,Sidecar是可以监控到应用服务的进程信息的。

另外,因为两个进程部署在同一台机器上,所以两者之间的通信不存在明显的延迟。也就是说,服务的响应延迟虽然会因为跨进程调用而增加,但这个增加完全是可以接受的。

另外,我们可以看到这样的部署方式,最好是与Docker容器的方式一起使用的。为什么Docker一定会是分布式系统或是云计算的关键技术,相信你从我的这一系列文章中已经看到其简化架构的部署和管理的重要作用。否则,这么多的分布式架构模式实施起来会有很多麻烦。

边车设计的重点

首先,我们要知道边车模式重点解决什么样的问题。

  1. 控制和逻辑的分离。
  2. 服务调用中上下文的问题。

我们知道,熔断、路由、服务发现、计量、流控、监视、重试、幂等、鉴权等控制面上的功能,以及其相关的配置更新,本质来上来说,和服务的关系并不大。但是传统的工程做法是在开发层面完成这些功能,这就会导致各种维护上的问题,而且还会受到特定语言和编程框架的约束和限制。

而随着系统架构的复杂化和扩张,我们需要更统一地管理和控制这些控制面上的功能,所以传统的在开发层面上完成控制面的管理会变得非常难以管理和维护。这使得我们需要通过Sidecar模式来架构我们的系统。

边车模式从概念上理解起来比较简单,但是在工程实现上来说,需要注意以下几点。

当然,我们要清楚Sidecar适用于什么样的场景,下面罗列几个。

同时,我们还要清楚Sidecar不适用于什么样的场景,下面罗列几个。

小结

好了,我们来总结一下今天分享的主要内容。首先,我介绍了什么是边车模式。为了把诸如监视、日志、限流等控制逻辑与业务逻辑分离解耦,我们可以采用边车模式。与之对应的另一种实现控制逻辑的方式是库或框架。虽然相对来说边车模式资源消耗较大,但控制逻辑不会侵入业务逻辑,还能适应遗留老系统的低风险改造。

边车作为另一个进程,和服务进程部署在同一个结点中,通过一个标准的网络协议,如HTTP来进行通信。这样可以做到低延迟和标准化。同时,用Docker来打包边车和服务两者,可以非常方便部署。最后,我指出了边车模式适用和不适用的场景。下篇文章中,我们讲述服务网格。希望对你有帮助。

也欢迎你分享一下你实现服务的同时有没有实现边车模式?有没有用到Docker来打包边车和服务两者?

文末给出了《分布式系统设计模式》系列文章的目录,希望你能在这个列表里找到自己感兴趣的内容。