- SpringBoot揭秘:快速構(gòu)建微服務(wù)體系
- 王福強
- 1553字
- 2019-06-28 14:06:22
1.3.1 獨立,獨立,還是獨立
我們說微服務(wù)打響的是各自的獨立戰(zhàn)爭,所以,每一個微服務(wù)都是一個小王國,這些微服務(wù)跳出了“大一統(tǒng)”(Monolith)王國的統(tǒng)治,開始從各個層面打造自己的獨立能力,從而保障自己的小王國可以持續(xù)穩(wěn)固的運轉(zhuǎn)。
首先,在開發(fā)層面,每個微服務(wù)基本上都是各自獨立的項目(project),而對應(yīng)各自獨立項目的研發(fā)團隊基本上也是獨立對應(yīng),這樣的結(jié)構(gòu)保證了微服務(wù)的并行研發(fā),并且各自快速迭代,不會因為所有研發(fā)都投入一個近乎單點的項目,從而造成開發(fā)階段的瓶頸。開發(fā)階段的獨立,保證了微服務(wù)的研發(fā)可以高效進行。
服務(wù)開發(fā)期間的形態(tài),跟服務(wù)交付期間的形態(tài)原則上是不需要完全高度統(tǒng)一的,即使我們在開發(fā)的時候都是各自進行,但交付的時候還是可以一起交付,不過這不是微服務(wù)的做法。在微服務(wù)治理體系下,各個微服務(wù)交付期間也是各自獨立交付的,從而使得每個微服務(wù)從開發(fā)到交付整條鏈路上都是獨立進行,這大大加快了微服務(wù)的迭代和交付效率。
服務(wù)交付之后需要部署運行,對微服務(wù)來說,它們運行期間也是各自獨立的。
微服務(wù)獨立運行可以帶來兩個比較明顯的好處,第一個就是可擴展性。我們可以快速地添加服務(wù)集群的實例,提升整個微服務(wù)集群的服務(wù)能力,而在傳統(tǒng)Monolith模式下,為了能夠提升服務(wù)能力,很多時候必須強化和擴展單一結(jié)點的服務(wù)能力來達成。如果單結(jié)點服務(wù)能力已經(jīng)擴展到了極限,再尋求擴展的話,就得從軟件到硬件整體進行重構(gòu)。
軟件行業(yè)有句話:“Threads don' t scale, Processes do! ”,很明確地道出了原來Monolith服務(wù)與微服務(wù)在擴展(Scale)層面的差異。
對于Java開發(fā)者來說,早些年(當然現(xiàn)在也依然存在),我們遵循Java EE規(guī)范開發(fā)的Web應(yīng)用,都需要以WAR包的形式部署到TOMCAT、Jetty、RESIN等Web容器中運行,即使每個WAR包提供的都是獨立的微服務(wù),但因為它們都是統(tǒng)一部署運行在一個Web容器中,所以擴展能力受限于Web容器作為一個進程(process)的現(xiàn)狀。無論如何調(diào)整Web容器內(nèi)部實現(xiàn)的線程(thread)設(shè)置,還是會受限于Web容器整體的擴展能力。所以,現(xiàn)在很多情況下,大家都是一個TOMCAT只部署一個WAR,然后通過復(fù)制和擴展多個TOMCAT實例來擴展整個應(yīng)用服務(wù)集群。
當然,說到在TOMCAT實例中只部署一個WAR包這樣的做法,實際上不單單只是因為擴展的因素,還涉及微服務(wù)運行期間給我們帶來的第二個好處,即隔離性。
隔離性實際上是可擴展性的基礎(chǔ),當我們將每個微服務(wù)都隔離為獨立的運行單元之后,任何一個或者多個微服務(wù)的失敗都將只影響自己或者少量其他微服務(wù),而不會大面積地波及整個服務(wù)運行體系。在架構(gòu)設(shè)計上有一種實踐模式,即隔板模式(Bulkhead Pattern),這種架構(gòu)設(shè)計模式的首要目的就是為了隔離系統(tǒng)中的各個功能單元和實體,使得系統(tǒng)不會因為一個單元或者服務(wù)的失敗而導(dǎo)致整體失敗。這種思路在造船行業(yè)、兵工行業(yè)都有類似的應(yīng)用場景。現(xiàn)在任何大型船舶在設(shè)計上都會有隔艙,目的就是即使有少量進水,也可以只將進水部位隔離在小范圍,不會擴散而導(dǎo)致船舶大面積進水,從而沉沒。當年泰坦尼克號雖然沉了,但不意味著他們沒有做隔艙設(shè)計,只能說,傷害度已經(jīng)遠遠超出隔艙可以提供的基礎(chǔ)保障范圍。在坦克的設(shè)計上,現(xiàn)在一般也會將彈藥艙和乘員艙隔離,從而可以保障當坦克受創(chuàng)之后,將傷害盡量限定在指定區(qū)域,盡量減少對車乘成員的傷害。
前面我們提到,現(xiàn)在大家基本上弱化了Java EE的Web容器早期采用的“一個Web容器部署多個WAR包”的做法,轉(zhuǎn)而使用“一個Web容器只部署一個WAR包”的做法,這實際上正是綜合考慮了Web容器的設(shè)計和實現(xiàn)現(xiàn)狀與真實需求之后做出的合理實踐選擇。這些Web容器內(nèi)部大多通過類加載器(Classloader)以及線程來實現(xiàn)一定程度上的依賴和功能隔離,但這些機制從基因上決定了這些做法不是最好的隔離手段。而進程(Process)擁有天然的隔離特性,所以,一個WAR包只部署運行在一個Web容器進程中才是最好的隔離方式。
現(xiàn)在回想一下,好像自從各個微服務(wù)打響?yīng)毩?zhàn)爭并且獨立之后,無論從哪個層面來看,各自“活”得都挺好。
- CAE分析大系:ANSYS?Workbench結(jié)構(gòu)分析與實例詳解
- 知行合一: 實現(xiàn)價值驅(qū)動的敏捷和精益開發(fā)
- 數(shù)字化轉(zhuǎn)型架構(gòu):方法論與云原生實踐
- 實戰(zhàn)Java虛擬機:JVM故障診斷與性能優(yōu)化(第2版)
- 產(chǎn)品經(jīng)理入門攻略
- 中文版Revit 2018基礎(chǔ)培訓(xùn)教程(全彩版)
- Spring Cloud微服務(wù)架構(gòu)實戰(zhàn)
- 軟件測試之魂:核心測試設(shè)計精解
- 區(qū)塊鏈:技術(shù)原理與應(yīng)用實踐
- 鳳凰項目:一個IT運維的傳奇故事
- 虛擬現(xiàn)實:科技新浪潮
- 軟件架構(gòu)指標:度量軟件系統(tǒng)的性能和架構(gòu)質(zhì)量
- Apache Cordova移動應(yīng)用開發(fā)實戰(zhàn)
- 火災(zāi)與逃生模擬仿真:PyroSim+Pathfinder中文教程與工程應(yīng)用
- MATLAB函數(shù)速查手冊(修訂版)