從單體應用走向服務化

image.png
上一期,我給你講述了什麼是微服務,以及微服務架構的由來。簡單回顧一下,微服務就是將龐雜臃腫的單體應用拆分成細粒度的服務,獨立部署,並交給各個中小團隊來負責開發、測試、上線和運維整個生命週期。
那麼到底什麼時候應該拆分單體應用?拆分單體應用有哪些標準可依呢?
為了解答這兩個問題,今天我將通過具體案例來闡述,希望你能夠學會單體應用拆分成微服務的正確姿勢。
什麼時候進行服務化拆分?
從我所經歷過的多個專案來看,專案第一階段的主要目標是快速開發和驗證想法,證明產品思路是否可行。這個階段功能設計一般不會太複雜,開發採取快速迭代的方式,架構也不適合過度設計。所以將所有功能打包部署在一起,集中地進行開發、測試和運維,對於專案起步階段,是最高效也是最節省成本的方式。當可行性驗證通過,功能進一步迭代,就可以加入越來越多的新特性。
比如做一個社交 App,初期為了快速上線,驗證可行性,可以只開發首頁資訊流、評論等基本功能。產品上線後,經過一段時間的運營,使用者開始逐步增多,可行性驗證通過,下一階段就需要進一步增加更多的新特性來吸引更多的目標使用者,比如再給這個社交 App 添加個人主頁顯示、訊息通知等功能。
一般情況下,這個時候就需要大規模地擴張開發人員,以支撐多個功能的開發。如果這個時候繼續採用單體應用架構,多個功能模組混雜在一起開發、測試和部署的話,就會導致不同功能之間相互影響,一次打包部署需要所有的功能都測試 OK 才能上線。
不僅如此,多個功能模組混部在一起,對線上服務的穩定性也是個巨大的挑戰。比如 A 開發的一個功能由於程式碼編寫考慮不夠全面,上線後產生了記憶體洩漏,執行一段時間後進程異常退出,那麼部署在這個服務池中的所有功能都不可訪問。一個經典的案例就是,曾經有一個視訊 App,因為短時間內某個付費視訊訪問量巨大,超過了伺服器的承載能力,造成了這個視訊無法訪問。不幸的是,這個網站付費視訊和免費視訊的服務部署在一起,也波及了免費視訊,幾乎全站崩潰。
根據我的實際專案經驗,一旦單體應用同時進行開發的人員超過 10 人,就會遇到上面的問題,這個時候就該考慮進行服務化拆分了。
服務化拆分的兩種姿勢
那麼服務化拆分具體該如何實施呢?一個最有效的手段就是將不同的功能模組服務化,獨立部署和運維。以前面提到的社交 App 為例,你可以認為首頁資訊流是一個服務,評論是一個服務,訊息通知是一個服務,個人主頁也是一個服務。
這種服務化拆分方式是縱向拆分,是從業務維度進行拆分。標準是按照業務的關聯程度來決定,關聯比較密切的業務適合拆分為一個微服務,而功能相對比較獨立的業務適合單獨拆分為一個微服務。
還有一種服務化拆分方式是橫向拆分,是從公共且獨立功能維度拆分。標準是按照是否有公共的被多個其他服務呼叫,且依賴的資源獨立不與其他業務耦合。
繼續以前面提到的社交 App 舉例,無論是首頁資訊流、評論、訊息箱還是個人主頁,都需要顯示使用者的暱稱。假如使用者的暱稱功能有產品需求的變更,你需要上線幾乎所有的服務,這個成本就有點高了。顯而易見,如果我把使用者的暱稱功能單獨部署成一個獨立的服務,那麼有什麼變更我只需要上線這個服務即可,其他服務不受影響,開發和上線成本就大大降低了。
服務化拆分的前置條件
一般情況下,業務系統引入新技術就必然會帶來架構的複雜度提升,在具體決策前,你先要認識到新架構會帶來哪些新的問題,這些問題你和你的團隊是否能夠解決?如何解決?是自己投入人力建設,還是採用業界開源方案?
下面幾個問題,是從單體應用遷移到微服務架構時必將面臨也必須解決的。
針對上述問題,你必須有可行的解決方案之後,才能進一步進行服務化拆分。專欄後面的文章,我會給你逐一講解相應的解決方案。
總結
無論是縱向拆分還是橫向拆分,都是將單體應用龐雜的功能進行拆分,抽離成單獨的服務部署。
但並不是說功能拆分的越細越好,過度的拆分反而會讓服務數量膨脹變得難以管理,因此找到符合自己業務現狀和團隊人員技術水平的拆分粒度才是可取的。我建議的標準是按照每個開發人員負責不超過 3 個大的服務為標準,畢竟每個人的精力是有限的,所以在拆分微服務時,可以按照開發人員的總人數來決定。
思考題
想想你現在的業務場景,如果是單體應用的話,是否需要進行服務化拆分?如果需要的話,你覺得縱向拆分還是橫向拆分合適?具體可以拆分到什麼粒度?
歡迎你在留言區寫下自己的思考,與我一起討論。
想要獲取關於更多微服務的資訊
-----點選上方關注持續收聽乾貨
或私信 “888”索要微服務學習資料

image