本文主要從是什麼?爲何?怎麼作?三個方面來來介紹SpringCloud,部分參考官方文檔和技術博客,詳細連接在文章最下方給出
是什麼? SpringCloud是什麼?用來幹什麼的?
爲何?爲何選用SpringCloud?他有哪些優點?
怎麼作? 如何使用SpringCloud?以及SpringCloud的各個組件的做用?複製代碼
是什麼?
1. Spring Cloud簡單介紹
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,如服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等,均可以用Spring Boot的開發風格作到一鍵啓動和部署。Spring並無重複製造輪子,它只是將目前各家公司開發的比較成熟、經得起實際考驗的服務框架組合起來,經過Spring Boot風格進行再封裝屏蔽掉了複雜的配置和實現原理,最終給開發者留出了一套簡單易懂、易部署和易維護的分佈式系統開發工具包。
微服務是能夠獨立部署、水平擴展、獨立訪問(或者有獨立的數據庫)的服務單元,springcloud就是這些微服務的大管家,採用了微服務這種架構以後,項目的數量會很是多,springcloud須要管理好這些微服務。
2. 官方介紹
Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.
Spring Cloud爲開發人員提供了快速構建分佈式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線,一次性令牌,全局鎖定,領導選舉,分佈式會話,集羣狀態)。分佈式系統的協調致使鍋爐板模式,使用Spring Cloud開發人員能夠快速站起來實現這些模式的服務和應用程序。它們適用於任何分佈式環境,包括開發人員本身的筆記本電腦,裸機數據中心和Cloud Foundry等託管平臺。
3. 核心成員概覽
服務註冊中心
|
Spring Cloud Netflix Eureka
|
服務調用方式
|
REST API
|
服務監控
|
Spring Boot Admin
|
斷路器
|
Spring Cloud Netflix Hystrix
|
服務網關
|
Spring Cloud Netflix Zuul
|
分佈式配置
|
Spring Cloud Config
|
服務跟蹤
|
Spring Cloud Sleuth
|
消息總線
|
Spring Cloud Bus
|
數據流
|
Spring Cloud Stream
|
批量任務
|
Spring Cloud Task
|
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 這樣的關係。複製代碼
爲何?
1. Spring Cloud的優點?
Spring Cloud focuses on providing good out of box experience for typical use cases and extensibility mechanism to cover others.
Spring Cloud專一於爲典型用例提供良好的開箱即用體驗,併爲其餘用戶提供可擴展性機制。
另外,Spring Cloud 誕生於微服務架構時代,考慮的是微服務治理的方方面面,另外因爲依託了 Spring、Spring Boot 的優點之上,Spring Cloud 是一個生態。
2. 爲何選用SpringCloud?
微服務的框架那麼多好比:dubbo、Kubernetes,爲何就要使用Spring Cloud的呢?
- 產出於spring你們族,spring在企業級開發框架中無人能敵,來頭很大,能夠保證後續的更新、完善。好比dubbo如今就差很少死了
- 有Spring Boot 這個獨立干將能夠省不少事,大大小小的活Spring Boot都搞的挺不錯。
- 做爲一個微服務治理的你們夥,考慮的很全面,幾乎服務治理的方方面面都考慮到了,方便開發開箱即用。
- Spring Cloud 活躍度很高,教程很豐富,遇到問題很容易找到解決方案
- 輕輕鬆鬆幾行代碼就完成了熔斷、均衡負載、服務中心的各類平臺功能
Spring Cloud對於中小型互聯網公司來講是一種福音,由於這類公司每每沒有實力或者沒有足夠的資金投入去開發本身的分佈式系統基礎設施,使用Spring Cloud一站式解決方案能在從容應對業務發展的同時大大減小開發成本。同時,隨着近幾年微服務架構和Docker容器概念的火爆,也會讓Spring Cloud在將來愈來愈「雲」化的軟件開發風格中立有一席之地,尤爲是在目前五花八門的分佈式解決方案中提供了標準化的、全站式的技術方案,意義可能會堪比當前Servlet規範的誕生,有效推動服務端軟件系統技術水平的進步。
Spring Cloud 架構體系有有趣很酷的技術。若是公司選擇微服務架構去重構整個技術體系,那麼 Spring Cloud 是當仁不讓之選,它能夠說是目前最好的微服務框架沒有之一。
怎麼用?
1. 核心模塊介紹
爲了輕鬆實現微服務架構,業界已經肯定了一些常見的模式來幫助實現這一點。一些衆所周知的模式是集中配置管理,服務發現,異步消息驅動和分佈式跟蹤。Spring Cloud將這些模式做爲可用的模塊提供,並幫助咱們遵循雲原生最佳實踐。除此以外,Spring Cloud的獨特價值能夠體如今如下幾個方面:
- 爲經常使用模塊定義通用抽象。這是Spring的解耦理念的完美應用。每種模式都沒有與具體實施緊密結合。以配置服務器爲例; 您能夠自由地更改後端存儲而不會影響其餘服務。
- 模塊化組件。Spring Cloud不是一個全有或全無的解決方案,全部的模塊都是可選的。
a. 經過Spring Cloud Config進行集中配置管理
爲了知足Store config in environment 微服務架構的要求 ,咱們須要將全部服務的配置放在一個集中的位置。爲此,須要如下功能:
- 支持多種環境,如dev,test和prod。而後咱們能夠爲全部環境構建一個包。
- 透明配置提取。 應該自動獲取這些集中式配置,無需任何用戶編碼。
- 屬性更改時自動刷新屬性。應經過此類更改通知服務並從新加載新屬性。
- 保持更改歷史記錄並輕鬆恢復到舊版本。 這是一個很是有用的功能,能夠恢復生產環境中的錯誤更改。
Spring Cloud Config經過在配置服務中使用一個簡單的註釋@EnableConfigServer來支持全部這些功能,並在其餘服務中包含啓動器以啓用客戶端。有關更多詳細信息,請參閱
Spring Cloud Config文檔。
b. 經過Spring Cloud Discovery發現服務
服務發如今大多數分佈式系統和麪向服務的體系結構中起着重要做用。這個問題起初看起來很簡單:客戶如何知道多個主機上可能存在的服務的IP和端口?當您開始在多功能雲環境中部署更多服務時,事情變得更加複雜。
實際上,這一般分兩步完成:
- 服務註冊 - 服務在中央註冊表中註冊其位置的過程。它一般註冊其主機和端口,有時還會註冊身份驗證憑據,協議,版本和環境詳細信息。
- 服務發現 - 客戶端應用程序查詢中央註冊表以瞭解服務位置的過程。
在選擇服務發現解決方案時,應考慮如下幾個方面:
- 容錯 - 註冊服務失敗後會發生什麼?有時它會在正常關閉時當即取消註冊,但大多數狀況下咱們須要一個超時機制。服務不斷髮送心跳以確保活力。除此以外,客戶還須要可以經過自動重試另外一個服務來處理失敗的服務。
- 負載均衡 - 若是在服務下注冊了多個主機,咱們如何平衡主機之間的負載?是否會在註冊表端或客戶端進行負載均衡?咱們能夠提供自定義負載均衡策略嗎?
- 整合工做 - 整合過程有多複雜?它是否只涉及一些新的依賴和/或配置更改?仍是侵入式發現代碼?當您的語言不受支持時,有時候單獨的sidekick過程是一個不錯的選擇。
- 可用性問題 - 註冊表自己是否具備高可用性?能夠在沒有停機的狀況下升級嗎?註冊表不該該是單點故障。
c. 經過Spring Cloud Stream實現消息驅動的架構
假設咱們有一些微服務,而後必須相互通訊。顯然,傳統的同步方式是阻塞且難以擴展,這在複雜的分佈式環境中沒法生存,所以異步消息驅動是正確的方法。在現代世界中,每一個請求雲都被視爲一條消息。所以,各類消息傳遞中間件均可以使用本身的消息格式和API。讓全部這些中間件相互通訊是一場災難。實際上,解決這個問題很容易; 只需定義一個統一的消息接口,而後每一箇中間件提供一個適配器,它知道如何在它們的消息格式和標準格式之間進行轉換。如今您已經掌握了Spring Integration的核心設計原則。Spring Integration受如下目標的驅動:
- 提供實現複雜企業集成解決方案的簡單模型。
- 促進基於Spring的應用程序中的異步,消息驅動行爲。
- 促進現有Spring用戶的直觀,漸進式採用。
並遵循如下原則:
- 組件應鬆散耦合,以實現模塊化和可測試性。
- 該框架應該強制分離業務邏輯和集成邏輯之間的關注點。
- 擴展點本質上應該是抽象的,可是在明肯定義的邊界內,以促進重用和可移植性。
可是,Spring Integration仍然處於較低級別,而且包含非直觀的混淆術語。編程模型不像其餘Spring技術那樣易於使用。所以發明了Spring Cloud Stream。它基於Spring集成提供的標準消息格式和各類適配器,在高級綁定器抽象中工做,以更容易的方式生成,處理和使用消息。它看起來像一個unix管道; 你只須要擔憂如何處理消息。消息將按預期進出。Spring Cloud Stream提供以下高級功能:
- 消費者集團。這是由Apache Kafka首先介紹和推廣的。它能夠在一個編程模型中支持發佈 - 訂閱和競爭隊列。
- 分區。基於用戶提供的分區密鑰,在一個物理段中保證生成的具備相同分區密鑰的消息。這在有狀態處理中相當重要,由於出於性能或一致性的緣由,須要一塊兒處理相關數據。
- 自動內容協商。根據用戶接受的消息類型自動進行消息類型轉換。
d. 經過Spring Cloud Sleuth和Zipkin進行分佈式跟蹤
在微服務架構下,一個外部請求可能涉及多個內部服務調用,而且這些服務可能分佈在許多機器上。儘管大多數解決方案都實現了集中式日誌記錄存儲和搜索,但仍然難以跟蹤跨多個服務的端到端事務。弄清楚請求如何經過應用程序也意味着屢次手動搜索日誌關鍵字以找到線索。這很是耗時且容易出錯,尤爲是當您對微服務拓撲結構不夠了解時。實際上,咱們須要的是在一個地方關聯和聚合這些日誌。
Spring Cloud Sleuth經過引入Span和Trace的概念來實現這種相關性。Span表示一個基本工做單元,例如調用服務,由span ID標識。一組跨度造成一個名爲Trace的樹狀結構。跟蹤ID將保持與一個微服務調用下一個的相同。二者都將包含在每一個日誌條目中。此外,它自動設置常見的通訊渠道:
- 咱們以前討論過對Spring Cloud Stream Binder的請求
- Spring MVC控制器收到的HTTP頭
- 請求 RestTemplate
- ......以及Spring-ecology中的大多數其餘類型的請求和回覆
有了這些原始數據,仍然很難理解諸如微服務調用消耗最多時間之類的事情。Zipkin提供了一個漂亮的UI,以幫助咱們可視化和理解。您可使用簡單的註釋準備好Zipkin服務器 @EnableZipkinServer。有關更多詳細信息,請參閱
Spring Cloud Sleuth文檔。
2. Netflix介紹
Netflix(/nɛtflɪks/,官方中文名:網飛,民間翻譯:奈飛)是一間在世界多國提供網絡視頻點播的OTT服務公司[7],並同時在美國經營單一費率郵寄DVD出租服務。該服務是使用回郵信封寄送DVD和Blu-ray出租光盤至消費者指定的收件地址。公司由裏德·哈斯廷斯和馬爾克·蘭多夫在1997年8月29日成立,總部位於加利福尼亞州洛斯蓋圖,1999年開始推出訂閱制的服務。到了2009年,Netflix已可提供超過10萬部電影DVD,訂閱者數超過1000萬人[8]。2007年2月25日,Netflix宣佈已寄出第10億份DVD。[9]2011年4月,Netflix在美國有超過2300萬名訂閱者,在世界其餘國家共有超過2600萬名訂閱者。[10]在2011年,Netflix的數字總營收超過了150億美圓。[11]然而在2012年10月23日,Netflix宣佈當年度第三季的營收下滑了88%[12]。
2013年1月,Netflix宣佈在2012年第四季期間在美國增長了200萬名訂閱者,美國的流服務總訂閱者數達到2710萬,世界其餘國家則共有2940萬名流服務訂閱者。此外,在同一期間,Netflix的營收提高了8%,達到9.45億美圓。[13]
2013年3月中旬,Netflix共有3300萬名訂閱者[14]。訂閱者數在2013年4月達到3630萬人(其中美國訂閱者數爲2920萬人)[15]。其後Netflix的訂戶數與營收持續增加。截至2015年10月,Netflix在全世界共有6917萬名訂閱者,其中美國的訂閱者超過4300萬人。[16]
html
Netflix公司提供光盤出租和視頻訂閱服務,13年視頻訂閱者爲六千萬名,如此大的體量造就了Netflix在分佈式應用方面的成就。spring
Spring Cloud Netflix與各類Netflix OSS組件集成,組成微服務的核心,它組件主要有Eureka, Hystrix, Zuul, Archaius…
3. 核心組件介紹
- Spring Cloud Netflix Eureka
服務中心(相似於管家的概念,須要什麼直接從這裏取,就能夠了),一個基於 REST 的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。
服務中心,雲端服務發現,一個基於 REST 的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。這個但是springcloud最牛鼻的小弟,服務中心,任何小弟須要其它小弟支持什麼都須要從這裏來拿,一樣的你有什麼獨門武功的都趕忙過報道,方便之後其它小弟來調用;它的好處是你不須要直接找各類什麼小弟支持,只須要到服務中心來領取,也不須要知道提供支持的其它小弟在哪裏,仍是幾個小弟來支持的,反正拿來用就行,服務中心來保證穩定性和質量。
- Spring Cloud Netflix Hystrix
熔斷器,容錯管理工具,旨在經過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
熔斷器,容錯管理工具,旨在經過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。好比忽然某個小弟生病了,可是你還須要它的支持,而後調用以後它半天沒有響應,你殊不知道,一直在等等這個響應;有可能別的小弟也正在調用你的武功絕技,那麼當請求多以後,就會發生嚴重的阻塞影響老大的總體計劃。這個時候Hystrix就派上用場了,當Hystrix發現某個小弟不在狀態不穩定立馬立刻讓它下線,讓其它小弟來頂上來,或者給你說不用等了這個小弟今天確定不行,該幹嗎趕忙幹嗎去別在這排隊了。
- Spring Cloud Netflix Zuul
網關,是在雲平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Web 網站後端全部請求的前門。
Zuul 是在雲平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Zuul 至關因而設備和 Netflix 流應用的 Web 網站後端全部請求的前門。當其它門派來找大哥辦事的時候必定要先通過zuul,看下有沒有帶刀子什麼的給攔截回去,或者是須要找那個小弟的直接給帶過去。
- Spring Cloud Netflix Archaius
配置管理 API,包含一系列配置管理API,提供動態類型化屬性、線程安全配置操做、輪詢框架、回調機制等功能。數據庫
配置管理API,包含一系列配置管理API,提供動態類型化屬性、線程安全配置操做、輪詢框架、回調機制等功能。能夠實現動態獲取配置, 原理是每隔60s(默認,可配置)從配置源讀取一次內容,這樣修改了配置文件後不須要重啓服務就可使修改後的內容生效,前提使用archaius的API來讀取。
- Spring Cloud Netflix Ribbon 負載均衡。
- Spring Cloud Netflix Fegin REST客戶端。
消息總線,利用分佈式消息將服務和服務實例鏈接在一塊兒,用於在一個集羣中傳播狀態的變化。編程
事件、消息總線,用於在集羣(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。至關於水滸傳中日行八百里的神行太保戴宗,確保各個小弟之間消息保持暢通。
集羣工具,基於 Zookeeper, Redis, Hazelcast, Consul 實現的領導選舉和平民狀態模式的抽象和實現。後端
基於 Hashicorp Consul 實現的服務發現和配置管理。安全
將取代Spring Integration。提供在分佈式系統中的集羣所須要的基礎功能支持,如:選舉、集羣的狀態一致性、全局鎖、tokens等常見狀態模式的抽象和實現。bash
若是把不一樣的幫派組織成統一的總體,Spring Cloud Cluster已經幫你提供了不少方便組織成統一的工具。
Consul 是一個支持多數據中心分佈式高可用的服務發現和配置共享的服務軟件,由 HashiCorp 公司用 Go 語言開發, 基於 Mozilla Public License 2.0 的協議進行開源. Consul 支持健康檢查,並容許 HTTP 和 DNS 協議調用 API 存儲鍵值對.
Spring Cloud Consul 封裝了Consul操做,consul是一個服務發現與配置工具,與Docker容器能夠無縫集成。
- Spring Cloud for Cloud Foundry
Cloud Foundry是VMware推出的業界第一個開源PaaS雲平臺,它支持多種框架、語言、運行時環境、雲平臺及應用服務,使開發人員可以在幾秒鐘內進行應用程序的部署和擴展,無需擔憂任何基礎架構的問題
其實就是與CloudFoundry進行集成的一套解決方案,抱了Cloud Foundry的大腿。
安全控制,在 Zuul 代理中爲 OAuth2 REST 客戶端和認證頭轉發提供負載均衡。服務器
基於spring security的安全工具包,爲你的應用程序添加安全控制。這個小弟很牛鼻專門負責整個幫派的安全問題,設置不一樣的門派訪問特定的資源,不能把祕籍葵花寶典泄漏了。
分佈式鏈路監控,SpringCloud 應用的分佈式追蹤系統,和 Zipkin,HTrace,ELK 兼容。網絡
日誌收集工具包,封裝了Dapper和log-based追蹤以及Zipkin和HTrace操做,爲SpringCloud應用實現了一種分佈式追蹤解決方案。
短生命週期的微服務,爲 Spring Booot 應用簡單聲明添加功能和非功能特性。session
主要解決短命微服務的任務管理,任務調度的工做,好比說某些定時任務晚上就跑一次,或者某項數據分析臨時就跑幾回。
服務發現和配置管理基於 Apache Zookeeper。
ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
操做Zookeeper的工具包,用於使用zookeeper方式的服務發現和配置管理,抱了Zookeeper的大腿。
- Spring Cloud for Amazon Web Services
快速和亞馬遜網絡服務集成。
Spring Boot式的啓動項目,爲Spring Cloud提供開箱即用的依賴管理。
基於 Spring Boot CLI,可讓你以命令行方式快速創建雲組件。
簡化了鏈接到服務的過程和從雲平臺獲取操做的過程,有很強的擴展性,能夠利用Spring Cloud Connectors來構建你本身的雲平臺。
便於雲端應用程序在各類PaaS平臺鏈接到後端,如:數據庫和消息代理服務。
建立消息驅動微服務應用的框架, 基於Spring Boot建立,用來創建單獨的/工業級spring應用,使用spring integration提供與消息代理之間的鏈接。數據流操做開發包,封裝了與Redis,Rabbit、Kafka等發送接收消息。
一個業務會牽扯到多個任務,任務之間是經過事件觸發的,這就是Spring Cloud stream要乾的事了
用於大數據處理
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 爲基於微服務的分佈式流處理和批處理數據通道提供了一系列模型和最佳實踐。
總結
本文主要從三個問題認識了SpringCloud:
1.SpringCloud是什麼?
Spring Cloud是一系列框架的有序集合,爲開發人員提供了快速構建分佈式系統中一些常見模式的工具,解決分佈式應用中的服務發現註冊、配置中心、消息總線、負載均衡、斷路器、數據監控等問題。
2.爲何選用SpringCloud?
- 基於http協議,使用RESTful風格,接口簡潔方便,高效透明(Dubbo使用RPC協議,性能稍優於Http協議,但強耦合度較高)
- 依託於spring平臺、使用Spring Boot來構建服務,功能全面且開箱即用
- 社區活躍度高文檔豐富
3.如何使用SpringCloud?
a. SpringCloud的組件概覽
b. 應用架構
流程
- 請求統一經過 API 網關(Zuul)來訪問內部服務。
- 網關接收到請求後,從註冊中心(Eureka)獲取可用服務。
- 由 Ribbon 進行均衡負載後,分發到後端具體實例。
- 微服務之間經過 Feign 進行通訊處理業務。
- Hystrix 負責處理服務超時熔斷。
- Turbine 監控服務間的調用和熔斷相關指標。
本文僅用於學習交流,若有理解錯誤請指正
參考: