Java開發(fā)中使用微服務必須要了解之:Spring Cloud在架構演進中起到的作用

Spring Cloud作為一套微服務治理的框架镜沽,幾乎考慮到了微服務治理的方方面面,本篇主要解答這兩個問題:Spring Cloud在微服務的架構中都做了哪些事情报腔?Spring Cloud提供的這些功能對微服務的架構提供了怎樣的便利蜈彼?

傳統(tǒng)架構發(fā)展史

單體架構

單體架構在小微企業(yè)比較常見,典型代表就是一個應用总滩、一個數(shù)據(jù)庫纲堵、一個Web容器就可以跑起來,比如我們開發(fā)的開源軟件云收藏闰渔,就是標準的單體架構席函。

在兩種情況下可能會選擇單體架構:一是在企業(yè)發(fā)展的初期,為了保證快速上線冈涧,采用此種方案較為簡單靈活茂附;二是傳統(tǒng)企業(yè)中垂直度較高,訪問壓力較小的業(yè)務督弓。在這種模式下對技術要求較低营曼,方便各層次開發(fā)人員接手,也能滿足客戶需求愚隧。

下面是單體架構的架構圖:

image

單體架構的架構圖

在單體架構中蒂阱,技術選型非常靈活,優(yōu)先滿足快速上線的要求,也便于快速跟進市場录煤。

垂直架構

在單體架構發(fā)展一段時間后鳄厌,公司的業(yè)務模式得到了認可,交易量也慢慢的大起來妈踊,這時候有些企業(yè)為了應對更大的流量了嚎,就會對原有的業(yè)務進行拆分,比如說:后臺系統(tǒng)廊营、前端系統(tǒng)歪泳、交易系統(tǒng)等。

在這一階段往往會將系統(tǒng)分為不同的層級露筒,每個層級有對應的職責夹囚,UI層負責和用戶進行交互、業(yè)務邏輯層負責具體的業(yè)務功能邀窃、數(shù)據(jù)庫層負責和上層進行數(shù)據(jù)交換和存儲荸哟。

下面是垂直架構的架構圖:

image

垂直架構的架構圖

在這個階段SSH(Struts Spring Hibernate)是項目的關鍵技術,Struts負責Web層邏輯控制瞬捕、Spring負責業(yè)務層管理Bean鞍历、Hibernate負責數(shù)據(jù)庫操作進行封裝,持久化數(shù)據(jù)肪虎。

服務化架構

如果公司進一步的做大劣砍,垂直子系統(tǒng)會變的越來越多,系統(tǒng)和系統(tǒng)之間的調(diào)用關系呈指數(shù)上升的趨勢扇救。在這樣的背景下刑枝,很多公司都會考慮服務的SOA化。SOA代表面向服務的架構迅腔,將應用程序根據(jù)不同的職責劃分為不同的模塊装畅,不同的模塊直接通過特定的協(xié)議和接口進行交互。這樣使整個系統(tǒng)切分成很多單個組件服務來完成請求沧烈,當流量過大時通過水平擴展相應的組件來支撐掠兄,所有的組件通過交互來滿足整體的業(yè)務需求。

SOA服務化的優(yōu)點是锌雀,它可以根據(jù)需求通過網(wǎng)絡對松散耦合的粗粒度應用組件進行分布式部署蚂夕、組合和使用。服務層是SOA的基礎腋逆,可以直接被應用調(diào)用婿牍,從而有效控制系統(tǒng)中與軟件代理交互的人為依賴性。

服務化架構是一套松耦合的架構惩歉,服務的拆分原則是服務內(nèi)部高內(nèi)聚等脂,服務之間低耦合俏蛮。

下面是服務化架構圖:

image

服務化架構圖

在這個階段可以使用WebService或者Dubbo來服務治理。

