使用微服務(wù)往往是有代價的,而這種代價往往會被低估。
原文鏈接:https://code-held.com/2022/07/28/microservices/
(資料圖片)
作者 | Marcus Held
譯者 | 彎月 責(zé)編 | 屠敏
出品 | CSDN(ID:CSDNnews)
在過去的幾年里,我曾圍繞微服務(wù)這個話題采訪過數(shù)百個人,很多人都自豪地講述了他們使用微服務(wù)架構(gòu)開發(fā)項目的故事。然而,無需太多提問就可以看出他們發(fā)射了一枚大火箭,最后卻只是干掉了一只老鼠。
微服務(wù)很難。每個接觸過這類架構(gòu)的人都有著痛苦的經(jīng)歷。終有一天,你會被復(fù)雜性淹沒,而且你不得不對架構(gòu)進(jìn)行多次重構(gòu)。我很納悶,為什么這種架構(gòu)對開發(fā)人員如此有吸引力?然后,我想起十年前自己也被這種框架所吸引。
大多人的共同經(jīng)歷是,他們不得不面對一個遺留下來的單體系統(tǒng),而且整個代碼庫都是一團(tuán)糟。遇到這種情況很令人沮喪。實現(xiàn)需要很長時間,編寫測試很乏味甚至幾乎不可能,理解代碼也很困難,bug 堆積如山,部署也不可靠,每次代碼變更都會引發(fā)問題。重構(gòu)遺留代碼似乎是不可能的,而且一想到這個問題就會讓你覺得頭疼,甚至徹夜難眠。
這個時候,微服務(wù)就會變得非常具有吸引力。那一刻,小型、可管理、分離的代碼庫會帶給你極大的安全感和解脫感。
但是,使用微服務(wù)也是有代價的,而且往往容易被低估。
弊端1:無法正確切分領(lǐng)域
只有當(dāng)你能夠正確切分領(lǐng)域時,使用微服務(wù)才有效。然而,領(lǐng)域的劃分非常艱難。你需要知道自己構(gòu)建的是什么,但往往大多數(shù)時候我們并不是特別清楚。完全綁定到一個領(lǐng)域,會導(dǎo)致系統(tǒng)的靈活性降低,而這恰恰與你實際的期望背道而馳。
在切分領(lǐng)域時,有可能你還不清楚產(chǎn)品需求。將來難免會出現(xiàn)一個功能,迫使兩個服務(wù)糾纏在一起,這就導(dǎo)致它們屬于同一個領(lǐng)域,卻還是分布式的。
弊端2:復(fù)雜性
雖然剛開始的時候,微服務(wù)的架構(gòu)看起來非常簡單。架構(gòu)師非常確定這種架構(gòu)不會被打破,而且對于團(tuán)隊來說,只需要維護(hù)一個小型代碼庫,感覺很舒服。然而到了部署服務(wù)時,情況就會發(fā)生變化。你需要協(xié)調(diào)一切。儀表板、監(jiān)控系統(tǒng)、日志聚合器、部署、CI 作業(yè)、警報、文檔……而且你引入這些服務(wù)只是因為你的架構(gòu)有這種需求。你需要分布式隊列、共享緩存、共享數(shù)據(jù)庫、服務(wù)發(fā)現(xiàn)、多個負(fù)載均衡器、動態(tài)路由器、API 網(wǎng)關(guān)、中央配置服務(wù)器……
于是,代碼泥沼變成了基礎(chǔ)設(shè)施泥沼。優(yōu)步這樣的大公司經(jīng)歷過慘痛的教訓(xùn)后,終于意識到了這一點:
弊端3:過早優(yōu)化
幾十年來,我們將軟件分割成了各種服務(wù),只不過我們沒有稱它們?yōu)椤拔⒎?wù)”。我們拆分應(yīng)用程序主要有兩個原因。
首先,這種拆分對組織來說有意義。
很明顯,我們應(yīng)該建立兩個獨立的團(tuán)隊分別負(fù)責(zé)客戶關(guān)系管理工具和電子商務(wù)平臺,盡管這兩個平臺有時候需要相互交流。這已經(jīng)是一個面向服務(wù)的架構(gòu)。為了實現(xiàn)銷售產(chǎn)品的單一業(yè)務(wù)目標(biāo),我們需要兩項服務(wù)。只不過我們從未稱其為微服務(wù)架構(gòu)。
其次,為了性能。
根據(jù)我的經(jīng)驗,受這個原因影響的軟件只有1%。如果只有幾百個用戶,使用垂直擴(kuò)展就可以了。我們開發(fā)的系統(tǒng)有數(shù)以萬計的并發(fā)用戶,這些用戶與系統(tǒng)進(jìn)行了大量交互,但我們?nèi)匀荒軌虼怪睌U(kuò)展。
我們想要什么?
我們發(fā)現(xiàn)了一個問題:遺留系統(tǒng)這個巨大的泥潭。可惜微服務(wù)架構(gòu)并不是解決這個問題的正確方法。你需要的是模塊,正確的模塊,因為模塊使得我們很難越界,而且可以根據(jù)需要輕松、獨立地部署模塊。這個概念本身并不新穎,但很多人往往無法正確實施。
十年前,我想要模塊,卻采納了微服務(wù)架構(gòu),現(xiàn)在是時候結(jié)束這種過度設(shè)計了。
《2022-2023 中國開發(fā)者大調(diào)查》重磅啟動,歡迎掃描下方二維碼,參與問卷調(diào)研,更有 iPad 等精美大禮等你拿!
? 兩萬字長文,史上最全 C++ 年度總結(jié)!
? 在 MacOS 上運行 Docker 太慢!
? 為了忘卻的紀(jì)念——2022 Linux 內(nèi)核十大技術(shù)革新功能 | 年終盤點
責(zé)任編輯:Rex_19