1. 程式人生 > >28、為什麼要把系統拆分成分散式的?為啥要用dubbo?

28、為什麼要把系統拆分成分散式的?為啥要用dubbo?

1、面試題

為什麼要進行系統拆分?如何進行系統拆分?拆分後不用dubbo可以嗎?

2、面試官心裡分析

從這個問題開始就進行分散式系統環節了,好多同學給我反饋說,現在出去分散式成標配了,沒有哪個公司不問問你分散式的事兒。你要是不會分散式的東西,簡直這簡歷沒法看,沒人會讓你去面試。

其實為啥會這樣呢?這就是因為整個大行業技術發展的原因。

早些年,我印象中在2010年初的時候,整個IT行業,很少有人談分散式,更不用說微服務,雖然很多BAT等大型公司,因為系統的複雜性,很早就是分散式架構,大量的服務,只不過微服務大多基於自己搞的一套框架來實現而已。

但是確實,那個年代,大家很重視ssh2,很多中小型公司幾乎大部分都是玩兒struts2、spring、hibernate,稍晚一些,才進入了spring mvc、spring、mybatis的組合。那個時候整個行業的技術水平就是那樣,當年oracle很火,oracle管理員很吃香,oracle效能優化啥的都是IT男的大殺招啊。連大資料都沒人提,當年OCP、OCM等認證培訓機構,火的不行。

但是確實隨著時代的發展,慢慢的,很多公司開始接受分散式系統架構了,這裡面尤為對行業有至關重要影響的,是阿里的dubbo,某種程度上而言,阿里在這裡推動了行業技術的前進。

正是因為有阿里的dubbo,很多中小型公司才可以基於dubbo,來把系統拆分成很多的服務,每個人負責一個服務,大家的程式碼都沒有衝突,服務可以自治,自己選用什麼技術都可以,每次釋出如果就改動一個服務那就上線一個服務好了,不用所有人一起聯調,每次釋出都是幾十萬行程式碼,甚至幾百萬行程式碼了。

直到今日,我很高興的看到分散式系統都成行業面試標配了,任何一個普通的程式設計師都該掌握這個東西,其實這是行業的進步,也是所有IT碼農的技術進步。所以既然分散式都成標配了,那麼面試官當然會問了,因為很多公司現在都是分散式、微服務的架構,那面試官當然得考察考察你了。

3、友情提示

如果有個同學看到這裡說,我天,我不知道啥是分散式系統?我也不知道啥是dubbo?那你趕緊百度啊,搜個dubbo入門,去裡面體驗一下。

什麼是最簡單的分散式系統.png

分散式系統,我用一句話給你解釋一下,就是原來20萬行程式碼的系統,現在拆分成20個小系統,每個小系統1萬行程式碼。原本程式碼之間直接就是基於spring呼叫,現在拆分開來了,20個小系統部署在不同的機器上,得基於dubbo搞一個rpc呼叫,介面與介面之間通過網路通訊來請求和響應。就這個意思。

4、面試題剖析

(1)為什麼要將系統進行拆分?

網上查查,答案極度零散和複雜,很瑣碎,原因一大坨。但是我這裡給大家直觀的感受:

1)要是不拆分,一個大系統幾十萬行程式碼,20個人維護一份程式碼,簡直是悲劇啊。程式碼經常改著改著就衝突了,各種程式碼衝突和合並要處理,非常耗費時間;經常我改動了我的程式碼,你呼叫了我,導致你的程式碼也得重新測試,麻煩的要死;然後每次釋出都是幾十萬行程式碼的系統一起釋出,大家得一起提心吊膽準備上線,幾十萬行程式碼的上線,可能每次上線都要做很多的檢查,很多異常問題的處理,簡直是又麻煩又痛苦;而且如果我現在打算把技術升級到最新的spring版本,還不行,因為這可能導致你的程式碼報錯,我不敢隨意亂改技術。

假設一個系統是20萬行程式碼,其中小A在裡面改了1000行程式碼,但是此時釋出的時候是這個20萬行程式碼的大系統一塊兒釋出。就意味著20萬上程式碼在線上就可能出現各種變化,20個人,每個人都要緊張地等在電腦面前,上線之後,檢查日誌,看自己負責的那一塊兒有沒有什麼問題。

小A就檢查了自己負責的1萬行程式碼對應的功能,確保ok就閃人了;結果不巧的是,小A上線的時候不小心修改了線上機器的某個配置,導致另外小B和小C負責的2萬行程式碼對應的一些功能,出錯了。

幾十個人負責維護一個幾十萬行程式碼的單塊應用,每次上線,準備幾個禮拜,上線 -> 部署 -> 檢查自己負責的功能。

最近從2013年到現在,5年的時間裡,2013年以前,基本上都是BAT的天下;2013年開始,有幾個小巨頭開始快速的發展,上市,幾百億美金,估值都幾百億美金;2015年,出現了除了BAT以外,又有幾個網際網路行業的小巨頭出現。

