Sidecar模式:將應(yīng)用程序的組件部署到單獨(dú)的進(jìn)程或容器中拷沸,以提供隔離和封裝旨椒。此模式還允許應(yīng)用程序由異構(gòu)組件和技術(shù)實(shí)現(xiàn)。
為什么稱為Sidecar模式堵漱,是因?yàn)樗愃朴谶B接在摩托車旁的邊車综慎。在該模式中,sidecar服務(wù)被附加到主應(yīng)用程序中勤庐,并為應(yīng)用程序提供其所支持的特性示惊。sidecar也與主應(yīng)用程序有相同的生命周期,與主應(yīng)用程序一起創(chuàng)建和退出愉镰。sidecar模式有時被稱為sidekick模式米罚,它是一種分解模式。
背景和問題
應(yīng)用程序和服務(wù)通常需要一些相關(guān)的基礎(chǔ)功能丈探,如監(jiān)控录择、日志、配置和網(wǎng)絡(luò)服務(wù)碗降。這些外圍功能可以作為獨(dú)立的組件或服務(wù)實(shí)現(xiàn)隘竭。
如果將它們直接集成到應(yīng)用程序中,則它們可以與應(yīng)用程序在相同的進(jìn)程中運(yùn)行讼渊,從而有效地利用共享資源动看。然而,這也意味著它們之間沒有很好地隔離爪幻,其中一個組件的中斷可能會影響其他組件或整個應(yīng)用程序菱皆。此外,它們通常需要使用與主應(yīng)用程序相同的語言來實(shí)現(xiàn)挨稿。因此仇轻,組件和應(yīng)用程序之間具有強(qiáng)相互依賴關(guān)系。
如果將應(yīng)用程序分解為不同服務(wù)奶甘,則可以使用不同的語言和技術(shù)實(shí)現(xiàn)每個服務(wù)篷店。雖然這提供了更多的靈活性,但這意味著每個組件都有自己的依賴項(xiàng)甩十,并且需要特定于語言的庫來訪問底層平臺與主應(yīng)用程序共享的任何資源船庇。此外,將這些特性部署為獨(dú)立的服務(wù)可能會增加應(yīng)用程序的延遲侣监。管理這些特定于語言的接口的代碼和依賴關(guān)系也會增加相當(dāng)大的復(fù)雜性鸭轮,特別是對于服務(wù)托管、部署和管理橄霉。
解決方案
將這些基礎(chǔ)服務(wù)和應(yīng)用程序綁定在一起窃爷,但使用獨(dú)立的進(jìn)程或容器部署邑蒋,這能為跨語言的平臺服務(wù)提供同構(gòu)接口。
sidecar服務(wù)不一定是應(yīng)用程序的一部分按厘,但它會連接到應(yīng)用程序医吊。應(yīng)用程序部署到哪里,它就部署到哪里逮京。Sidecars是支持與主應(yīng)用程序一起部署的流程或服務(wù)卿堂。在摩托車上,邊車與一輛摩托車相連懒棉,每輛摩托車都可以有自己的邊車草描。以同樣的方式,sidecar服務(wù)和其主應(yīng)用程序具有相同的生命周期策严。對于應(yīng)用程序的每個實(shí)例穗慕,sidecar的一個實(shí)例被部署和托管在它旁邊。
sidecar模式的優(yōu)點(diǎn):
- 在運(yùn)行時環(huán)境和編程語言方面獨(dú)立于它的主應(yīng)用程序妻导,因此您不需要為每種語言開發(fā)一個sidecar逛绵。
- sidecar可以訪問與主應(yīng)用程序相同的資源。例如倔韭,可以監(jiān)控自己和主應(yīng)用程序所使用的系統(tǒng)資源术浪。
- 因?yàn)樗拷鲬?yīng)用程序,所以在它們之間通信時沒有明顯的延遲狐肢。
- 即使對于不提供可擴(kuò)展性機(jī)制的應(yīng)用程序添吗,也可以使用sidecar來擴(kuò)展功能,方法是將sidecar作為自己的進(jìn)程附加到主應(yīng)用程序所在的主機(jī)或子容器中份名。
sidecar模式經(jīng)常與容器一起使用,并被稱為sidecar容器或sidekick容器妓美。
問題及思考
- 考慮到你部署和打包應(yīng)用的方式僵腺。容器部署是最適合sidecar模式的。
- 在設(shè)計(jì)sidecar服務(wù)時壶栋,請仔細(xì)決定進(jìn)程間通信機(jī)制辰如。除非對性能特殊要求,否則盡量使用與語言或框架無關(guān)的技術(shù)贵试。
- 在將功能放入sidecar之前琉兜,請考慮它作為單獨(dú)的服務(wù)是否是更好的工作方式或使用傳統(tǒng)的守護(hù)進(jìn)程方式。
- 還要考慮功能是否可以作為庫實(shí)現(xiàn)還是使用傳統(tǒng)的擴(kuò)展機(jī)制實(shí)現(xiàn)毙玻。特定于語言的庫可能具有更深層次的集成和更少的網(wǎng)絡(luò)開銷豌蟋。
什么時候使用sidecar模式
- 主應(yīng)用程序使用一組異構(gòu)的語言和框架開發(fā)。位于sidecar服務(wù)中的組件可以使用不同框架和不同語言編寫桑滩。
- 組件由遠(yuǎn)程團(tuán)隊(duì)或不同的組織開發(fā)梧疲。
- 組件或特性必須與應(yīng)用程序位于同一主機(jī)上。
- 需要一個服務(wù),它共享主應(yīng)用程序的整個生命周期幌氮,但可以獨(dú)立地進(jìn)行更新缭受。
- 需要對特定資源或組件的資源限制進(jìn)行細(xì)粒度控制。例如该互,您可能希望限制特定組件使用的內(nèi)存量米者。您可以將組件部署為sidecar,并獨(dú)立于主應(yīng)用程序管理內(nèi)存使用宇智。
不適合使用sidecar情況:
- 當(dāng)需要優(yōu)化進(jìn)程間通信時蔓搞。主應(yīng)用程序和sidecar服務(wù)之間的通信包括一些開銷,特別是調(diào)用延遲普筹。對于會話接口來說败明,這可能不是一個可接受的折衷辦法。
- 對于小型應(yīng)用程序來說太防,為每個實(shí)例部署sidecar服務(wù)的資源成本超過使用隔離優(yōu)勢妻顶。
- 當(dāng)服務(wù)需要不同于主應(yīng)用程序或獨(dú)立于主應(yīng)用程序進(jìn)行伸縮時。如果是這樣蜒车,最好將該特性部署為單獨(dú)的服務(wù)讳嘱。
案例
sidecar模式適用于許多場景。一些常見的例子:
- 基礎(chǔ)設(shè)施的API酿愧×ぬ叮基礎(chǔ)架構(gòu)開發(fā)團(tuán)隊(duì)創(chuàng)建一個部署在每個應(yīng)用程序旁邊的服務(wù),而不是基于特定語言的客戶端庫來訪問基礎(chǔ)服務(wù)嬉挡。該服務(wù)作為sidecar加載钝鸽,并為基礎(chǔ)設(shè)施服務(wù)提供公共功能,包括日志庞钢、環(huán)境數(shù)據(jù)拔恰、配置存儲、服務(wù)發(fā)現(xiàn)基括、健康檢查和監(jiān)控服務(wù)颜懊。sidecar還監(jiān)視主應(yīng)用程序的宿主環(huán)境和進(jìn)程(或容器),并將信息記錄到一個集中的服務(wù)风皿。
- 管理HAProxy或NGINX河爹。使用sidecar服務(wù)部署NGINX,該服務(wù)監(jiān)控環(huán)境狀態(tài)桐款,然后更新NGINX配置文件咸这,并在需要改變狀態(tài)時回收進(jìn)程。
- 代理sidecar:以sidecar方式部署代理服務(wù)鲁僚。應(yīng)用程序通過代理處理請求日志炊苫、路由裁厅、斷路和其他與連接相關(guān)的特性。
sidecar模式隨著容器的應(yīng)用越來越廣泛侨艾,很多流行框架都基于該模式來實(shí)現(xiàn)例如dapr执虹,以及其他基于kubernetes構(gòu)建的應(yīng)用。