我們發(fā)現(xiàn)從單體架構到服務化架構慎菲,應用數(shù)量都在不斷的增加嫁蛇,慢慢的下沉的就成了基礎組建锨并,上浮的就成為業(yè)務系統(tǒng)露该。從上述也可以看出架構的本質就是不斷的拆分重構:分的過程是把系統(tǒng)拆分為各個子系統(tǒng)/模塊/組件,拆的時候第煮,首先要解決每個組件的定位問題解幼,然后才能劃分彼此的邊界,實現(xiàn)合理的拆分包警。合就是根據(jù)最終要求撵摆,把各個分離的組件有機整合在一起。拆分的結果使開發(fā)人員能夠做到業(yè)務聚焦害晦、技能聚焦特铝,實現(xiàn)開發(fā)敏捷,合的結果是系統(tǒng)變得柔性壹瘟,可以因需而變鲫剿,實現(xiàn)業(yè)務敏捷。

SOA和微服務架構

SOA和微服務的區(qū)別

其實服務化架構已經(jīng)可以解決大部分企業(yè)的需求了稻轨,那么我們?yōu)槭裁匆芯课⒎漳亓榱肯日f說它們的區(qū)別:

  • 微服務架構強調(diào)業(yè)務系統(tǒng)需要徹底的組件化和服務化,一個組件就是一個產(chǎn)品殴俱,可以獨立對外提供服務

  • 微服務不再強調(diào)傳統(tǒng)SOA架構里面比較重的ESB企業(yè)服務總線

  • 架構是Java程序員無法繞開的話題政冻,在群619881427中分享了分布式架構,微服務架構线欲,源碼分析明场,Java工程化等知識點供大家免費下載學習,有興趣進階成為架構師的志同道合之士可以一起來學習分享李丰。

  • 微服務強調(diào)每個微服務都有自己獨立的運行空間榕堰,包括數(shù)據(jù)庫資源

  • 微服務架構本身來源于互聯(lián)網(wǎng)的思路,因此組件對外發(fā)布的服務強調(diào)了采用HTTP Rest API的方式來進行

  • 微服務的切分粒度會更小

總結:微服務架構是 SOA 架構思想的一種擴展嫌套,更加強調(diào)服務個體的獨立性逆屡、拆分粒度更小。

為什么考慮Spring Cloud

  • Spring Cloud來源于Spring踱讨,質量魏蔗、穩(wěn)定性、持續(xù)性都可以得到保證

  • Spirng Cloud天然支持Spring Boot痹筛,更加便于業(yè)務落地

  • Spring Cloud發(fā)展非常的快莺治,從16年開始接觸的時候相關組件版本為1.x廓鞠,到現(xiàn)在將要發(fā)布2.x系列

  • Spring Cloud是Java領域最適合做微服務的框架

  • 相比于其它框架,Spring Cloud對微服務周邊環(huán)境的支持力度最大

  • 對于中小企業(yè)來講,使用門檻較低

Spring Cloud是微服務架構的最佳落地方案谣旁!

它的特性

以下為Spring Cloud的核心特性:

  • 分布式/版本化配置

  • 服務注冊和發(fā)現(xiàn)

  • 路由

  • 服務和服務之間的調(diào)用

  • 負載均衡

  • 斷路器

  • 分布式消息傳遞

這些特性都是由不同的組件來完成床佳,在架構的演進過程中扮演著重要的角色,接下來我們一起看看榄审。

微服務架構

Spring Cloud解決的第一個問題就是:服務與服務之間的解耦砌们。很多公司在業(yè)務高速發(fā)展的時候,服務組件也會相應的不斷增加搁进。服務和服務之間有著復雜的相互調(diào)用關系浪感,經(jīng)常有服務A調(diào)用服務B,服務B調(diào)用服務C和服務D……饼问,隨著服務化組件的不斷增多影兽,服務之間的調(diào)用關系成指數(shù)級別的增長,極端情況下就如下圖所示:

image

這樣最容易導致的情況就是牽一發(fā)而動全身莱革。經(jīng)常出現(xiàn)由于某個服務更新而沒有通知到其它服務峻堰,導致上線后慘案頻發(fā)。這時候就應該進行服務治理盅视,將服務之間的直接依賴轉化為服務對服務中心的依賴捐名。Spring Cloud 核心組件Eureka就是解決這類問題。

Eureka

Eureka是Netflix開源的一款提供服務注冊和發(fā)現(xiàn)的產(chǎn)品左冬,它提供了完整的Service Registry和Service Discovery實現(xiàn)桐筏。也是Spring Cloud體系中最重要最核心的組件之一。

