微服務(wù)把我坑了!
技術(shù)總監(jiān)張大胖在朋友圈看到一篇文章,講的是Netflix的微服務(wù)實踐。
研究了一會兒以后,他不由地拍案叫絕:每個服務(wù)都是一個組件,可以
1. 獨立開發(fā)
2. 獨立部署
3. 獨立伸縮
人家Netflix居然可以在生產(chǎn)環(huán)境隨意地停掉微服務(wù)測試穩(wěn)定性,這真的把張大胖鎮(zhèn)住了!
張大胖上網(wǎng)搜索一番,發(fā)現(xiàn)網(wǎng)上已經(jīng)有很多文章了,很多公司已經(jīng)開始使用微服務(wù)了,輸出了很多最佳實踐,自己還不知道,太落伍了,這絕不能容忍!
他馬上召集部門開會,商量微服務(wù)改造事宜。
技術(shù)狂熱粉小王率先發(fā)言:“現(xiàn)在支持微服務(wù)的有很多框架,比如SpringCloud , Dubbo等, 張總可以選擇一下!”
張大胖找到了支持者,向小王投去了贊許的目光。
愛思考的小李說到:“張總, 我們維護的是一個企業(yè)內(nèi)部系統(tǒng),好像也不太復(fù)雜啊,需要改造成微服務(wù)嗎?”
張大胖反問:“怎么不需要?微服務(wù)是未來業(yè)界的趨勢,不順勢而為就會被時代拋棄。以后你沒做過微服務(wù),出門好意思給別人打招呼嗎?!”
沒人說話了。
張大胖又補充一句:“每個服務(wù)都是獨立的,大家可以用自己喜歡的編程語言去開發(fā)啊!”
這句話太有殺傷力了, 各個開發(fā)人員浮想聯(lián)翩:
小李:“嗯,我要試一下Go”
小王:“我正在學(xué)JavaScript,可以搞下Node.js”
小劉:“趁此機會練習(xí)下Python”
看到大家臉上的表情,張大胖心中暗喜, 他講了一下自己選擇的RPC框架,支持服務(wù)發(fā)現(xiàn),負載均衡、網(wǎng)關(guān)、故障轉(zhuǎn)移等各種功能。
然后他帶著大家把現(xiàn)有系統(tǒng)做了劃分,拆分成12個微服務(wù),它們之間通過REST API調(diào)用。
微服務(wù)改造之路正式開啟!
第一周:
小李:“張總,現(xiàn)在配置個本地環(huán)境可真是麻煩啊,我負責(zé)的服務(wù)依賴其他五個服務(wù),沒法本地運行啊。”
張大胖:“嗯,這我事先倒是沒想到,我看到大家都在用docker,要不我們也把微服務(wù)都形成docker鏡像?這樣每個人都可以在本地運行整個環(huán)境了。”
小李:“這能行嗎?我的機器性能差,這么多微服務(wù)跑不起來吧?”
張大胖:“沒事, 我申請經(jīng)費,每人一臺高性能電腦!”
第二周:
小王:“張總,你看我們每個微服務(wù)對應(yīng)一個自己的數(shù)據(jù)庫,原來的事務(wù)做不了了。”
張大胖大吃一驚,怎么把這一茬給忽略了!他知道分布式事務(wù),兩階段提交,三階段提交, 但是性能差,穩(wěn)定性不好,上網(wǎng)搜鎖了一下,發(fā)現(xiàn)了TCC,但是對業(yè)務(wù)的侵入性強,最后確定用“最終一致性”這么一個寶貝,發(fā)給了小王。
小王看完后說到:“張總,這還得實現(xiàn)重試和冪等性啊,真是麻煩啊。”
張大胖拍拍小王的肩膀:“小伙子,要有開放的心態(tài),這是多么好的學(xué)習(xí)機會啊?”
第三周:
小梁:“張總,這么多微服務(wù),我為了定位一個問題,花了一個上午的時間,一個服務(wù)一個服務(wù)地查找,累死個人啊。”
張大胖很無奈,搜出一個“鏈路跟蹤”的開源解決方案Zipkin,扔給小梁去實施。
看著密密麻麻的配置,小梁覺得很崩潰。
第四周:
小蔡:“張總,這日志文件都分布在不同的機器上,查看起來太麻煩了。”
張大胖找到一個“ELK日志分析”的解決方案,扔給小蔡去實施。
第五周:
小劉:“張總,小梁改了微服務(wù)的接口,增加了一個參數(shù),他沒給其他人說, 我們的微服務(wù)都沒法運行了!”
張大胖說:“小梁怎么能這么做呢?”
小劉:“原來在一個工程中,在編譯階段就能發(fā)現(xiàn)接口的不匹配,現(xiàn)在都是靠文檔約定的接口,發(fā)現(xiàn)問題就晚了。”
張大胖搜出一個“契約測試”,發(fā)到群里:“以后的服務(wù)改動,必須得通過契約測試!”
第六周:
小李:“張總,我們這12個微服務(wù),每個服務(wù)部署3個實例,我昨天熬了一宿,才手工部署完成,必須得自動化了,要不咱們也來一套k8s?”
張大胖拍拍小李的肩膀:“小伙子挺有想法,微服務(wù)可不就得搭配k8s嗎,搞起來!”
經(jīng)過幾個月的996的開發(fā),微服務(wù)改造過的系統(tǒng)隆重上線,各種新技術(shù)在其中閃閃發(fā)亮:服務(wù)發(fā)現(xiàn),負載均衡、網(wǎng)關(guān)、故障轉(zhuǎn)移,最終一致性,鏈路跟蹤,日志分析,契約測試,docker, k8s......
張大胖心滿意足。
CEO把張大胖叫進了辦公室。
CEO:“張大胖,你說搞系統(tǒng)改造,我還給你批了資金,現(xiàn)在系統(tǒng)怎么越來越慢了?”
張大胖:“老板您有所不知,我們的系統(tǒng)現(xiàn)在變成分布式的了,分布式系統(tǒng)要略微慢些。”
CEO:“我就問你,我就想看看這個報表,為什么半天都出不來結(jié)果?”
張大胖:“因為我們現(xiàn)在是微服務(wù)架構(gòu),這涉及到多個服務(wù)調(diào)用!我們實現(xiàn)了網(wǎng)關(guān),負載均衡,故障恢復(fù)等很多高級的功能,不信您看,每個服務(wù)有3個實例,我把任意一個殺掉, 系統(tǒng)就會自動啟動一個新的, 和Netflix一樣..... ”
CEO 怒了:“你瘋了嗎?我們這個是內(nèi)部應(yīng)用,公司一共才幾百人,你瞎搞啥負載均衡,故障轉(zhuǎn)移!”
第二天, 張大胖被開除了。
張大胖離開之前對組員說:“唉,沒辦法,領(lǐng)導(dǎo)們只關(guān)注業(yè)務(wù),不關(guān)注技術(shù)的發(fā)展趨勢,我要走了,大家以后好自為之吧。”
小李嘀咕道:“這技術(shù)不就是為業(yè)務(wù)服務(wù)的嗎?微服務(wù)看起來很美,但是根本不適合我們。”
小王說:“張總,別聽小李瞎說,我們學(xué)會了微服務(wù),簡歷中也有干貨了。”
張大胖心中一亮, 回去趕緊修改簡歷,加上了這么一條:
領(lǐng)導(dǎo)了單體項目向微服務(wù)的遷移,精通微服務(wù)的架構(gòu)設(shè)計,部署,監(jiān)控。
后記:
寫這一篇小品文,是想說明一個道理:不能“手里拿著一個錘子,眼中看到的全是釘子”,微服務(wù)雖好,也有適用的范圍, 有很多項目單體應(yīng)用活得好好的,根本沒有拆分的必要,盲目追風(fēng),反而得不償失。
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請通過作者微信公眾號coderising獲取授權(quán)】