在瞭解
SpringCloud
以前,咱們先來大體瞭解下微服務
這個概念吧。web
單體架構在小微企業比較常見,典型表明就是一個應用、一個數據庫、一個web容器就能夠跑起來。redis
能夠從上圖看出,單體架構基本上就是如上所說的:一個應用,一個數據庫,一個web容器,裏面集成了全部的功能。這在小型項目裏面時比較好維護的,畢竟功能很少,也不復雜,但擴展性和可靠性比較差,由於全部功能集成在一個服務或者一個war包中,修改某個功能時,須要全部服務從新打包。可能前期開發比較快,後期隨着功能的增加,交互的週期會越變越長的。算法
服務化架構,也能夠稱之爲
SOA
架構。spring
SOA
表明面向服務
的架構,將應用程序根據不一樣的職責劃分爲不一樣的模塊,不一樣的模塊直接經過特定的協議和接口進行交互。這樣使整個系統切分紅不少單個組件服務來完成請求,當流量過大時經過水平擴展相應的組件來支撐,全部的組件經過交互來知足總體的業務需求。數據庫
SOA
服務化的優勢是,它能夠根據需求經過網絡對鬆散耦合的粗粒度應用組件進行分佈式部署、組合和使用。服務層是SOA
的基礎,能夠直接被應用調用,從而有效控制系統中與軟件代理交互的人爲依賴性。編程
服務化架構是一套鬆耦合的架構,服務的拆分原則是服務內部高內聚,服務之間低耦合。後端
通常上咱們使用dubbo
來進行服務的治理功能,沒有使用SpringCloud
以前,基本上都是使用dubbo
來拆分服務,進行服務間的調用。安全
看下服務化架構的架構圖:服務器
能夠發現從單體架構到服務化架構,應用數量都在不斷的增長,慢慢的下沉的就成了基礎組建,上浮的就成爲業務系統。從上述也能夠看出架構的本質就是不斷的拆分重構:分的過程是把系統拆分爲各個子系統
/模塊
/組件
,拆的時候,首先要解決每一個組件的定位問題,而後才能劃分彼此的邊界
,實現合理的拆分。合就是根據最終要求,把各個分離的組件有機整合在一塊兒。拆分的結果使開發人員可以作到業務聚焦、技能聚焦,實現開發敏捷,合的結果是系統變得柔性,能夠因需而變,實現業務敏捷。網絡
其實,我以爲最核心仍是邊界拆分
。如何拆,拆的顆粒度要多細,就很考驗一個架構師對業務和底層技術的掌控程度。一個好的架構師,會讓整個系統邊界清晰,涇渭分明,功能沒有多少重疊的。(不知道什麼時候才能成長爲一名架構師(┬_┬))
簡單來講,微服務架構是 SOA 架構思想的一種擴展,更增強調服務個體的獨立性、拆分粒度更小。
下面這個圖,也是上次給公司內部培訓PPT上的,我以爲能夠能好的歸納出何爲微服務:
其實服務化架構已經能夠解決大部分企業的需求了,那麼咱們爲何要研究微服務呢?先說說它們的區別;
下面的這張圖,相信你們都應該看過,固然,這個圖只是一部分,你們有興趣能夠看看《一個典型的微服務架構》:
簡單來講,從圖中能夠看出,每個應用功能區都使用微服務完成,是相互獨立的,之間經過輕量級的通訊協議(Http)進行服務通訊,這樣的話,各個應用能夠按實際業務需求,選擇本身的技術棧和開發語言。
因此能夠看出,微服務的好處有:服務獨立、擴展性好、可靠性強,但同時,也面臨一些新的問題,好比運維複雜性,分佈式複雜性、監控複雜性等等。
SpringCloud
是基於SpringBoot
的一整套實現微服務的框架。它提供了微服務開發所需的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等組件。最重要的是,基於SpringBoot,會讓開發微服務架構很是方便。
官網也給出了SpringCloud
的定位和說明:
既然,自己SpringClud
是一套框架
,是個大管家。下圖列舉了一些比較核心的功能:
自己SpringCloud
包含了不少的組件,下面簡單列舉說明下:
Spring Cloud Gateway
是Spring
官方基於Spring 5.0
,Spring Boot 2.0
和Project Reactor
等技術開發的網關,Spring Cloud Gateway
旨在爲微服務架構提供一種簡單而有效的統一的API路由管理方式。Spring Cloud Gateway
做爲Spring Cloud
生態系中的網關,目標是替代Netflix ZUUL
,其不只提供統一的路由方式,而且基於Filter鏈的方式提供了網關基本的功能,例如:安全,監控/埋點,和限流等。
這但是個大boss,地位僅次於老大,老大各項服務依賴與它,與各類Netflix OSS組件集成,組成微服務的核心,它的小弟主要有Eureka
, Hystrix
, Zuul
… 太多了
Netflix Eureka
服務中心
,雲端服務發現,一個基於REST
的服務,用於定位服務,以實現雲端中間層服務發現和故障轉移。服務中心
,任何小弟須要其它小弟支持什麼都須要從這裏來拿,一樣的你有什麼獨門武功的都趕忙過報道,方便之後其它小弟來調用;它的好處是你不須要直接找各類什麼小弟支持,只須要到服務中心來領取,也不須要知道提供支持的其它小弟在哪裏,仍是幾個小弟來支持的,反正拿來用就行,服務中心來保證穩定性和質量。
Netflix Hystrix
熔斷器,容錯管理工具,旨在經過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。好比忽然某個小弟生病了,可是你還須要它的支持,而後調用以後它半天沒有響應,你殊不知道,一直在等等這個響應;有可能別的小弟也正在調用你的武功絕技,那麼當請求多以後,就會發生嚴重的阻塞影響老大的總體計劃。這個時候Hystrix
就派上用場了,當Hystrix發現某個小弟不在狀態不穩定立馬立刻讓它下線,讓其它小弟來頂上來,或者給你說不用等了這個小弟今天確定不行,該幹嗎趕忙幹嗎去別在這排隊了。
Netflix Zuul
Zuul
是在雲平臺上提供動態路由,監控,彈性,安全等邊緣服務的框架。Zuul
至關因而設備和Netflix
流應用的 Web 網站後端全部請求的前門。當其它門派來找大哥辦事的時候必定要先通過zuul
,看下有沒有帶刀子什麼的給攔截回去,或者是須要找那個小弟的直接給帶過去。
俗稱的配置中心,配置管理工具包,讓你能夠把配置放到遠程服務器,集中化管理集羣配置,目前支持本地存儲、Git以及Subversion。就是之後你們武器、槍火什麼的東西都集中放到一塊兒,別隨便本身帶,方便之後統一管理、升級裝備。
事件、消息總線,用於在集羣(例如,配置變化事件)中傳播狀態變化,可與Spring Cloud Config聯合實現熱部署。至關於水滸傳中日行八百里的神行太保戴宗,確保各個小弟之間消息保持暢通。
Cloud Foundry是VMware推出的業界第一個開源PaaS雲平臺,它支持多種框架、語言、運行時環境、雲平臺及應用服務,使開發人員可以在幾秒鐘內進行應用程序的部署和擴展,無需擔憂任何基礎架構的問題
其實就是與CloudFoundry進行集成的一套解決方案,抱了Cloud Foundry的大腿。
Spring Cloud Cluster將取代Spring Integration。提供在分佈式系統中的集羣所須要的基礎功能支持,如:選舉、集羣的狀態一致性、全局鎖、tokens等常見狀態模式的抽象和實現。
若是把不一樣的幫派組織成統一的總體,Spring Cloud Cluster已經幫你提供了不少方便組織成統一的工具。
Consul
是一個支持多數據中心分佈式高可用的服務發現和配置共享的服務軟件,由 HashiCorp 公司用 Go 語言開發, 基於 Mozilla Public License 2.0 的協議進行開源. Consul 支持健康檢查,並容許 HTTP 和 DNS 協議調用 API 存儲鍵值對.
Spring Cloud Consul
封裝了Consul
操做,consul
是一個服務發現與配置工具,與Docker
容器能夠無縫集成。
以後的文章,也基本上是講解這些組件的使用了。
固然,除了以上列舉的,還有好比Spring Cloud Security
、Spring Cloud Sleuth
、Spring Cloud Data Flow
、Spring Cloud Stream
、Spring Cloud Zookeeper
等等。
Spring Cloud Security
基於spring security的安全工具包,爲你的應用程序添加安全控制。這個小弟很牛鼻專門負責整個幫派的安全問題,設置不一樣的門派訪問特定的資源,不能把祕籍葵花寶典泄漏了。
Spring Cloud Sleuth
日誌收集工具包,封裝了Dapper
和log-based
追蹤以及Zipkin
和HTrace
操做,爲SpringCloud
應用實現了一種分佈式追蹤解決方案。
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 爲基於微服務的分佈式流處理和批處理數據通道提供了一系列模型和最佳實踐。
Spring Cloud Stream
Spring Cloud Stream
是建立消息驅動微服務應用的框架。Spring Cloud Stream
是基於Spring Boo
t建立,用來創建單獨的/工業級spring應用
,使用spring integration
提供與消息代理之間的鏈接。數據流操做開發包,封裝了與Redis
,Rabbit
、Kafka
等發送接收消息。
一個業務會牽扯到多個任務,任務之間是經過事件觸發的,這就是Spring Cloud stream
要乾的事了
Spring Cloud Task
Spring Cloud Task
主要解決短命微服務的任務管理,任務調度的工做,好比說某些定時任務晚上就跑一次,或者某項數據分析臨時就跑幾回。
Spring Cloud Zookeeper
ZooKeeper
是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google
的Chubby
一個開源的實現,是Hadoop
和Hbase
的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。ZooKeeper
的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
操做Zookeeper
的工具包,用於使用zookeeper
方式的服務發現和配置管理,抱了Zookeeper
的大腿。
Spring Cloud Connectors
Spring Cloud Connectors
簡化了鏈接到服務的過程和從雲平臺獲取操做的過程,有很強的擴展性,能夠利用Spring Cloud Connectors
來構建你本身的雲平臺。
便於雲端應用程序在各類PaaS平臺鏈接到後端,如:數據庫和消息代理服務。
Spring Cloud CLI
基於Spring Boot CLI
,可讓你以命令行方式快速創建雲組件。
題外話:這麼多組件,目前用到的還比較少的⊙﹏⊙‖∣。經常使用的仍是Netflix
的全家桶。學習之路,路漫漫其修遠兮!
微服務的框架那麼多好比:dubbo
,爲何就要使用Spring Cloud的呢?
題外話:年初的時候,Dubbo
又開始瘋狂更新了,並且還成爲Apache
基金會孵化項目。但願愈來愈好把,畢竟以前的坑比較多,還但願能儘快修復。
作一個簡單的功能對比:
核心要素 | Dubbo | Spring Cloud |
---|---|---|
服務註冊中心 | Zookeeper | Spring Cloud Netflix Eureka |
服務調用方式 | RPC | REST API |
服務監控 | Dubbo-monitor | 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 |
…… | …… | …… |
從上圖能夠看出其實Dubbo的功能只是Spring Cloud體系的一部分。
這樣對比是不夠公平的,首先Dubbo
是SOA
時代的產物,它的關注點主要在於服務的調用,流量分發、流量監控和熔斷。而Spring Cloud
誕生於微服務架構時代,考慮的是微服務治理的方方面面,另外因爲依託了Spirng
、Spirng Boot
的優點之上,兩個框架在開始目標就不一致,Dubbo
定位服務治理、Spirng Cloud
是一個生態。
若是僅僅關注於服務治理的這個層面,Dubbo其實還優於Spring Cloud不少:
題外話:可經過dubbo-monitor
和dubbo-admin
進行監控和管理相關配置。這兩個項目自己仍是不錯的。本想截個圖,看了下電腦沒有安裝。⊙﹏⊙‖∣
因此Dubbo專一於服務治理;Spring Cloud關注於微服務架構生態。
Spring Cloud
項目目前仍然是快速迭代期,版本變化很快。Spring Cloud
並無熟悉的數字版本號,而是對應一個開發代號。
本系列教程使用的都是Finchley SR1
版本,基於Spring Boot 2.0.3
。
官網給出了目前各版本對應組件的版本信息:
Component | Edgware.SR4 | Finchley.SR1 | Finchley.BUILD-SNAPSHOT |
---|---|---|---|
spring-cloud-aws | 1.2.3.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-cloud-bus | 1.3.3.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-cloud-cli | 1.4.1.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-cloud-commons | 1.3.4.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-contract | 1.2.5.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-config | 1.4.4.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-netflix | 1.4.5.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-security | 1.2.3.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-cloud-cloudfoundry | 1.1.2.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-cloud-consul | 1.3.4.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-sleuth | 1.3.4.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-stream | Ditmars.SR4 | Elmhurst.SR1 | Elmhurst.BUILD-SNAPSHOT |
spring-cloud-zookeeper | 1.2.2.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-boot | 1.5.14.RELEASE | 2.0.4.RELEASE | 2.0.4.BUILD-SNAPSHOT |
spring-cloud-task | 1.2.3.RELEASE | 2.0.0.RELEASE | 2.0.1.BUILD-SNAPSHOT |
spring-cloud-vault | 1.1.1.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-gateway | 1.0.2.RELEASE | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT |
spring-cloud-openfeign | 2.0.1.RELEASE | 2.0.2.BUILD-SNAPSHOT | |
spring-cloud-function | 1.0.0.RELEASE | 1.0.0.RELEASE | 1.0.1.BUILD-SNAPSHOT |
簡單說明:
規律,但實際上首字母是有順序的,好比:Dalston
版本,咱們能夠簡稱D
版本,對應的Edgware
版本咱們能夠簡稱E
版本,目前最新的Finchley
就是所說的F
版本。
SpringCloud F版 對應 SpringBoot 2.x
小版本:
同時,注意官網的一句話:
Finchley builds and works with Spring Boot 2.0.x, and is not expected to work with Spring Boot 1.5.x
因此,寫此係列教程,順道能夠把SpringBoot2
新增的相關知識點也能夠學習瞭解下。後續SpringBoot2
的知識點會在SpringBoot
系列文章中更新!
本文大部份內容是在上次編寫培訓ppt時後找的相關材料,理論的東西有點多了。真的仍是代碼簡單點,是一就是一,很純粹。正是如
Linus
大神說的:Talk is cheap. Show me the code
。翻譯成咱們博大精深的漢語就是:空談誤國,碼不出何以論天下
。哈哈。最後仍是但願能經過此係列,能提高本身對SpringCloud
的認識吧,同時也但願能讓未接觸過SpringCloud
的同窗,經過此係列教程,能簡單的使用各組件。