部署微服務(wù):Spring Cloud pk Kubernetes
本文轉(zhuǎn)載自微信公眾號(hào)「新鈦云服」,作者徐磊 翻譯。轉(zhuǎn)載本文請(qǐng)聯(lián)系新鈦云服錄公眾號(hào)。
Spring Cloud和Kubernetes都聲稱是開發(fā)和微服務(wù)的最佳運(yùn)行環(huán)境,但它們本質(zhì)上非常不同。在本文中,我們將了解他們?nèi)绾螏椭桓痘谖⒎?wù)的架構(gòu) (MSA),它們擅長哪些領(lǐng)域,以及如何利用自身優(yōu)勢(shì)在微服務(wù)之旅中取得兩全其美的結(jié)果。
使用 Spring Cloud 創(chuàng)建一個(gè)基于微服務(wù)的系統(tǒng)需要一些什么?
為了構(gòu)建一個(gè)可擴(kuò)展且具有彈性的微服務(wù)系統(tǒng),該系統(tǒng)支持增長到數(shù)十或數(shù)百個(gè)服務(wù),必須借助具有廣泛構(gòu)建時(shí)間和runtime功能的工具集對(duì)其進(jìn)行集中管理和治理。使用 Spring Cloud,這涉及實(shí)現(xiàn)功能服務(wù)(例如統(tǒng)計(jì)服務(wù)、帳戶服務(wù)和通知服務(wù))和支持基礎(chǔ)設(shè)施服務(wù)(例如日志分析、配置服務(wù)器、服務(wù)發(fā)現(xiàn)、身份驗(yàn)證服務(wù))。使用 Spring Cloud 描述此類 MSA 的圖表如下:
該圖涵蓋了系統(tǒng)的運(yùn)行時(shí)方面,但沒有涉及封裝、CICD、擴(kuò)展、高可用性和自我修復(fù),這些在 MSA 中也非常重要。假設(shè)大多數(shù) Java 開發(fā)人員都熟悉 Spring Cloud,在本文中,我們將通過解決這些問題來繪制一個(gè)平衡點(diǎn),看看 Kubernetes 與 Spring Cloud 之間的關(guān)系。
微服務(wù)問題
與其逐個(gè)進(jìn)行功能比較,不如讓我們來看看更廣泛的微服務(wù)關(guān)注點(diǎn),看看 Spring Cloud 和 Kubernetes 如何處理這些問題。
關(guān)于 MSA 的好處在于,它是一種具有易于理解和權(quán)衡的架構(gòu)風(fēng)格 。微服務(wù)支持強(qiáng)大的模塊邊界,具有獨(dú)立部署和技術(shù)多樣性。它們是以開發(fā)分布式系統(tǒng)和大量運(yùn)營開銷為代價(jià)的。一個(gè)關(guān)鍵的成功因素是專注于能夠幫助您盡可能多的解決 MSA 問題。使啟動(dòng)過程快速而簡單很重要。
在上圖中,我們可以看到一個(gè)列表,其中包含必須在 MSA 中解決的最常見的技術(shù)問題。
- 技術(shù)映射
Spring Cloud 和 Kubernetes 這兩個(gè)平臺(tái)非常不同,它們之間沒有直接的功能對(duì)等。如果我們將每個(gè) MSA 關(guān)注點(diǎn)映射到用于在兩個(gè)平臺(tái)中解決它的技術(shù),我們會(huì)得出下表。
上表的主要結(jié)論是:
Spring Cloud 擁有一組豐富的、集成良好的 Java 庫,可以將所有runtime問題作為應(yīng)用程序堆棧的一部分來解決。因此,微服務(wù)本身有庫和runtime代理來進(jìn)行客戶端服務(wù)發(fā)現(xiàn)、負(fù)載平衡、配置更新、指標(biāo)跟蹤等。單例集群服務(wù)和批處理作業(yè)等模式也在 JVM 中進(jìn)行管理。
Kubernetes 是多語言的,不僅針對(duì) Java 平臺(tái),而且以通用方式解決所有語言的分布式計(jì)算挑戰(zhàn)。它為平臺(tái)級(jí)別和應(yīng)用程序堆棧之外的配置管理、服務(wù)發(fā)現(xiàn)、負(fù)載平衡、跟蹤、度量、單例、計(jì)劃作業(yè)提供服務(wù)。該應(yīng)用程序不需要任何用于客戶端邏輯的庫或代理,并且可以用任何語言編寫。
在某些領(lǐng)域,兩個(gè)平臺(tái)都依賴類似的第三方工具。例如,ELK 和 EFK 堆棧、跟蹤庫等。例如 Hystrix 和 Spring Boot,在這兩種環(huán)境中同樣有用。在某些領(lǐng)域,兩個(gè)平臺(tái)是互補(bǔ)的,可以組合在一起,以創(chuàng)建更強(qiáng)大的解決方案( KubeFlix和 Spring Cloud Kubernetes就是這樣的例子)。
- 微服務(wù)要求
為了展示每個(gè)項(xiàng)目的范圍,這里有一張表格,其中包含端到端的 MSA 要求,從底部的硬件到頂部的 DevOps 和自助服務(wù)體驗(yàn),以及它們之間的關(guān)系到 Spring Cloud 和 Kubernetes 平臺(tái)。
在某些情況下,兩個(gè)項(xiàng)目使用不同的方法滿足相同的要求,并且在某些領(lǐng)域,一個(gè)項(xiàng)目可能比另一個(gè)項(xiàng)目更強(qiáng)大。但也有一個(gè)好處,兩個(gè)平臺(tái)相互補(bǔ)充,可以結(jié)合互補(bǔ),以獲得卓越的微服務(wù)體驗(yàn)。
例如,Spring Boot 提供了用于構(gòu)建單個(gè)jar應(yīng)用程序包的Maven插件。結(jié)合 Docker 和 Kubernetes 的聲明式部署和調(diào)度功能,運(yùn)行微服務(wù)變得輕而易舉。
同樣,Spring Cloud 具有應(yīng)用程序內(nèi)庫,用于使用 Hystrix和Ribbon創(chuàng)建彈性、容錯(cuò)的微服務(wù)。但這還不夠,當(dāng)它與Kubernetes 的健康檢查結(jié)合時(shí),進(jìn)程會(huì)重新啟動(dòng),
- 對(duì)比
Spring Cloud
Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具,例如配置管理、服務(wù)發(fā)現(xiàn)、路由等。它構(gòu)建在 Netflix OSS庫之上,用Java編寫,供Java開發(fā)人員使用
優(yōu)點(diǎn):
- Spring Platform自身提供的統(tǒng)一編程模型和Spring Boot的快速應(yīng)用創(chuàng)建能力,為開發(fā)者提供了極佳的微服務(wù)開發(fā)體驗(yàn)。例如,使用很少的注釋,您可以創(chuàng)建一個(gè)配置服務(wù)器。
- 有豐富的庫選擇,涵蓋了大多數(shù)runtime問題。由于所有庫都是用 Java 編寫的,因此它提供了多種功能、更好的控制和微調(diào)選項(xiàng)。
- 不同的 Spring Cloud庫彼此很好地集成在一起。例如,一個(gè)Feign客戶端也將使用Hystrix進(jìn)行斷路,使用Ribbon進(jìn)行負(fù)載均衡請(qǐng)求。一切都是注解驅(qū)動(dòng)的,使 Java 開發(fā)人員可以輕松開發(fā)。
缺點(diǎn):
Spring Cloud 的主要優(yōu)點(diǎn)之一也是它的缺點(diǎn)——它僅限于 Java。MSA的一個(gè)強(qiáng)大動(dòng)機(jī)是能夠在需要時(shí)交換技術(shù)堆棧、庫甚至語言。這在 Spring Cloud中是不可能的。如果你想使用SpringCloud/Netflix OSS基礎(chǔ)服務(wù),比如配置管理、服務(wù)發(fā)現(xiàn)或者負(fù)載均衡,解決方案并不優(yōu)雅。
Java 開發(fā)人員需要關(guān)心和處理 Java 應(yīng)用程序的問題太多。每個(gè)微服務(wù)都需要運(yùn)行各種客戶端來進(jìn)行配置檢索、服務(wù)發(fā)現(xiàn)和負(fù)載均衡。設(shè)置它們很容易,但這并不會(huì)隱藏構(gòu)建時(shí)和runtime對(duì)環(huán)境的依賴。例如,開發(fā)人員可以使用EnableConfigServer創(chuàng)建一個(gè) Config Server,但這只是一種方式。每次開發(fā)人員想要運(yùn)行單個(gè)微服務(wù)時(shí),他們都需要啟動(dòng)并運(yùn)行配置服務(wù)器。對(duì)于受控環(huán)境,開發(fā)人員必須考慮使Config Server高可用,并且它支持Gi或Svn,因此他們需要一個(gè)共享文件系統(tǒng)。同樣,對(duì)于服務(wù)發(fā)現(xiàn),開發(fā)者需要先啟動(dòng)一個(gè) Eureka服務(wù)器。
Spring Cloud 本身在微服務(wù)旅程中的范圍較短,開發(fā)人員還需要考慮自動(dòng)化部署、調(diào)度、資源管理、進(jìn)程隔離、自愈、構(gòu)建管道等,以獲得完整的微服務(wù)體驗(yàn)。在這一點(diǎn)上,我認(rèn)為將Spring Cloud單獨(dú)與Kubernetes進(jìn)行比較是不公平的,而在 Spring Cloud + Cloud Foundry(或 Docker Swarm)和 Kubernetes之間進(jìn)行比較更公平 。但這也意味著,要獲得完整的端到端微服務(wù)體驗(yàn),Spring Cloud必須輔以Kubernetes本身這樣的應(yīng)用平臺(tái)。
Kubernetes
Kubernetes 是一個(gè)開源系統(tǒng),用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序。它是多語言的,并提供用于配置、運(yùn)行、擴(kuò)展和管理分布式系統(tǒng)。
優(yōu)點(diǎn):
Kubernetes 是一個(gè)多語言和語言不可知的容器管理平臺(tái),能夠運(yùn)行云原生和傳統(tǒng)容器化應(yīng)用程序。它提供的服務(wù),例如配置管理、服務(wù)發(fā)現(xiàn)、負(fù)載均衡、指標(biāo)收集和日志聚合,可以被多種語言使用。這允許在組織中擁有一個(gè)平臺(tái),可供多個(gè)團(tuán)隊(duì)(包括使用Spring的Java開發(fā)人員)使用并服務(wù)于多種用途:應(yīng)用程序開發(fā)、測(cè)試環(huán)境、構(gòu)建環(huán)境(運(yùn)行源控制系統(tǒng)、構(gòu)建服務(wù)器、工件存儲(chǔ)庫)等。
與 Spring Cloud 相比,Kubernetes 解決了更廣泛的 MSA 問題。除了提供runtime服務(wù),Kubernetes 還允許您配置環(huán)境、設(shè)置資源約束、RBAC、管理應(yīng)用程序生命周期、啟用自動(dòng)擴(kuò)展和自我修復(fù)。
Kubernetes 技術(shù)基于谷歌 15 年的研發(fā)和管理容器的經(jīng)驗(yàn)。是Github上最活躍的開源社區(qū)之一。
缺點(diǎn):
Kubernetes 是多語言的,因此,它的服務(wù)和原語是通用的,沒有針對(duì)不同的平臺(tái)(如 Spring Cloud for JVM)進(jìn)行優(yōu)化。例如,配置作為環(huán)境變量或掛載的文件系統(tǒng)傳遞給應(yīng)用程序。它沒有Spring Cloud Config 提供的花哨的配置更新功能。
Kubernetes 不是面相開放人員的平臺(tái)。它旨在供具有DevOps意識(shí)的IT人員使用。因此,Java 開發(fā)人員需要學(xué)習(xí)一些新概念并學(xué)習(xí)解決問題的新方法。盡管使用MiniKube啟動(dòng) Kubernetes 實(shí)例非常容易,但手動(dòng)安裝高可用的 Kubernetes 集群會(huì)產(chǎn)生大量的操作開銷。
Kubernetes 仍然是一個(gè)相對(duì)較新的平臺(tái),并且仍在積極開發(fā)和成長中。因此,每個(gè)版本都添加了許多新功能,而且 API 是可擴(kuò)展和向后兼容的。
兩全其美
這兩個(gè)框架都解決了不同范圍的 MSA 問題,而且它們以根本不同的方式來解決。
Spring Cloud試圖解決 JVM 內(nèi)部的MSA挑戰(zhàn),而 Kubernetes試圖通過在平臺(tái)級(jí)別解決問題來讓開發(fā)人員解決問題。
Spring Cloud在JVM內(nèi)部非常強(qiáng)大,而Kubernetes在管理這些 JVM 方面非常強(qiáng)大。因此,將它們結(jié)合起來并取其精華去其糟粕。
- 通過這樣的組合,Spring 提供應(yīng)用程序打包,Docker 和 Kubernetes 提供部署和調(diào)度。Spring 通過 Hystrix 線程池提供應(yīng)用內(nèi)隔離,Kubernetes 通過資源、進(jìn)程和命名空間隔離提供邏輯隔離。Spring 為每個(gè)微服務(wù)提供健康端點(diǎn),Kubernetes 執(zhí)行健康檢查和流量路由到健康服務(wù)。Spring 外部化和更新配置,Kubernetes 將配置分發(fā)到每個(gè)微服務(wù)。配合默契,簡直完美。
個(gè)人最喜歡的微服務(wù)堆棧
一張圖足以涵蓋,請(qǐng)看圖:
原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes