部署微服務:Spring Cloud vs. Kubernetes

##部署微服務:Spring Cloud vs. Kubernetesgit

Spring Cloud vs. Kubernetes,誰纔是部署微服務的最佳拍檔?github

Spring Cloud和Kubernetes都聲稱本身是開發和運行微服務的最佳環境,但二者在特性上並不相同,解決的問題點也不同。本文將探討這兩種平臺對於微服務架構的交付有何做用、二者在哪些方面表現更好以及如何利用這兩種平臺在微服務架構的路上取得成功。spring

背景故事

我最近拜讀了 A.Lukyanchikov關於如何利用Spring CloudDocker搭建微服務的文章,推薦你們也看一看。編程

想要搭建一個能夠十倍、百倍擴展服務的彈性伸縮微服務系統,須要藉助具備寬泛構建時間和運行時能力的工具集進行集中的管理和治理。服務器

Spring Cloud包括了各類功能性服務(如統計服務,賬戶服務和通知服務)和支持基礎設施服務(如日誌分析,配置服務器,服務發現,受權服務)。架構

下圖展現使用Spring Cloud的微服務架構:負載均衡

![](http://7xihe6.com1.z0.glb.clouddn.com/MSA with Spring Cloud -by A. Lukyanchikov-.png)運維

Spring Cloud微服務架構,by A. Lukyanchikov)分佈式

該圖展現了運行時的方方面面,但沒有包括打包、持續集成、伸縮、高可用和自我修復等在微服務架構中重要點。本文假設大多數JAVA開發者熟悉Spring Cloud,採用類比的形式,經過解決以上要點問題,帶你們瞭解KubernetesSpring Cloud之間的關係。ide

微服務要點

咱們在此不進行特性的逐個對比,而是從大面上看一看微服務的要點並聊一聊Spring CloudKubernetes如何實現。

微服務架構的一大優點是易於理解的架構風格,可實現強大的模塊邊界,而且具備獨立的部署和技術多樣性,但須要付出的代價也是顯而易見的——開發分佈式系統的成本和運維開銷。

而微服務架構可否成功實踐,利用各類工具解決潛在問題是關鍵。把啓動過程變得快速簡單很重要,但通往生產環境的旅程是漫長的,你須要不斷進步才能成功。

