官术网_书友最值得收藏!


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)爭并且獨立之后,無論從哪個層面來看,各自“活”得都挺好。

主站蜘蛛池模板: 宣武区| 随州市| 清新县| 环江| 上杭县| 刚察县| 汝南县| 宜春市| 双鸭山市| 交口县| 虞城县| 黎川县| 文成县| 屯留县| 麻城市| 高雄县| 贺州市| 涡阳县| 自贡市| 循化| 鹤壁市| 和硕县| 江安县| 江达县| 宾阳县| 汉阴县| 叙永县| 鄢陵县| 长葛市| 民和| 梅州市| 扎鲁特旗| 乌鲁木齐县| 阳泉市| 历史| 婺源县| 得荣县| 青阳县| 双峰县| 游戏| 白沙|