部署微服務:Spring Cloud vs. Kubernetes
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
Spring Cloud vs. Kubernetes,誰才是部署微服務的最佳拍檔?
Spring Cloud和Kubernetes都聲稱自己是開發和運行微服務的最佳環境,但兩者在特性上並不相同,解決的問題點也不一樣。本文將探討這兩種平台對於微服務架構的交付有何作用、兩者在哪些方面表現更好以及如何利用這兩種平台在微服務架構的路上取得成功。背景故事
想要搭建一個可以十倍、百倍擴展服務的彈性伸縮微服務系統,需要藉助具有寬泛構建時間和運行時能力的工具集進行集中的管理和治理。Spring Cloud
包括了各種功能性服務(如統計服務,帳戶服務和通知服務)和支持基礎設施服務(如日誌分析,配置服務器,服務發現,授權服務)。下圖展示使用
Spring Cloud
的微服務架構:(
Spring Cloud
微服務架構,by A. Lukyanchikov )該圖展示了運行時的方方面面,但沒有包括打包、持續集成、伸縮、高可用和自我修復等在微服務架構中重要點。本文假設大多數
JAVA
開發者熟悉Spring Cloud
,採用類比的形式,通過解決以上要點問題,帶大家了解Kubernetes
和Spring Cloud
之間的關係。微服務要點
我們在此不進行特性的逐個對比,而是從大面上看一看微服務的要點並聊一聊
微服務架構的一大優勢是易於理解的架構風格,可實現強大的模塊邊界,並且具有獨立的部署和技術多樣性,但需要付出的代價也是顯而易見的——開發分佈式系統的成本和運維開銷。Spring Cloud
和Kubernetes
如何實現。而微服務架構能否成功實踐,利用各種工具解決潛在問題是關鍵。把啟動過程變得快速簡單很重要,但通往生產環境的旅程是漫長的,你需要不斷進步才能成功。
上圖是需要在微服務架構中最常見的技術要點(在這裡,我們不涉及那些非技術要點,比如組織結構、公司文化等等)
技術對比
Spring Cloud
和Kubernetes
有很大的不同,並沒有直接可比的特性,如果對照微服務架構的要點,可以得出如下的技術對比圖表:從上表我們可以得知:
Spring Cloud
有一套豐富且集成良好的JAVA
庫,作為應用棧的一部分解決所有運行時問題。因此,微服務本身可以通過庫和運行時代理解決客戶端服務發現、負載均衡、配置更新、統計跟踪等。工作模式就像单实例服务集群
(譯者註:集群中master節點工作,當master掛掉後,slave節點被選舉頂替。)並且一批工作也是在JVM中被管理。Kubernetes
是多語言的,不僅僅針對Java
平台,而是以通用的方式為所有語言解決分佈式計算問題。Kubernetes
提供了配置管理、服務發現、負載均衡、跟踪、統計、單實例、平台級和應用棧之外的調度工作。該應用不需要任何客戶端邏輯的庫或代理程序,可以用任何語言編寫。- 兩個平台依靠相似的第三方工具,如
ELK
和EFK stacks, tracing libraries
等。Hystrix
和Spring Boot
等庫,在兩個環境中都表現良好。很多情況下,Spring Cloud
和Kubernetes
可以形成互補,組建出更強大的解決方案(例如KubeFlix 31和Spring Cloud Kubernetes 41)。
微服務需求
想要進一步理解
Spring Cloud
和Kubernetes
的適用範圍,可以參考下圖微服務架構需求。有些需求,
Spring Cloud
表現更好,有需求則是Kubernetes
,也有些需求,兩者可以用不同的方式滿足。好消息是,Spring Cloud
和Kubernetes
在使用上並不衝突。例如,Spring Cloud
提供Maven
插件來創建單獨JAR應用程序包。結合Docker、Kubernetes
的聲明式部署和調度能力,輕鬆運行微服務。同樣,Sring Cloud
以應用程序內的包裝庫的形式來支持彈性伸縮,微服務容錯使用Hystrix
(bulkhead
和斷路器模式)與Ribbon
(負載均衡)。但這些是不夠的,當組合Kubernetes
健康檢查、程序重啟和自動伸縮能力,微服務才真正變成一個強壯的系統。優缺點
Spring Cloud
Spring Cloud
為開發者提供了快速構建分佈式系統中的一些常見模式的工具,例如配置管理,服務發現,斷路器,路由等。它是為Java開發人員使用,構建在Netflix OSS
庫之上的。優點
Spring Platform
提供的統一編程模型和Spring Boot
的快速應用程序創建能力,為開發人員提供了很好的微服務開發體驗。使用很少的註解,就可以創建一個配置服務器或獲得客戶端庫來配置您的服務。- 豐富的庫支持,覆蓋大多數運行時需求。
Spring Cloud
的所有庫均由JAVA
編寫,提供多特性、高控制和易配置。 - 不同的
Spring Cloud
庫彼此完全兼容。例如,Feign
客戶端還將使用Hystrix
用於斷路器、Ribbon
用於負載均衡請求。一切都是註解驅動的,易於Java
開發者開發。
- 僅使用
JAVA
,既是Spring Cloud
的優點,也是一大缺陷。微服務架構之所以吸引人,在於按需交換各種技術棧、庫,甚至語言的能力。這一點,Spring Cloud
做不到。如果你想使用Spring Cloud/Netflix OSS
基礎設置服務,例如配置管理、服務發現或者負載均衡,解決方案是不優雅的。雖然Netflix Prana
項目實現了sidecar
模式,顯示基於Java
客戶類庫越過HTTP
,使得用non-JVM
語言編寫的應用程序存在於NetflixOSS
生態系統變得可能,但它仍然不是很優雅。 - 除了
JAVA
應用程序,還有太多與開發無關的事情需要Java
開發人員處理。每個微服務需要運行各種客戶端以進行配置檢索、服務發現和負載均衡。雖然很容易設置,但這並不會降低對環境的構建時間和運行的依賴性。例如,開發人員可以使用@EnableConfigServer
創建一個配置服務器,但這只是開心的假象。每當開發人員想要運行單個微服務時,他們需要啟動並運行Config Server
。對於受控環境,開發人員必須考慮使Config Server
高度可用,並且由於它可以由Git
或SVN
支持,因此它們需要一個共享文件系統。同樣,對於服務發現,開發人員也是需要首先啟動Eureka
服務器。為了創建一個受控的環境,他們需要在每個AZ上使用多個實例實現集群。可以說,開發人員除了實現所有功能外,還需要額外管理一個複雜的微服務平台。 Spring Cloud
目前在微服務方面覆蓋的面相對有限,開發人員還需要考慮自動化部署、調度、資源管理、過程隔離、自我修復、構建流水線等,以獲得完整的微服務體驗。對於這點,我認為拿Spring Cloud
和Kubernetes
比較是不公平的,應該比較Spring Cloud + Cloud Foundry (or Docker Swarm)
和Kubernetes
。但這也意味著對於一個完整的端到端微服務體驗,Spring Cloud
必須補充一個像Kubernetes
這樣的應用程序平台。
Kubernetes
是一個用於自動化部署、擴展和管理容器化應用程序的開源系統。支持多種語言並且提供用於支持、運行、擴展和管理分佈式系統的操作系統。優點
Kubernetes
是多語言且語言不敏感的容器管理平台,能夠運行雲原生和傳統的容器化應用程序。Kubernetes
提供的服務(如配置管理、服務發現、負載均衡、測試指標收集和日誌聚合)可供各種語言使用。這意味著一個平台可以被多個團隊(包括使用Spring
的Java
開發人員)使用,並提供多種用途:應 用程序開發、測試環境、構建環境(源碼運行、構建服務、依賴倉庫)等。- 與
Spring Cloud
相比,Kubernetes
解決了更廣的微服務架構問題。除了提供運行時服務,Kubernetes
也可以讓你制定環境、設置資源限制、RBAC、管理應用程序生命週期、允許自動擴容和自我修復(幾乎表現得像一個抗脆弱平台)。 Kubernetes
技術基於Google
十五年的研發和容器管理經驗。此外,Kubernetes
有近1000個貢獻者,是Github
上最活躍的開源社區之一。
Kubernetes
是多語言的,因此它的服務是通用的,並不針對不同的平台(如Spring Cloud for JVM
)進行優化。例如,配置會作為環境變量傳遞給應用程序或掛載的文件系統。它沒有像Spring Cloud Config
提供的配置更新功能。Kubernetes
不是一個以開發者為中心的平台,更偏向於DevOps
的IT人員使用。因此,Java
開發人員需要學習一些新的概念,需要學習解決問題的新方法。儘管通過MiniKuber
開始一個Kubernetes
開發實例很簡單,但手動安裝一個高可用的Kubernetes
集群仍顯得有些複雜。Kubernetes
是一個相對較新的平台(2歲),仍然在發展和成長,每個版本都添加了很多新功能,可能很難跟上。好消息是,這一點已經被考慮到了,Kubernetes
的API
將是可擴展和向後兼容的。
Spring Cloud和Kubernetes的最佳實踐
如你所見,
Spring Cloud
和Kubernetes
在核心領域都很強,並且正在其他領域努力改進。Spring Cloud
可以快速使用,對開發者比較友好;而Kubernetes
是DevOps
的絕配,雖然學起來可能有點難,但是覆蓋了更廣泛的微服務技術要點。Spring Cloud
和Kubernetes
處理了不同範圍的微服務架構技術點,而且是用了不同的方法。Spring Cloud
方法是試圖解決在JVM
中的微服務架構要點,而Kubernetes
方法是試圖讓問題消失,為開發者在平台層解決。Spring Cloud
在JVM
中非常強大,Kubernetes
管理那些JVM
很強大。看起來各取所長,充分利用這兩者的優勢是自然而然的趨勢了。結合使用
Spring Cloud
和Kubernetes
,用Spring Cloud
提供應用程序打包,Docker
和Kubernetes
提供部署和調度;Spring
通過Hystrix
線程池提供應用程序內隔離,Kubernetes
通過資源、進程和命名空間隔離;Spring
為每個微服務提供健康終端,Kubernetes
執行健康檢查並且為健康服務的通信提供路由;Spring
外部化且升級配置,Kubernetes
給每個微服務分配配置......這樣的例子還有很多。作者:Bilgin Ibryam
原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes 52
搬運:好雨科技
為方便閱讀原文略有刪改
- 取得連結
- X
- 以電子郵件傳送
- 其他應用程式
留言
張貼留言