微服務Spring Cloud與Kubernetes比較

banq發表於2016-12-15

Spring Cloud或Kubernetes都宣稱它們是開發執行微服務的最好環境,哪個更好?答案是兩個都是,但他們擁有各自不同的特徵方式。

背景故事

最近,Lukyanchikov發表了一篇使用Spring Cloud和Docker建立微服務架構的文章。 它給出瞭如何使用Spring Cloud建立一個簡單的基於微服務的系統所需的全面概述。 為構建一個可擴充套件到數十或數百個服務的伸縮彈性的微服務系統,必須藉助具有寬泛的構建時間和執行能力的工具集進行集中管理和管理。 Spring Cloud包括實現功能性服務(如統計服務,帳戶服務和通知服務)和支援基礎設施服務(如日誌分析,配置伺服器,服務發現,授權服務)。

這些服務涵蓋了系統的執行時各個方面,但不涉及打包,持續整合,擴充套件,高可用性和自我修復,這在MSA(微服務架構)世界中也非常重要。 假設大多數Java開發人員熟悉Spring Cloud,在本文中,我們將繪製一個平行圖,通過解決這些額外的問題,瞭解Kubernetes與Spring Cloud的關係。

有關MSA的好處是,它有一種架構風格很好理解的好處,微服務可實現強大的模組邊界,具有獨立的部署和技術多樣性。 但代價是開發分散式系統成本和顯著運營開銷 。一個關鍵的成功因素是使用各種工具解決這些問題,

微服務關注點

微服務關注方面有:配置管理、服務發現與負載平衡、彈性和失敗冗餘、API管理、安全服務、中央集中日誌、集中測量、分散式跟蹤、排程部署和自動擴充套件self Healing等幾個方面。

根據這些觀點,得出Spring Cloud和Kubernetes兩個平臺對映:

1.配置管理:配置伺服器、Consul和Netflix Archaius(Spring Cloud);Kubernetes ConfigMap&Secrets ;

2.服務發現: Netflix Eureka,Hashicorp Consul(Spring Cloud);Kubernetes Service&Ingress Resource;

3.負載平衡:Netflix Ribbon(Spring Cloud);Kubernetes Service

4.API閘道器:Netflix Zuul(SpringCloud);Kubernetes Service&Ingress Resource

5.安全服務:SpringCloud Security

6.中央集中日誌:ELK Stack(LogStash);EFKstack(Fluentd)。

7.集中測量:Netflix Spectator& Atlas;Heapster、Prometheus、Grafana。

8.分散式跟蹤:SpringCloud Sleuth,Zipkin;OpenTracing、Zipkin

9.彈性和失敗冗餘:Netflix Hystrix、Turbine&Ribbon;Kubernetes Health Check&resource isolation

10.自動擴充套件self Healing:Spring Cloud無;Kubernetes Health Check、SelfHealing、Autoscaling

11.打包 部署和排程部署:Spring Boot;Docker/Rkt、Kubernetes Scheduler&Deployment

12.任務工作管理:Spring Batch;Kubernetes Jobs&Scheduled Jobs

13.單個應用:Spring Cloud Cluster ;Kubernetes Pods

Spring Cloud有一套豐富的整合良好的Java庫,作為應用程式棧一部分解決所有執行時問題。 因此,微服務本身通過庫和執行時作為代理來執行客戶端服務發現,負載平衡,配置更新,度量跟蹤等。諸如單例叢集服務和批處理作業的模式也在JVM中進行管理。

Kubernetes是多語言的,不僅針對Java平臺,並以通用的方式為所有語言解決分散式計算的挑戰。 它提供應用程式棧外部的配置管理,服務發現,負載平衡,跟蹤,度量,單例,平臺排程作業等平臺級別功能。 該應用系統不需要任何庫或代理程式用於客戶端邏輯,它可以用任何語言編寫。

在某些方面,這兩個平臺都依賴類似的第三方工具。例如,ELK和EFK堆疊,跟蹤庫等一些庫,如Hystrix和Spring Boot,在這兩種環境中同樣有用。

有些情況下這兩個平臺是互補的,並且可以結合在一起,創造一個更加強大的解決方案,例如,Spring Boot提供了用於構建單個JAR應用程式包的Maven外掛。結合Docker和Kubernetes的宣告性部署和排程功能,使微服務執行變得輕而易舉。 類似地,Spring Cloud具有應用程式庫,用於使用Hystrix(斷路器)和Ribbon(用於負載平衡)建立彈性的,容錯的微服務。 但是單單這是不夠的,當它與Kubernetes的健康檢查,程式重新啟動和自動擴充套件功能相結合時,微服務成為一個真正的抗脆弱的系統。

長處和短處

由於兩個平臺不具有直接的可比性特徵,下面是逐項總結其優點和缺點。

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

優勢

1.Spring Platform提供的統一程式設計模型和Spring Boot的快速應用程式建立能力為開發人員提供了巨大的微服務開發體驗。 例如,使用很少的註釋,您可以建立一個配置伺服器,並且幾乎沒有更多的註釋,您可以獲得客戶端庫來配置您的服務。

2.有豐富的庫選擇,覆蓋大多數執行時關注。由於所有庫都是用Java編寫的,它提供了多種功能,更好的控制和精細調整選項。

3.不同的Spring Cloud庫彼此完全整合。例如,Feign客戶端還將使用Hystrix用於斷路器,並且Ribbon用於負載平衡請求。 一切都是註釋驅動的,使其易於為Java開發人員開發。

弱點

1.Spring Cloud的一個主要優點是它的缺點 - 它僅限於Java。MSA的強大動力是在需要時交換各種技術棧,庫,甚至語言的能力。 只是使用Spring Cloud是不可能的。 如果您想要使用Spring Cloud / Netflix OSS基礎架構服務(如配置管理,服務發現或負載平衡),那麼解決方案就不那麼優雅。 在Netflix的 Prana專案通過基於HTTP暴露Java客戶端實現了sidecar模式,使其可能讓非JVM語言執行在NetflixOSS生態系統中,但它不是很優雅。

2.Java開發人員關心Java應用程式並需要處理太多與開發無關的事情。每個微服務需要執行各種客戶端以進行配置檢索,服務發現和負載平衡。雖然很容易設定,但這並不會降低對環境的構建時間和執行時依賴性。例如,開發人員可以使用@EnableConfigServer建立一個配置伺服器,但這只是開心的假象。 每當開發人員想要執行單個微服務時,他們需要啟動並執行Config Server。對於受控環境,開發人員必須考慮使Config Server高度可用,並且由於它可以由Git或Svn支援,因此它們需要一個共享檔案系統。 類似地,對於服務發現,開發人員需要首先啟動Eureka伺服器。 為了建立一個受控的環境,他們需要在每個AZ上使用多個例項實現叢集。像開發人員一樣,除了實現所有功能服務之外,Java開發人員還必須構建和管理一個非平凡的微服務平臺。

3.Spring Cloud在微服務發展過程只有很短歷程,開發人員還需要考慮自動化部署,排程,資源管理,過程隔離,自我修復,構建管道等,以獲得完整的微服務體驗。 對於這點,我認為這是不公平的比較,應該比較 Spring Cloud + Cloud Foundry (or Docker Swarm) 和Kubernetes。但這也意味著對於一個完整的端到端微服務體驗,Spring Cloud必須補充一個像Kubernetes本身這樣的應用程式平臺。

Kubernetes是一個用於自動化部署,擴充套件和管理容器化應用程式的開源系統。 它是多種語言並且提供用於供應,執行,擴充套件和管理分散式系統的作業系統。

優勢

1.Kubernetes是一個多語言和語言不可知的容器管理平臺,能夠執行雲本地和傳統的容器化應用程式。其提供的服務(如配置管理,服務發現,負載平衡,測量指標收集和日誌聚合)可供各種語言使用。 這允許在一個組織中有一個平臺,可以被多個團隊(包括使用Spring的Java開發人員)使用,並提供多種用途:應​​用程式開發,測試環境,構建環境(執行原始碼控制系統,構建伺服器,工件儲存庫)等。

2.與Spring Cloud相比,Kubernetes解決了更廣泛的MSA問題。 除了提供執行時服務,Kubernetes也可以讓你規定的環境中,設定資源限制,RBAC,管理應用程式生命週期,啟用自動縮放和自我修復(幾乎表現得像一個抗脆弱平臺)。

3.Kubernetes技術基於Google 15年的研發經驗和管理容器的經驗。此外,有近1000個提交者,它是Github上最活躍的開源社群之一。

弱點

1. Kubernetes是多語言的,因此它的服務是通用的,並不針對不同的平臺(如Spring Cloud for JVM)進行優化。 例如,配置作為環境變數或安裝的檔案系統傳遞到應用程式。 它沒有Spring Cloud Config提供的奇特的配置更新功能。

2.Kubernetes不是一個以開發人員為中心的平臺。 它旨在由DevOps的IT人員使用。因此,Java開發人員需要學習一些新的概念,並開放學習解決問題的新方法。手動安裝高度可用的Kubernetes叢集有一個顯著操作的開銷。

3.Kubernetes仍然是一個相對較新的平臺(2歲),它仍然積極發展和成長。因此,每個版本都新增了很多新功能,可能很難跟上。 好訊息是,這已經被考慮到,API將是可擴充套件和向後相容的。

最好的兩個世界

正如你所看到的,這兩個平臺在某些領域有優勢,在其他領域有待改進。 Spring Cloud是一個快速開始的開發者友好平臺,而Kubernetes是DevOps友好的,具有更陡峭的學習曲線,但涵蓋了更廣泛的微服務關注點。

這兩個框架涉及不同範圍的MSA關注,他們以一種根本不同的方式去實現。 Spring Cloud方法試圖解決JVM中的每個MSA挑戰,而Kubernetes方法試圖通過在平臺層面解決為開發人員解決問題。 Spring Cloud在JVM內部非常強大,Kubernetes在管理這些JVM方面功能強大。結合他們,並從兩個專案的最好的部分受益。

有了這樣的組合,Spring提供了應用程式打包,而Docker和Kubernetes提供了部署和排程。 Spring通過Hystrix執行緒池提供應用程式防火牆,Kubernetes通過資源,程式和名稱空間隔離提供防火牆。Spring為每個微服務提供健康端點,Kubernetes執行健康檢查和流量路由到健康的服務。 Spring負責外部化和更新配置,Kubernetes將配置分發到每個微服務。

Spring Cloud for Microservices Compared to Kuberne

相關文章