本文不是講解如何使用Spring Cloud的教程,而是探讨Spring Cloud是什麼,以及它誕生的背景和意義。
1 背景
2008年以後,國内網際網路行業飛速發展,我們對軟體系統的需求已經不再是過去”能用就行”這種很low的檔次了,像搶紅包、雙十一這樣的活動不斷逼迫我們去突破軟體系統的性能上限,傳統的IT企業”能用就行”的開發思想已經不能滿足網際網路高并發、大流量的性能要求。系統架構走向分布式已經是伺服器開發領域解決該問題唯一的出路,然而分布式系統由于天生的複雜度,并不像開發單體應用一樣把架構一堆就能搞定,是以各大網際網路公司都在投入技術力量研發自己的基礎設施。這裡面比較有名的如阿裡的開源項目dubbo, Netflix開發的一系列服務架構。在這種“百花齊放”、重複造輪子的狀況下,必然要出現一種統一的标準來簡化分布式系統的開發,Spring Cloud應運而生。
2 Spring Cloud是什麼
SpringCloud架構
Spring Cloud是一系列架構的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分布式系統基礎設施的開發,如服務發現注冊、配置中心、消息總線、負載均衡、斷路器、資料監控等,都可以用Spring Boot的開發風格做到一鍵啟動和部署。Spring并沒有重複制造輪子,它隻是将目前各家公司開發的比較成熟、經得起實際考驗的服務架構組合起來,通過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實作原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分布式系統開發工具包。
Spring Cloud正是對Netflix的多個開源元件進一步的封裝而成,同時又實作了和雲端平台,和Spring Boot開發架構很好的內建。
Spring Cloud是一個相對比較新的微服務架構,2016年才推出1.0的release版本. 雖然Spring Cloud時間最短, 但是相比Dubbo等RPC架構, Spring Cloud提供的全套的分布式系統解決方案。
Spring Cloud 為開發者提供了在分布式系統(配置管理,服務發現,熔斷,路由,微代理,控制總線,一次性token,全居瑣,leader選舉,分布式session,叢集狀态)中快速建構的工具,使用Spring Cloud的開發者可以快速的啟動服務或建構應用、同時能夠快速和雲平台資源進行對接。
3 Spring Cloud組成
Spring Cloud的子項目,大緻可分成兩類,一類是對現有成熟架構”Spring Boot化”的封裝和抽象,也是數量最多的項目;第二類是開發了一部分分布式系統的基礎設施的實作,如Spring Cloud Stream扮演的就是kafka, ActiveMQ這樣的角色。對于我們想快速實踐微服務的開發者來說,第一類子項目就已經足夠使用,如:Spring Cloud Netflix,是對Netflix開發的一套分布式服務架構的封裝,包括服務的發現和注冊,負載均衡、斷路器、REST用戶端、請求路由等。該項目是Spring Cloud的子項目之一,主要内容是對Netflix公司一系列開源産品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。
通過一些簡單的注解,開發者就可以快速的在應用中配置一下常用子產品并建構龐大的分布式系統。它主要提供的子產品包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),用戶端負載均衡(Ribbon)等。
Spring Cloud Netflix
這可是個大boss,地位僅次于老大,老大各項服務依賴與它,與各種Netflix OSS元件內建,組成微服務的核心,它的小弟主要有Eureka, Hystrix, Zuul, Archaius... 太多了
3.1 Spring Cloud Eureka 服務發現
netflix-eureka
Spring Cloud Eureka服務發現
Eureka
服務中心,雲端服務發現,一個基于 REST 的服務,用于定位服務,以實作雲端中間層服務發現和故障轉移。這個可是SpringCloud最牛鼻的小弟,服務中心,任何小弟需要其它小弟支援什麼都需要從這裡來拿,同樣的你有什麼獨門武功的都趕緊過報道,友善以後其它小弟來調用;它的好處是你不需要直接找各種什麼小弟支援,隻需要到服務中心來領取,也不需要知道提供支援的其它小弟在哪裡,還是幾個小弟來支援的,反正拿來用就行,服務中心來保證穩定性和品質。
Spring Cloud Eureka提供在分布式環境下的服務發現,服務注冊的功能。
一個RESTful服務,用來定位運作在AWS地區(Region)中的中間層服務。由兩個元件組成:Eureka伺服器和Eureka用戶端。Eureka伺服器用作服務注冊伺服器。Eureka用戶端是一個java用戶端,用來簡化與伺服器的互動、作為輪詢負載均衡器,并提供服務的故障切換支援。Netflix在其生産環境中使用的是另外的用戶端,它提供基于流量、資源使用率以及出錯狀态的權重負載均衡。
3.2 Spring Cloud Ribbon 用戶端負載均衡
netflix-ribbon
Spring Cloud Ribbon
Ribbon,主要提供客戶側的軟體負載均衡算法。
Ribbon用戶端元件提供一系列完善的配置選項,比如連接配接逾時、重試、重試算法等。Ribbon内置可插拔、可定制的負載均衡元件。下面是用到的一些負載均衡政策:
- 簡單輪詢負載均衡
- 權重響應時間負載均衡
- 區域感覺輪詢負載均衡
- 随機負載均衡
Ribbon中還包括以下功能:
- 易于與服務發現元件(比如Netflix的Eureka)內建
- 使用Archaius完成運作時配置
- 使用JMX暴露運維名額,使用Servo釋出
- 多種可插拔的序列化選擇
- 異步和批處理操作(即将推出)
- 自動SLA架構(即将推出)
- 系統管理/名額控制台(即将推出)
3.3 Spring Cloud Config
spring-cloud-config
俗稱的配置中心,配置管理工具包,讓你可以把配置放到遠端伺服器,集中化管理叢集配置,目前支援本地存儲、Git以及Subversion。就是以後大家武器、槍火什麼的東西都集中放到一起,别随便自己帶,友善以後統一管理、更新裝備。
Spring Cloud Config配置中心
将配置資訊中央化儲存, 配置Spring Cloud Bus可以實作動态修改配置檔案。這個還是靜态的,得配合Spring Cloud Bus實作動态的配置更新。
Spring Cloud Config
Spring Cloud Config就是我們通常意義上的配置中心。Spring Cloud Config-把應用原本放在本地檔案的配置抽取出來放在中心伺服器,本質是配置資訊從本地遷移到雲端。進而能夠提供更好的管理、釋出能力。
Spring Cloud Config分服務端和用戶端,服務端負責将git(svn)中存儲的配置檔案釋出成REST接口,用戶端可以從服務端REST接口擷取配置。但用戶端并不能主動感覺到配置的變化,進而主動去擷取新的配置,這需要每個用戶端通過POST方法觸發各自的/refresh。
3.4 Spring cloud Hystrix 熔斷器
netflix-hystrix
熔斷器,容錯管理工具,旨在通過熔斷機制控制服務和第三方庫的節點,進而對延遲和故障提供更強大的容錯能力。比如突然某個小弟生病了,但是你還需要它的支援,然後調用之後它半天沒有響應,你卻不知道,一直在等等這個響應;有可能别的小弟也正在調用你的武功絕技,那麼當請求多之後,就會發生嚴重的阻塞影響老大的整體計劃。這個時候Hystrix就派上用場了,當Hystrix發現某個小弟不在狀态不穩定立馬馬上讓它下線,讓其它小弟來頂上來,或者給你說不用等了這個小弟今天肯定不行,該幹嘛趕緊幹嘛去别在這排隊了。
Spring cloud Hystrix 熔斷器
斷路器(Cricuit Breaker)是一種能夠在遠端服務不可用時自動熔斷(打開開關),并在遠端服務恢複時自動恢複(閉合開關)的設施,Spring Cloud通過Netflix的Hystrix元件提供斷路器、資源隔離與自我修複功能。
斷路器可以防止一個應用程式多次試圖執行一個操作,即很可能失敗,允許它繼續而不等待故障恢複或者浪費 CPU 周期,而它确定該故障是持久的。斷路器模式也使應用程式能夠檢測故障是否已經解決。如果問題似乎已經得到糾正,應用程式可以嘗試調用操作。
Hystrix01
斷路器增加了穩定性和靈活性,以一個系統,提供穩定性,而系統從故障中恢複,并盡量減少此故障的對性能的影響。它可以幫助快速地拒絕對一個操作,即很可能失敗,而不是等待操作逾時(或者不傳回)的請求,以保持系統的響應時間。如果斷路器提高每次改變狀态的時間的事件,該資訊可以被用來監測由斷路器保護系統的部件的健康狀況,或以提醒管理者當斷路器跳閘,以在打開狀态。
Hystrix02
Hystrix流程圖
3.5 Spring Cloud Zuul 服務網關,智能路由
netflix-zuul
Zuul 是在雲平台上提供動态路由,監控,彈性,安全等邊緣服務的架構。Zuul 相當于是裝置和 Netflix 流應用的 Web 網站後端所有請求的前門。當其它門派來找大哥辦事的時候一定要先經過zuul,看下有沒有帶刀子什麼的給攔截回去,或者是需要找那個小弟的直接給帶過去。
Spring Cloud Zuul 服務網關
Zuul
類似Nginx,反向代理的功能,不過netflix自己增加了一些配合其他元件的特性。
3.6 Spring Netflix Archaius
netflix-archaius
配置管理API,包含一系列配置管理API,提供動态類型化屬性、線程安全配置操作、輪詢架構、回調機制等功能。可以實作動态擷取配置,
原理是每隔60s(預設,可配置)從配置源讀取一次内容,這樣修改了配置檔案後不需要重新開機服務就可以使修改後的内容生效,前提使用archaius的API來讀取。
3.7 Spring Cloud Bus
spring-cloud-bus
事件、消息總線,用于在叢集(例如,配置變化事件)中傳播狀态變化,可與Spring Cloud Config聯合實作熱部署。相當于水浒傳中日行八百裡的神行太保戴宗,確定各個小弟之間消息保持暢通。
分布式消息隊列,是對Kafka, MQ的封裝;事件、消息總線,用于在叢集(例如,配置變化事件)中傳播狀态變化,可與Spring Cloud Config聯合實作熱部署。
Spring cloud bus通過輕量消息代理連接配接各個分布的節點。這會用在廣播狀态的變化(例如配置變化)或者其他的消息指令。Spring bus的一個核心思想是通過分布式的啟動器對spring boot應用進行擴充,也可以用來建立一個多個應用之間的通信頻道。目前唯一實作的方式是用AMQP消息代理作為通道,同樣特性的設定(有些取決于通道的設定)在更多通道的文檔中。
Spring cloud bus被國内很多都翻譯為消息總線,也挺形象的。大家可以将它了解為管理和傳播所有分布式項目中的消息既可,其實本質是利用了MQ的廣播機制在分布式的系統中傳播消息,目前常用的有Kafka和RabbitMQ。利用bus的機制可以做很多的事情,其中配置中心用戶端重新整理就是典型的應用場景之一,我們用一張圖來描述bus在配置中心使用的機制。
Spring Cloud Bus
根據此圖我們可以看出利用Spring Cloud Bus做配置更新的步驟:
- 送出代碼觸發post給用戶端A發送bus/refresh
- 用戶端A接收到請求從Server端更新配置并且發送給Spring Cloud Bus
- Spring Cloud bus接到消息并通知給其它用戶端
- 其它用戶端接收到通知,請求Server端擷取最新配置
- 全部用戶端均擷取到最新的配置
3.8 Spring Cloud Security
spring-cloud-security
對Spring Security的封裝,并能配合Netflix使用,安全工具包,為你的應用程式添加安全控制,主要是指OAuth2。
基于spring security的安全工具包,為你的應用程式添加安全控制。這個小弟很牛鼻專門負責整個幫派的安全問題,設定不同的門派通路特定的資源,不能把秘籍葵花寶典洩漏了。
3.9 Spring Cloud Zookeeper
spring-cloud-zookeeper
對Zookeeper的封裝,使之能配置其它Spring Cloud的子項目使用;操作Zookeeper的工具包,用于使用zookeeper方式的服務注冊和發現。
ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是Google的Chubby一個開源的實作,是Hadoop和Hbase的重要元件。它是一個為分布式應用提供一緻性服務的軟體,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。ZooKeeper的目标就是封裝好複雜易出錯的關鍵服務,将簡單易用的接口和性能高效、功能穩定的系統提供給使用者。
操作Zookeeper的工具包,用于使用zookeeper方式的服務發現和配置管理,抱了Zookeeper的大腿。
3.10 Spring Cloud Stream
spring-cloud-stream
資料流;資料流操作開發包,封裝了與Redis,Rabbit、Kafka等發送接收消息。
Spring Cloud Stream是建立消息驅動微服務應用的架構。Spring Cloud Stream是基于spring boot建立,用來建立單獨的/工業級spring應用,使用spring integration提供與消息代理之間的連接配接。資料流操作開發包,封裝了與Redis,Rabbit、Kafka等發送接收消息。
一個業務會牽扯到多個任務,任務之間是通過事件觸發的,這就是Spring Cloud stream要幹的事了。
3.11 Spring Cloud Sleuth
spring-cloud-sleuth
服務跟蹤;日志收集工具包,封裝了Dapper,Zipkin和HTrace操作。
日志收集工具包,封裝了Dapper和log-based追蹤以及Zipkin和HTrace操作,為SpringCloud應用實作了一種分布式追蹤解決方案。
3.12 Spring Cloud Feign 使用HTTP請求遠端服務
netflix-feign
在Spring Cloud Netflix棧中,各個微服務都是以HTTP接口的形式暴露自身服務的,是以在調用遠端服務時就必須使用HTTP用戶端。我們可以使用JDK原生的URLConnection、Apache的Http Client、Netty的異步HTTP Client, Spring的RestTemplate。但是,用起來最友善、最優雅的還是要屬Feign了。
Feign是一種聲明式、模闆化的HTTP用戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠端服務時能與調用本地方法一樣的編碼體驗,開發者完全感覺不到這是遠端方法,更感覺不到這是個HTTP請求。
通過Feign, 我們能把HTTP遠端調用對開發者完全透明,得到與調用本地方法一緻的編碼體驗。這一點與阿裡Dubbo中暴露遠端服務的方式類似,差別在于Dubbo是基于私有二進制協定,而Feign本質上還是個HTTP用戶端。如果是在用Spring Cloud Netflix搭建微服務,那麼Feign無疑是最佳選擇。
3.13 Spring Cloud for Cloud Foundry
pivotal-cloud-foundry
Cloud Foundry是VMware推出的業界第一個開源PaaS雲平台,它支援多種架構、語言、運作時環境、雲平台及應用服務,使開發人員能夠在幾秒鐘内進行應用程式的部署和擴充,無需擔心任何基礎架構的問題
其實就是與CloudFoundry進行內建的一套解決方案,抱了Cloud Foundry的大腿。
3.14 Spring Cloud Cluster
spring-cloud-cluster
Spring Cloud Cluster将取代Spring Integration。提供在分布式系統中的叢集所需要的基礎功能支援,如:選舉、叢集的狀态一緻性、全局鎖、tokens等常見狀态模式的抽象和實作。
如果把不同的幫派組織成統一的整體,Spring Cloud Cluster已經幫你提供了很多友善組織成統一的工具。
3.15 Spring Cloud Consul
hashicorp-consul
Consul 是一個支援多資料中心分布式高可用的服務發現和配置共享的服務軟體,由 HashiCorp 公司用 Go 語言開發, 基于 Mozilla Public License 2.0 的協定進行開源. Consul 支援健康檢查,并允許 HTTP 和 DNS 協定調用 API 存儲鍵值對.
Spring Cloud Consul 封裝了Consul操作,consul是一個服務發現與配置工具,與Docker容器可以無縫內建。
3.16 Spring Cloud Data Flow
spring-cloud-data-flow
Data flow 是一個用于開發和執行大範圍資料處理其模式包括ETL,批量運算和持續運算的統一程式設計模型和托管服務。
對于在現代運作環境中可組合的微服務程式來說,Spring Cloud data flow是一個原生雲可編配的服務。使用Spring Cloud data flow,開發者可以為像資料抽取,實時分析,和資料導入/導出這種常見用例建立和編配資料通道 (data pipelines)。
Spring Cloud data flow 是基于原生雲對 spring XD的重新設計,該項目目标是簡化大資料應用的開發。Spring XD 的流處理和批處理子產品的重構分别是基于 spring boot的stream 和 task/batch 的微服務程式。這些程式現在都是自動部署單元而且他們原生的支援像 Cloud Foundry、Apache YARN、Apache Mesos和Kubernetes 等現代運作環境。
Spring Cloud data flow 為基于微服務的分布式流處理和批處理資料通道提供了一系列模型和最佳實踐。
3.17 Spring Cloud Task
spring-cloud-task
Spring Cloud Task 主要解決短命微服務的任務管理,任務排程的工作,比如說某些定時任務晚上就跑一次,或者某項資料分析臨時就跑幾次。
3.18 Spring Cloud Connectors
spring-cloud-connectors
Spring Cloud Connectors 簡化了連接配接到服務的過程和從雲平台擷取操作的過程,有很強的擴充性,可以利用Spring Cloud Connectors來建構你自己的雲平台。
便于雲端應用程式在各種PaaS平台連接配接到後端,如:資料庫和消息代理服務。
3.19 Spring Cloud Starters
spring-cloud-starters
Spring Boot式的啟動項目,為Spring Cloud提供開箱即用的依賴管理。
3.20 Spring Cloud CLI
spring-cloud-cli
基于 Spring Boot CLI,可以讓你以指令行方式快速建立雲元件。
3.21 Netflix Turbine
netflix-turbine
Turbine是聚合伺服器發送事件流資料的一個工具,用來監控叢集下hystrix的metrics情況。
4 和Spring Boot 是什麼關系
Spring boot 是 Spring 的一套快速配置腳手架,可以基于spring boot 快速開發單個微服務,Spring Cloud是一個基于Spring Boot實作的雲應用開發工具;Spring boot專注于快速、友善內建的單個個體,Spring Cloud是關注全局的服務治理架構;spring boot使用了預設大于配置的理念,很多內建方案已經幫你選擇好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot來實作,可以不基于Spring boot嗎?不可以。
Spring boot可以離開Spring Cloud獨立使用開發項目,但是Spring Cloud離不開Spring boot,屬于依賴的關系。
Spring -> Spring Boot > Spring Cloud 這樣的關系。
5 Spring Cloud的優勢
微服務的架構那麼多比如:dubbo、Kubernetes,為什麼就要使用Spring Cloud的呢?
- 産出于Spring大家族,Spring在企業級開發架構中無人能敵,來頭很大,可以保證後續的更新、完善。比如dubbo現在就差不多死了
-
有Spring Boot 這個獨立幹将可以省很多事,大大小小的活spring boot都搞的挺不錯。
作為一個微服務治理的大家夥,考慮的很全面,幾乎服務治理的方方面面都考慮到了,友善開發開箱即用。
- Spring Cloud 活躍度很高,教程很豐富,遇到問題很容易找到解決方案
- 輕輕松松幾行代碼就完成了熔斷、均衡負責、服務中心的各種平台功能
- Spring Cloud 也有一個缺點,隻能使用Java開發,不适合小型獨立的項目。
熬夜不易,點選請老王喝杯烈酒!!!!!!!