使用Sidecar搭建異構平臺的微服務
本文介紹Sidecar模式的特點,及其應用的場景。熟悉Native Cloud或者微服務的童鞋應該知道,在雲環境下,技術棧可以是多種多樣的。那麼如何能夠將這些異構的服務元件串聯起來,成為了服務治理的一個重大課題。而Sidecar模式為服務治理,提供了一種解決方案。
將應用程式的元件部署到單獨的程序或容器中,以提供隔離和封裝。此模式還可以使應用程式由異構元件和技術組成。
這種模式被稱為Sidecar,因為它類似於連線到摩托車的邊車。在該模式中,邊車附加到父應用程式併為應用程式提供支援功能。 sidecar還與父應用程式共享相同的生命週期,與父項一起建立和退役。邊車圖案有時被稱為搭接圖案並且是分解圖案。
問題背景
應用程式和服務通常需要相關的功能,例如監控、日誌、集中化配置和網路服務等。這些外圍任務可以作為單獨的元件或服務來實現。
如果它們緊密整合到應用程式中,它們可以在與應用程式相同的程序中執行,從而有效地使用共享資源。但是,這也意味著它們沒有很好地隔離,並且其中一個元件的中斷可能會影響其他元件或整個應用程式。此外,它們通常需要使用與父應用程式相同的語言或者技術棧來實現。因此,元件和應用程式彼此之間具有密切的相互依賴性。
如果將應用程式分解為服務,則可以使用不同的語言和技術構建每個服務。雖然這提供了更大的靈活性,但這意味著每個元件都有自己的依賴關係,並且需要特定於語言的庫來訪問底層平臺以及與父應用程式共享的任何資源。此外,將這些功能部署為單獨的服務可能會增加應用程式的延遲。管理這些特定於語言的介面的程式碼和依賴關係也會增加相當大的複雜性,尤其是對於託管、部署和管理服務。
解決方案
上述問題的解決方案是,將一組緊密結合的任務與主應用程式共同放在一臺主機(Host)中,但會將它們部署在各自的程序或容器中。這種方式也被稱為“Sidecar(邊車)模式”。
下圖展示了任務與主應用程式的部署關係圖。

Sidecar模式
邊車服務不一定是應用程式的一部分, Java進階內推交流群851531810 而是與之相關聯。它適用於父應用程式的任何位置。Sidecar支援與主應用程式一起部署的程序或服務。這就像是如下圖所示的邊三輪摩托車那樣,將邊車安裝在一輛摩托車上,就變成了邊三輪摩托車。每輛邊三輪摩托車都有自己的邊車。類似同樣的方式,邊車服務共享其父應用程式的主機。對於應用程式的每個例項,邊車的例項被部署並與其一起託管。

使用邊車模式的優點包括:
在執行時環境和程式語言方面,邊車獨立於其主要應用程式,因此不需要為每種語言開發一個邊車。
邊車可以訪問與主應用程式相同的資源。例如,邊車可以監視邊車和主應用程式使用的系統資源。
由於它靠近主應用程式,因此在它們之間進行通訊時沒有明顯的延遲。
即使對於不提供可擴充套件性機制的應用程式,也可以使用邊車通過將其作為自己的程序附加到與主應用程式相同的主機或子容器中來擴充套件功能。
Sidecar模式通常與容器一起使用,並稱為邊車容器。有關容器方面的內容,可以參閱https://waylau.com/ahout-docker/。
Sidecar模式的實現
Spring Cloud Netflix Sidecar框架提供了Sidecar模式的現成解決方案。Spring Cloud Netflix Sidecar框架框架可以提供對其他非Spring Cloud技術棧的微服務的治理。比如,你可以使用Node或者Golang編寫一個Web專案,這個服務同樣可以以Sidecar模式,納入到Spring Cloud管理中去。
下面是實現步驟。
1. 為Web專案新增健康檢查介面
提供REST介面,返回JSON格式內容{"status" : "up"}。其中status用於描述微服務的狀態,常見的取值有UP、DOWN、OUT_OF_SERVICE和UNKNOWN等。
2. 編寫Sidecar微服務
建立專案,新增Eureka、Sidecar的依賴:
org.springframework.cloudspring-cloud-netflix-sidecarorg.springframework.cloudspring-cloud-starter-eureka
啟動類上加上@EnableSidecar註解。這是一個組合註解,它整合了三個註解,分別是@EnableCircuiBreaker和@EnableDiscoveryClient。
在配置檔案中加入埠號、服務名稱、Eureka地址以及Web專案的埠以及健康檢查地址,如:
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
啟動專案,並訪問8887介面,就可以訪問到Web專案中的介面。
3. Sidecar的一些端點
以下是Sidecar的常用端點:
/hosts/{serviceId} 指定微服務在Eureka上的例項列表
/ping 返回OK字串
/{serviceId} 請求對應的微服務
4. 部署應用
將Sidecar與Web服進行部署。一般是部署在相同的主機裡面。
最後,給大家推薦一個 Java進階內推交流群851531810 ,不管你在地球哪個方位,不管你參加工作幾年都歡迎你的入駐!(群內會免費提供一些群主收藏的免費學習書籍資料以及整理好的幾百道面試題和答案文件!)