![](http://7xihe6.com1.z0.glb.clouddn.com/Microservices concerns .png)

上圖是須要在微服務架構中最多見的技術要點(在這裏,咱們不涉及那些非技術要點,好比組織結構、公司文化等等)

技術對比

Spring CloudKubernetes有很大的不一樣,並無直接可比的特性,若是對照微服務架構的要點,能夠得出以下的技術對比圖表:

![](http://7xihe6.com1.z0.glb.clouddn.com/Spring Cloud and Kubernetes technologies .png)

從上表咱們能夠得知:

  • Spring Cloud有一套豐富且集成良好的JAVA庫,做爲應用棧的一部分解決全部運行時問題。所以,微服務自己能夠經過庫和運行時代理解決客戶端服務發現、負載均衡、配置更新、統計跟蹤等。工做模式就像單實例服務集羣譯者注:集羣中master節點工做,當master掛掉後,slave節點被選舉頂替。)而且一批工做也是在JVM中被管理。

  • Kubernetes是多語言的,不只僅針對Java平臺,而是以通用的方式爲全部語言解決分佈式計算問題。Kubernetes提供了配置管理、服務發現、負載均衡、跟蹤、統計、單實例、平臺級和應用棧以外的調度工做。該應用不須要任何客戶端邏輯的庫或代理程序,能夠用任何語言編寫。

  • 兩個平臺依靠類似的第三方工具,如ELKEFK stacks, tracing libraries等。HystrixSpring Boot等庫,在兩個環境中都表現良好。不少狀況下,Spring CloudKubernetes能夠造成互補,組建出更強大的解決方案(例如KubeFlixSpring Cloud Kubernetes)。

微服務需求

想要進一步理解Spring CloudKubernetes的適用範圍,能夠參考下圖微服務架構需求。

![](http://7xihe6.com1.z0.glb.clouddn.com/Microservices requirements .png)

有些需求,Spring Cloud表現更好,有需求則是Kubernetes,也有些需求,二者能夠用不一樣的方式知足。好消息是,Spring CloudKubernetes在使用上並不衝突。例如,Spring Cloud提供Maven插件來建立單獨JAR應用程序包。結合Docker、Kubernetes的聲明式部署和調度能力,輕鬆運行微服務。一樣,Sring Cloud以應用程序內的包裝庫的形式來支持彈性伸縮,微服務容錯使用Hystrixbulkhead和斷路器模式)與Ribbon(負載均衡)。但這些是不夠的,當組合Kubernetes健康檢查、程序重啓和自動伸縮能力,微服務才真正變成一個強壯的系統。

優缺點

Spring Cloud

Spring Cloud爲開發者提供了快速構建分佈式系統中的一些常見模式的工具,例如配置管理,服務發現,斷路器,路由等。它是爲Java開發人員使用,構建在Netflix OSS庫之上的。

優勢

  1. Spring Platform提供的統一編程模型和Spring Boot的快速應用程序建立能力,爲開發人員提供了很好的微服務開發體驗。使用不多的註解,就能夠建立一個配置服務器或得到客戶端庫來配置您的服務。

  2. 豐富的庫支持,覆蓋大多數運行時需求。Spring Cloud的全部庫均由JAVA編寫,提供多特性、高控制和易配置。

  3. 不一樣的Spring Cloud庫彼此徹底兼容。例如,Feign客戶端還將使用Hystrix用於斷路器、Ribbon用於負載均衡請求。一切都是註解驅動的,易於Java開發者開發。

缺點

  1. 僅使用JAVA,既是Spring Cloud的優勢,也是一大缺陷。微服務架構之因此吸引人,在於按需交換各類技術棧、庫,甚至語言的能力。這一點,Spring Cloud作不到。若是你想使用Spring Cloud/Netflix OSS基礎設置服務,例如配置管理、服務發現或者負載均衡,解決方案是不優雅的。雖然Netflix Prana項目實現了sidecar模式,顯示基於Java客戶類庫越過HTTP,使得用non-JVM語言編寫的應用程序存在於NetflixOSS生態系統變得可能,但它仍然不是很優雅。

  2. 除了JAVA應用程序,還有太多與開發無關的事情須要Java開發人員處理。每一個微服務須要運行各類客戶端以進行配置檢索、服務發現和負載均衡。雖然很容易設置,但這並不會下降對環境的構建時間和運行的依賴性。例如,開發人員可使用@EnableConfigServer建立一個配置服務器,但這只是開心的假象。每當開發人員想要運行單個微服務時,他們須要啓動並運行Config Server。對於受控環境,開發人員必須考慮使Config Server高度可用,而且因爲它能夠由GitSVN支持,所以它們須要一個共享文件系統。一樣,對於服務發現,開發人員也是須要首先啓動Eureka服務器。爲了建立一個受控的環境,他們須要在每一個AZ上使用多個實例實現集羣。能夠說,開發人員除了實現全部功能外,還須要額外管理一個複雜的微服務平臺。

  3. Spring Cloud目前在微服務方面覆蓋的面相對有限,開發人員還須要考慮自動化部署、調度、資源管理、過程隔離、自我修復、構建流水線等,以得到完整的微服務體驗。對於這點,我認爲拿Spring CloudKubernetes比較是不公平的,應該比較Spring Cloud + Cloud Foundry (or Docker Swarm)Kubernetes。但這也意味着對於一個完整的端到端微服務體驗,Spring Cloud必須補充一個像Kubernetes這樣的應用程序平臺。

Kubernetes

Kubernetes是一個用於自動化部署、擴展和管理容器化應用程序的開源系統。支持多種語言而且提供用於支持、運行、擴展和管理分佈式系統的操做系統。

優勢

  1. Kubernetes是多語言且語言不敏感的容器管理平臺,可以運行雲原生和傳統的容器化應用程序。Kubernetes提供的服務(如配置管理、服務發現、負載均衡、測試指標收集和日誌聚合)可供各類語言使用。這意味着一個平臺能夠被多個團隊(包括使用SpringJava開發人員)使用,並提供多種用途:應​​用程序開發、測試環境、構建環境(源碼運行、構建服務、依賴倉庫)等。

  2. Spring Cloud相比,Kubernetes解決了更廣的微服務架構問題。除了提供運行時服務,Kubernetes也可讓你制定環境、設置資源限制、RBAC、管理應用程序生命週期、容許自動擴容和自我修復(幾乎表現得像一個抗脆弱平臺)。

  3. Kubernetes技術基於Google十五年的研發和容器管理經驗。此外,Kubernetes有近1000個貢獻者,是Github上最活躍的開源社區之一。

缺點

  1. Kubernetes是多語言的,所以它的服務是通用的,並不針對不一樣的平臺(如Spring Cloud for JVM)進行優化。例如,配置會做爲環境變量傳遞給應用程序或掛載的文件系統。它沒有像Spring Cloud Config提供的配置更新功能。

  2. Kubernetes不是一個以開發者爲中心的平臺,更偏向於DevOps的IT人員使用。所以,Java開發人員須要學習一些新的概念,須要學習解決問題的新方法。儘管經過MiniKuber開始一個Kubernetes開發實例很簡單,但手動安裝一個高可用的Kubernetes集羣仍顯得有些複雜。

  3. Kubernetes是一個相對較新的平臺(2歲),仍然在發展和成長,每一個版本都添加了不少新功能,可能很難跟上。好消息是,這一點已經被考慮到了,KubernetesAPI將是可擴展和向後兼容的。

Spring Cloud和Kubernetes的最佳實踐

如你所見,Spring CloudKubernetes在覈心領域都很強,而且正在其餘領域努力改進。Spring Cloud能夠快速使用,對開發者比較友好;而KubernetesDevOps的絕配,雖然學起來可能有點難,可是覆蓋了更普遍的微服務技術要點。

![](http://7xihe6.com1.z0.glb.clouddn.com/Strengths and weaknesses.png)

Spring CloudKubernetes處理了不一樣範圍的微服務架構技術點,並且是用了不一樣的方法。Spring Cloud方法是試圖解決在JVM中的微服務架構要點,而Kubernetes方法是試圖讓問題消失,爲開發者在平臺層解決。Spring CloudJVM中很是強大,Kubernetes管理那些JVM很強大。看起來各取所長,充分利用這二者的優點是天然而然的趨勢了。

![](http://7xihe6.com1.z0.glb.clouddn.com/Spring Cloud backed by Kubernetes .png)

結合使用Spring CloudKubernetes,用Spring Cloud提供應用程序打包,DockerKubernetes提供部署和調度;Spring經過Hystrix線程池提供應用程序內隔離,Kubernetes經過資源、進程和命名空間隔離;Spring爲每一個微服務提供健康終端,Kubernetes執行健康檢查而且爲健康服務的通訊提供路由;Spring外部化且升級配置,Kubernetes給每一個微服務分配配置......這樣的例子還有不少。

做者:Bilgin Ibryam 原文:https://dzone.com/articles/deploying-microservices-spring-cloud-vs-kubernetes 搬運:好雨科技 爲方便閱讀原文略有刪改

相關文章
相關標籤/搜索