本文介紹Sidecar模式的特點(diǎn)彼念,及其應(yīng)用的場(chǎng)景。熟悉Native Cloud或者微服務(wù)的童鞋應(yīng)該知道腌逢,在云環(huán)境下降淮,技術(shù)棧可以是多種多樣的搏讶。那么如何能夠?qū)⑦@些異構(gòu)的服務(wù)組件串聯(lián)起來(lái)佳鳖,成為了服務(wù)治理的一個(gè)重大課題霍殴。而Sidecar模式為服務(wù)治理,提供了一種解決方案系吩。
將應(yīng)用程序的組件部署到單獨(dú)的進(jìn)程或容器中来庭,以提供隔離和封裝。此模式還可以使應(yīng)用程序由異構(gòu)組件和技術(shù)組成淑玫。
這種模式被稱為Sidecar巾腕,因?yàn)樗愃朴谶B接到摩托車的邊車。在該模式中絮蒿,邊車附加到父應(yīng)用程序并為應(yīng)用程序提供支持功能尊搬。 sidecar還與父應(yīng)用程序共享相同的生命周期,與父項(xiàng)一起創(chuàng)建和退役土涝。邊車圖案有時(shí)被稱為搭接圖案并且是分解圖案佛寿。
問(wèn)題背景
應(yīng)用程序和服務(wù)通常需要相關(guān)的功能,例如監(jiān)控但壮、日志冀泻、集中化配置和網(wǎng)絡(luò)服務(wù)等。這些外圍任務(wù)可以作為單獨(dú)的組件或服務(wù)來(lái)實(shí)現(xiàn)蜡饵。
如果它們緊密集成到應(yīng)用程序中弹渔,它們可以在與應(yīng)用程序相同的進(jìn)程中運(yùn)行,從而有效地使用共享資源溯祸。但是肢专,這也意味著它們沒(méi)有很好地隔離,并且其中一個(gè)組件的中斷可能會(huì)影響其他組件或整個(gè)應(yīng)用程序焦辅。此外博杖,它們通常需要使用與父應(yīng)用程序相同的語(yǔ)言或者技術(shù)棧來(lái)實(shí)現(xiàn)。因此筷登,組件和應(yīng)用程序彼此之間具有密切的相互依賴性剃根。
如果將應(yīng)用程序分解為服務(wù),則可以使用不同的語(yǔ)言和技術(shù)構(gòu)建每個(gè)服務(wù)前方。雖然這提供了更大的靈活性狈醉,但這意味著每個(gè)組件都有自己的依賴關(guān)系,并且需要特定于語(yǔ)言的庫(kù)來(lái)訪問(wèn)底層平臺(tái)以及與父應(yīng)用程序共享的任何資源惠险。此外舔糖,將這些功能部署為單獨(dú)的服務(wù)可能會(huì)增加應(yīng)用程序的延遲。管理這些特定于語(yǔ)言的接口的代碼和依賴關(guān)系也會(huì)增加相當(dāng)大的復(fù)雜性莺匠,尤其是對(duì)于托管、部署和管理服務(wù)十兢。
解決方案
上述問(wèn)題的解決方案是趣竣,將一組緊密結(jié)合的任務(wù)與主應(yīng)用程序共同放在一臺(tái)主機(jī)(Host)中摇庙,但會(huì)將它們部署在各自的進(jìn)程或容器中。這種方式也被稱為“Sidecar(邊車)模式”遥缕。
下圖展示了任務(wù)與主應(yīng)用程序的部署關(guān)系圖卫袒。
Sidecar模式
邊車服務(wù)不一定是應(yīng)用程序的一部分,Java進(jìn)階內(nèi)推交流群851531810而是與之相關(guān)聯(lián)单匣。它適用于父應(yīng)用程序的任何位置夕凝。Sidecar支持與主應(yīng)用程序一起部署的進(jìn)程或服務(wù)。這就像是如下圖所示的邊三輪摩托車那樣户秤,將邊車安裝在一輛摩托車上码秉,就變成了邊三輪摩托車。每輛邊三輪摩托車都有自己的邊車鸡号。類似同樣的方式转砖,邊車服務(wù)共享其父應(yīng)用程序的主機(jī)。對(duì)于應(yīng)用程序的每個(gè)實(shí)例鲸伴,邊車的實(shí)例被部署并與其一起托管府蔗。
使用邊車模式的優(yōu)點(diǎn)包括:
在運(yùn)行時(shí)環(huán)境和編程語(yǔ)言方面,邊車獨(dú)立于其主要應(yīng)用程序汞窗,因此不需要為每種語(yǔ)言開發(fā)一個(gè)邊車姓赤。
邊車可以訪問(wèn)與主應(yīng)用程序相同的資源。例如仲吏,邊車可以監(jiān)視邊車和主應(yīng)用程序使用的系統(tǒng)資源不铆。
由于它靠近主應(yīng)用程序,因此在它們之間進(jìn)行通信時(shí)沒(méi)有明顯的延遲蜘矢。
即使對(duì)于不提供可擴(kuò)展性機(jī)制的應(yīng)用程序狂男,也可以使用邊車通過(guò)將其作為自己的進(jìn)程附加到與主應(yīng)用程序相同的主機(jī)或子容器中來(lái)擴(kuò)展功能。
Sidecar模式通常與容器一起使用品腹,并稱為邊車容器岖食。有關(guān)容器方面的內(nèi)容,可以參閱https://waylau.com/ahout-docker/舞吭。
Sidecar模式的實(shí)現(xiàn)
Spring Cloud Netflix Sidecar框架提供了Sidecar模式的現(xiàn)成解決方案泡垃。Spring Cloud Netflix Sidecar框架框架可以提供對(duì)其他非Spring Cloud技術(shù)棧的微服務(wù)的治理。比如羡鸥,你可以使用Node或者Golang編寫一個(gè)Web項(xiàng)目蔑穴,這個(gè)服務(wù)同樣可以以Sidecar模式,納入到Spring Cloud管理中去惧浴。
下面是實(shí)現(xiàn)步驟存和。
1. 為Web項(xiàng)目添加健康檢查接口
提供REST接口,返回JSON格式內(nèi)容{"status" : "up"}。其中status用于描述微服務(wù)的狀態(tài)捐腿,常見的取值有UP纵朋、DOWN、OUT_OF_SERVICE和UNKNOWN等茄袖。
2. 編寫Sidecar微服務(wù)
創(chuàng)建項(xiàng)目操软,添加Eureka、Sidecar的依賴:
org.springframework.cloudspring-cloud-netflix-sidecarorg.springframework.cloudspring-cloud-starter-eureka
啟動(dòng)類上加上@EnableSidecar注解宪祥。這是一個(gè)組合注解聂薪,它整合了三個(gè)注解,分別是@EnableCircuiBreaker和@EnableDiscoveryClient蝗羊。
在配置文件中加入端口號(hào)藏澳、服務(wù)名稱、Eureka地址以及Web項(xiàng)目的端口以及健康檢查地址肘交,如:
server.port=8887spring.application.name=sidecar-mylife-serviceeureka.client.serviceUrl.defaultZone=http://localhost:8881/eureka/eureka.client.instance.prefer-ip-address=truesidecar.port=8080sidecar.health-uri=http://localhost:8080/healtheureka.instance.hostname=localhost
啟動(dòng)項(xiàng)目笆载,并訪問(wèn)8887接口,就可以訪問(wèn)到Web項(xiàng)目中的接口涯呻。
3. Sidecar的一些端點(diǎn)
以下是Sidecar的常用端點(diǎn):
/hosts/{serviceId}?指定微服務(wù)在Eureka上的實(shí)例列表
/ping?返回OK字符串
/{serviceId}?請(qǐng)求對(duì)應(yīng)的微服務(wù)
4. 部署應(yīng)用
將Sidecar與Web服進(jìn)行部署凉驻。一般是部署在相同的主機(jī)里面。
最后复罐,給大家推薦一個(gè)Java進(jìn)階內(nèi)推交流群851531810涝登,不管你在地球哪個(gè)方位,不管你參加工作幾年都?xì)g迎你的入駐Pё纭(群內(nèi)會(huì)免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書籍資料以及整理好的幾百道面試題和答案文檔U凸觥)