将应用程序的组件部署到单独的进程或容器中,以提供隔离和封装。 使用此模式还可以使用异构组件和技术来构建应用程序。
此模式之所以称作“挎斗”(Sidecar),是因为它类似于三轮摩托车上的挎斗。 在此模式中,挎斗附加到父应用程序,为应用程序提供支持性功能。 此外,挎斗与父应用程序具有相同的生命周期:与父应用程序一起创建,一起停用。 挎斗模式有时也称为搭档模式,这是一种分解模式。
应用程序和服务通常需要相关的功能,例如监视、日志记录、配置和网络服务。 可以作为单独的组件或服务实现这些外围任务。
如果这些功能已紧密集成到应用程序中,则可以在运行应用程序的同一个进程中运行这些功能,从而有效利用共享资源。 但是,这也意味着无法对它们进行适当的隔离,其中一个组件发生故障就可能影响到其他组件甚至整个应用程序。 此外,通常需要使用与父应用程序相同的语言来实现这些功能。 因此,组件和应用程序之间保持着密切的相互依赖关系。
如果应用程序已分解为服务,则可以使用不同的语言和技术构建每个服务。 尽管这提高了灵活性,但同时也意味着,每个组件具有自身的依赖关系,需要使用特定于语言的库来访问底层平台,以及与父应用程序共享的所有资源。 此外,将这些功能部署为单独的服务可能会增大应用程序的延迟。 管理这些特定于语言的接口的代码和依赖关系还可能会显著增大复杂性,尤其是托管、部署和管理的复杂性。
将一组内聚性的任务与主应用程序放在一起,不过,要将它们放在其自身的进程或容器内,以便为跨语言的平台服务提供同构接口。
挎斗服务不一定要属于应用程序的一部分,而只是与应用程序相连接。 不管它位于哪个位置,父应用程序都会跟随。 挎斗是连同主应用程序一起部署的支持性进程或服务。 以三轮摩托车为例,挎斗附加在一辆三轮摩托车上,每辆三轮摩托车有自身的挎斗。 同样,挎斗服务与其父应用程序具有相同的生命周期。 对于应用程序的每个实例,都会部署一个挎斗实例,并连同应用程序实例一起托管该挎斗实例。
使用挎斗模式的好处包括:
挎斗模式通常与容器一起使用,因而称作挎斗容器或搭档容器。
在以下情况下使用此模式:
此模式可能不适用于以下情况:
挎斗模式适用于许多方案。 一些常见示例: