##部署微服務:Spring Cloud vs. Kubernetesgit
Spring Cloud vs. Kubernetes,誰纔是部署微服務的最佳拍檔?github
Spring Cloud和Kubernetes都聲稱本身是開發和運行微服務的最佳環境,但二者在特性上並不相同,解決的問題點也不同。本文將探討這兩種平臺對於微服務架構的交付有何做用、二者在哪些方面表現更好以及如何利用這兩種平臺在微服務架構的路上取得成功。spring
我最近拜讀了 A.Lukyanchikov關於如何利用Spring Cloud
和Docker
搭建微服務的文章,推薦你們也看一看。編程
想要搭建一個能夠十倍、百倍擴展服務的彈性伸縮微服務系統,須要藉助具備寬泛構建時間和運行時能力的工具集進行集中的管理和治理。服務器
Spring Cloud
包括了各類功能性服務(如統計服務,賬戶服務和通知服務)和支持基礎設施服務(如日誌分析,配置服務器,服務發現,受權服務)。架構
下圖展現使用Spring Cloud
的微服務架構:負載均衡
運維
(Spring Cloud
微服務架構,by A. Lukyanchikov)分佈式
該圖展現了運行時的方方面面,但沒有包括打包、持續集成、伸縮、高可用和自我修復等在微服務架構中重要點。本文假設大多數JAVA
開發者熟悉Spring Cloud
,採用類比的形式,經過解決以上要點問題,帶你們瞭解Kubernetes
和Spring Cloud
之間的關係。ide
咱們在此不進行特性的逐個對比,而是從大面上看一看微服務的要點並聊一聊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和Spring Cloud Kubernetes)。
想要進一步理解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
是多語言且語言不敏感的容器管理平臺,可以運行雲原生和傳統的容器化應用程序。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
是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 搬運:好雨科技 爲方便閱讀原文略有刪改