用大白話講拇砰,Eureka就是一個服務中心梅忌,將所有的可以提供的服務都注冊到它這里來管理,其它各調(diào)用者需要的時候去注冊中心獲取除破,然后再進行調(diào)用牧氮,避免了服務之間的直接調(diào)用,方便后續(xù)的水平擴展瑰枫、故障轉移等踱葛。如下圖:

image

當然服務中心這么重要的組件一但掛掉將會影響全部服務,因此需要搭建Eureka集群來保持高可用性光坝,生產(chǎn)中建議最少兩臺尸诽。隨著系統(tǒng)的流量不斷增加,需要根據(jù)情況來擴展某個服務盯另,Eureka內(nèi)部已經(jīng)提供均衡負載的功能性含,只需要增加相應的服務端實例既可。那么在系統(tǒng)的運行期間某個實例掛了怎么辦鸳惯?Eureka內(nèi)容有一個心跳檢測機制商蕴,如果某個實例在規(guī)定的時間內(nèi)沒有進行通訊則會自動被剔除掉叠萍,避免了某個實例掛掉而影響服務。

Hystrix

在微服務架構中通常會有多個服務層調(diào)用绪商,基礎服務的故障可能會導致級聯(lián)故障苛谷,進而造成整個系統(tǒng)不可用的情況,這種現(xiàn)象被稱為服務雪崩效應格郁。服務雪崩效應是一種因“服務提供者”的不可用導致“服務消費者”的不可用腹殿,并將不可用逐漸放大的過程。

如下圖所示:A作為服務提供者理张,B為A的服務消費者赫蛇,C和D是B的服務消費者绵患。A不可用引起了B的不可用雾叭,并將不可用像滾雪球一樣放大到C和D時,雪崩效應就形成了落蝙。

image

在這種情況下就需要整個服務機構具有故障隔離的功能织狐,避免某一個服務掛掉影響全局。在Spring Cloud 中Hystrix組件就扮演這個角色筏勒。

Hystrix會在某個服務連續(xù)調(diào)用N次不響應的情況下移迫,立即通知調(diào)用端調(diào)用失敗,避免調(diào)用端持續(xù)等待而影響了整體服務管行。Hystrix間隔時間會再次檢查此服務厨埋,如果服務恢復將繼續(xù)提供服務。

Hystrix Dashboard和Turbine

當熔斷發(fā)生的時候需要迅速的響應來解決問題捐顷,避免故障進一步擴散荡陷,那么對熔斷的監(jiān)控就變得非常重要。熔斷的監(jiān)控現(xiàn)在有兩款工具:Hystrix-dashboard和Turbine迅涮。

Hystrix-dashboard是一款針對Hystrix進行實時監(jiān)控的工具废赞,通過Hystrix Dashboard我們可以直觀地看到各Hystrix Command的請求響應時間, 請求成功率等數(shù)據(jù)。但是只使用Hystrix Dashboard的話, 你只能看到單個應用內(nèi)的服務信息, 這明顯不夠. 我們需要一個工具能讓我們匯總系統(tǒng)內(nèi)多個服務的數(shù)據(jù)并顯示到Hystrix Dashboard上叮姑,這個工具就是Turbine唉地,監(jiān)控的效果圖如下:

image

配置中心

隨著微服務不斷的增多,每個微服務都有自己對應的配置文件传透。在研發(fā)過程中有測試環(huán)境耘沼、UAT環(huán)境、生產(chǎn)環(huán)境朱盐,因此每個微服務又對應至少三個不同環(huán)境的配置文件群嗤。這么多的配置文件,如果需要修改某個公共服務的配置信息托享,如:緩存骚烧、數(shù)據(jù)庫等浸赫,難免會產(chǎn)生混亂,這個時候就需要引入Spring Cloud另外一個組件:Spring Cloud Config赃绊。

Spring Cloud Config

Spring Cloud Config是一個解決分布式系統(tǒng)的配置管理方案既峡。它包含了Client和Server兩個部分,Server提供配置文件的存儲碧查、以接口的形式將配置文件的內(nèi)容提供出去运敢,Client通過接口獲取數(shù)據(jù)、并依據(jù)此數(shù)據(jù)初始化自己的應用忠售。