BAT工作,在市值幾百億美金的小巨頭工作

有某一個小巨頭,現在估值幾百億美金的小巨頭,5年前剛開始搞的時候,核心的業務,幾十個人,維護一個單塊的應用

維護單塊的應用,在從0到1的環節裡,是很合適的,因為那個時候,是系統都沒上線,沒什麼技術挑戰,大家有條不紊的開發。ssh + mysql + tomcat,可能會部署幾臺機器吧。

結果不行了,後來系統上線了,業務快速發展,10萬用戶 -> 100萬用戶 -> 1000萬用戶 -> 上億使用者了。

2)拆分了以後,整個世界清爽了,幾十萬行程式碼的系統,拆分成20個服務,平均每個服務就1~2萬行程式碼,每個服務部署到單獨的機器上。20個工程,20個git程式碼倉庫裡,20個碼農,每個人維護自己的那個服務就可以了,是自己獨立的程式碼,跟別人沒關係。再也沒有程式碼衝突了,爽。每次就測試我自己的程式碼就可以了,爽。每次就釋出我自己的一個小服務就可以了,爽。技術上想怎麼升級就怎麼升級,保持介面不變就可以了,爽。

所以簡單來說,一句話總結,如果是那種程式碼量多達幾十萬行的中大型專案,團隊裡有幾十個人,那麼如果不拆分系統,開發效率極其低下,問題很多。但是拆分系統之後,每個人就負責自己的一小部分就好了,可以隨便玩兒隨便弄。分散式系統拆分之後,可以大幅度提升複雜系統大型團隊的開發效率。

但是同時,也要提醒的一點是,系統拆分成分散式系統之後,大量的分散式系統面臨的問題也是接踵而來,所以後面的問題都是在圍繞分散式系統帶來的複雜技術挑戰在說。

(2)如何進行系統拆分?

這個問題說大可以很大,可以扯到領域驅動模型設計上去,說小了也很小,我不太想給大家太過於學術的說法,因為你也不可能背這個答案,過去了直接說吧。還是說的簡單一點,大家自己到時候知道怎麼回答就行了。

系統拆分分散式系統,拆成多個服務,拆成微服務的架構,拆很多輪的。上來一個架構師第一輪就給拆好了,第一輪;團隊繼續擴大,拆好的某個服務,剛開始是1個人維護1萬行程式碼,後來業務系統越來越複雜,這個服務是10萬行程式碼,5個人;第二輪,1個服務 -> 5個服務,每個服務2萬行程式碼,每人負責一個服務。

如果是多人維護一個服務,<=3個人維護這個服務;最理想的情況下,幾十個人,1個人負責1個或2~3個服務;某個服務工作量變大了,程式碼量越來越多,某個同學,負責一個服務,程式碼量變成了10萬行了,他自己不堪重負,他現在一個人拆開,5個服務,1個人頂著,負責5個人,接著招人,2個人,給那個同學帶著,3個人負責5個服務,其中2個人每個人負責2個服務,1個人負責1個服務。

我個人建議,一個服務的程式碼不要太多,1萬行左右,兩三萬撐死了吧!

大部分的系統,是要進行多輪拆分的,第一次拆分,可能就是將以前的多個模組該拆分開來了,比如說將電商系統拆分成訂單系統、商品系統、採購系統、倉儲系統、使用者系統,等等吧。

但是後面可能每個系統又變得越來越複雜了,比如說採購系統裡面又分成了供應商管理系統、採購單管理系統,訂單系統又拆分成了購物車系統、價格系統、訂單管理系統。

扯深了實在很深,所以這裡先給大家舉個例子,你自己感受一下,核心意思就是根據情況,先拆分一輪,後面如果系統更復雜了,可以繼續分拆。你根據自己負責系統的例子,來考慮一下就好了。

(3)拆分後不用dubbo可以嗎?

當然可以了,大不了最次,就是各個系統之間,直接基於spring mvc,就純http介面互相通訊唄,還能咋樣。但是這個肯定是有問題的,因為http介面通訊維護起來成本很高,你要考慮超時重試、負載均衡等等各種亂七八糟的問題,比如說你的訂單系統呼叫商品系統,商品系統部署了5臺機器,你怎麼把請求均勻地甩給那5臺機器?這不就是負載均衡?你要是都自己搞那是可以的,但是確實很痛苦。

所以dubbo說白了,是一種rpc框架,就是本地就是進行介面呼叫,但是dubbo會代理這個呼叫請求,跟遠端機器網路通訊,給你處理掉負載均衡了、服務例項上下線自動感知了、超時重試了,等等亂七八糟的問題。那你就不用自己做了,用dubbo就可以了。

文集:https://www.jianshu.com/nb/32293473