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