其實就是Server端將所有的配置文件服務化传惠,需要配置文件的服務實例去Config Server獲取對應的數(shù)據(jù)。將所有的配置文件統(tǒng)一整理稻扬,避免了配置文件碎片化卦方。架構是Java程序員無法繞開的話題,在群619881427中分享了分布式架構泰佳,微服務架構盼砍,源碼分析,Java工程化等知識點供大家免費下載學習逝她,有興趣進階成為架構師的志同道合之士可以一起來學習分享浇坐。

如果服務運行期間改變配置文件,服務是不會得到最新的配置信息黔宛,需要解決這個問題就需要引入Refresh近刘。可以在服務的運行期間重新加載配置文件臀晃。

當所有的配置文件都存儲在配置中心的時候觉渴,配置中心就成為了一個非常重要的組件。如果配置中心出現(xiàn)問題將會導致災難性的后果积仗,因此在生產(chǎn)中建議對配置中心做集群疆拘,來支持配置中心高可用性。

Spring Cloud Bus

上面的Refresh方案雖然可以解決單個微服務運行期間重載配置信息的問題寂曹,但是在真正的實踐生產(chǎn)中哎迄,可能會有N多的服務需要更新配置,如果每次依靠手動Refresh將是一個巨大的工作量隆圆,這時候Spring Cloud提出了另外一個解決方案:Spring Cloud Bus漱挚。

Spring Cloud Bus通過輕量消息代理連接各個分布的節(jié)點。這會用在廣播狀態(tài)的變化(例如配置變化)或者其它的消息指令中渺氧。Spring Cloud Bus的一個核心思想是通過分布式的啟動器對Spring Boot應用進行擴展旨涝,也可以用來建立一個或多個應用之間的通信頻道。目前唯一實現(xiàn)的方式是用AMQP消息代理作為通道侣背。

Spring Cloud Bus是輕量級的通訊組件白华,也可以用在其它類似的場景中慨默。有了Spring Cloud Bus之后,當我們改變配置文件提交到版本庫中時弧腥,會自動的觸發(fā)對應實例的Refresh厦取,具體的工作流程如下:

image

服務網(wǎng)關

在微服務架構模式下,后端服務的實例數(shù)一般是動態(tài)的管搪,對于客戶端而言很難發(fā)現(xiàn)動態(tài)改變的服務實例的訪問地址信息虾攻。因此在基于微服務的項目中為了簡化前端的調(diào)用邏輯,通常會引入API Gateway作為輕量級網(wǎng)關更鲁,同時API Gateway中也會實現(xiàn)相關的認證邏輯從而簡化內(nèi)部服務之間相互調(diào)用的復雜度霎箍。

image

Spring Cloud體系中支持API Gateway落地的技術就是Zuul。Spring Cloud Zuul路由是微服務架構中不可或缺的一部分澡为,提供動態(tài)路由漂坏,監(jiān)控,彈性缀壤,安全等的邊緣服務樊拓。Zuul是Netflix出品的一個基于JVM路由和服務端的負載均衡器纠亚。

它的具體作用就是服務轉發(fā)塘慕,接收并轉發(fā)所有內(nèi)外部的客戶端調(diào)用。使用Zuul可以作為資源的統(tǒng)一訪問入口蒂胞,同時也可以在網(wǎng)關做一些權限校驗等類似的功能图呢。

鏈路跟蹤

隨著服務的越來越多,對調(diào)用鏈的分析會越來越復雜骗随,如服務之間的調(diào)用關系蛤织、某個請求對應的調(diào)用鏈、調(diào)用之間消費的時間等鸿染,對這些信息進行監(jiān)控就成為一個問題指蚜。在實際的使用中我們需要監(jiān)控服務和服務之間通訊的各項指標,這些數(shù)據(jù)將是我們改進系統(tǒng)架構的主要依據(jù)涨椒。因此分布式的鏈路跟蹤就變的非常重要摊鸡,Spring Cloud也給出了具體的解決方案:Spring Cloud Sleuth和Zipkin。

image

Spring Cloud Sleuth為服務之間調(diào)用提供鏈路追蹤蚕冬。通過Sleuth可以很清楚的了解到一個服務請求經(jīng)過了哪些服務免猾,每個服務處理花費了多長時間。從而讓我們可以很方便的理清各微服務間的調(diào)用關系囤热。

Zipkin是Twitter的一個開源項目猎提,允許開發(fā)者收集 Twitter 各個服務上的監(jiān)控數(shù)據(jù),并提供查詢接口

分布式鏈路跟蹤需要Sleuth+Zipkin結合來實現(xiàn)旁蔼。

總結

我們從整體上來看一下Spring Cloud各個組件如何來配套使用:

image

從上圖可以看出Spring Cloud各個組件相互配合锨苏,合作支持了一套完整的微服務架構疙教。

  • 其中Eureka負責服務的注冊與發(fā)現(xiàn),很好將各服務連接起來

  • Hystrix負責監(jiān)控服務之間的調(diào)用情況伞租,連續(xù)多次失敗進行熔斷保護

  • Hystrix dashboard松逊,Turbine負責監(jiān)控Hystrix的熔斷情況,并給予圖形化的展示

  • Spring Cloud Config提供了統(tǒng)一的配置中心服務

  • 當配置文件發(fā)生變化的時候肯夏,Spring Cloud Bus負責通知各服務去獲取最新的配置信息

  • 架構是Java程序員無法繞開的話題经宏,在群619881427中分享了分布式架構,微服務架構驯击,源碼分析烁兰,Java工程化等知識點供大家免費下載學習,有興趣進階成為架構師的志同道合之士可以一起來學習分享徊都。

  • 所有對外的請求和服務沪斟,我們都通過Zuul來進行轉發(fā),起到API網(wǎng)關的作用

  • 最后我們使用Sleuth+Zipkin將所有的請求數(shù)據(jù)記錄下來暇矫,方便我們進行后續(xù)分析

Spring Cloud從設計之初就考慮了絕大多數(shù)互聯(lián)網(wǎng)公司架構演化所需的功能主之,如服務發(fā)現(xiàn)注冊、配置中心李根、消息總線槽奕、負載均衡、斷路器房轿、數(shù)據(jù)監(jiān)控等粤攒。這些功能都是以插拔的形式提供出來,方便我們系統(tǒng)架構演進的過程中囱持,可以合理的選擇需要的組件進行集成夯接,從而在架構演進的過程中會更加平滑、順利纷妆。

微服務架構是一種趨勢盔几,Spring Cloud提供了標準化的、全站式的技術方案掩幢,意義可能會堪比當前Servlet規(guī)范的誕生逊拍,有效推進服務端軟件系統(tǒng)技術水平的進步。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粒蜈,一起剝皮案震驚了整個濱河市顺献,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枯怖,老刑警劉巖注整,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡肿轨,警方通過查閱死者的電腦和手機寿冕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椒袍,“玉大人驼唱,你說我怎么就攤上這事【允睿” “怎么了玫恳?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長优俘。 經(jīng)常有香客問我京办,道長,這世上最難降的妖魔是什么帆焕? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任惭婿,我火速辦了婚禮,結果婚禮上叶雹,老公的妹妹穿的比我還像新娘财饥。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雀摘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天肋拔,我揣著相機與錄音氛魁,去河邊找鬼。 笑死乖篷,一個胖子當著我的面吹牛响驴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撕蔼,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼豁鲤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲸沮?” 一聲冷哼從身側響起琳骡,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讼溺,沒想到半個月后楣号,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年炫狱,在試婚紗的時候發(fā)現(xiàn)自己被綠了藻懒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡视译,死狀恐怖嬉荆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酷含,我是刑警寧澤鄙早,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站椅亚,受9級特大地震影響蝶锋,放射性物質發(fā)生泄漏。R本人自食惡果不足惜什往,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一扳缕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧别威,春花似錦躯舔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豺妓,卻和暖如春惜互,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琳拭。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工训堆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人白嘁。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓坑鱼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親絮缅。 傳聞我的和親對象是個殘疾皇子鲁沥,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容