從單體應用走向服務化

来源:https://www.cnblogs.com/wupeixuan/archive/2019/10/11/11657549.html
-Advertisement-
Play Games

之前講解了什麼是微服務:微服務的核心在於服務治理,微服務架構是將複雜臃腫的單體應用進行細粒度的服務化拆分,每個拆分出來的服務各自獨立打包部署,並交由小團隊進行開發和運維,從而極大地提高了應用交付的效率。 什麼時候進行服務化拆分?拆分單體應用有哪些標準呢? 什麼時候進行服務化拆分? 比如做社交 App ...


之前講解了什麼是微服務:微服務的核心在於服務治理,微服務架構是將複雜臃腫的單體應用進行細粒度的服務化拆分,每個拆分出來的服務各自獨立打包部署,並交由小團隊進行開發和運維,從而極大地提高了應用交付的效率。

什麼時候進行服務化拆分?拆分單體應用有哪些標準呢?

什麼時候進行服務化拆分?

比如做社交 App,初期為了快速上線,驗證可行性,可以只開發首頁信息流、評論等基本功能。產品上線後,經過一段時間的運營,用戶開始逐步增多,可行性驗證通過,下一階段就需要進一步增加更多的新特性來吸引更多的目標用戶,比如再給這個社交 App 添加個人主頁顯示、消息通知等功能。

這個時候就需要大規模地擴張開發人員,以支撐多個功能的開發。如果這個時候繼續採用單體應用架構,多個功能模塊混雜在一起開發、測試和部署的話,就會導致不同功能之間相互影響,一次打包部署需要所有的功能都測試 OK 才能上線。而且,多個功能模塊混部在一起,對線上服務的穩定性也是個巨大的挑戰。

再例舉一個 58 到家的例子,隨著業務越來越複雜,數據量越來越大,併發量越來越大,15 年的時候,58 到家的架構碰到了種種問題:

  • 垂直業務擴展,家政、麗人、速運、平臺,一些相似的業務代碼拷貝越來越嚴重
  • 數據量、併發量提升,底層架構複雜性不斷向上游擴散,所有調用方都需要關註緩存、分庫、存儲引擎等,效率逐步降低
  • jar 包耦合,多個系統依賴一個公用的 jar 包,一個業務升級導致相容性問題,影響其他業務
  • 資料庫耦合,多個業務公用一個資料庫,相互耦合,相互影響
  • SQL 質量低,業務相互耦合,一個業務編寫了一個低質量的 SQL,導致其他業務受影響

這個時候 58 到家開始進行服務化拆分,找到通用痛點,抽象出通用數據訪問與子業務,然後將它們下沉成微服務。

一般來說,一旦單體應用同時進行開發的人員超過 10 人,就會遇到上面的問題,這個時候就該考慮進行服務化拆分了。

服務化拆分的兩種姿勢

那麼服務化拆分具體該如何實施呢?一個最有效的手段就是將不同的功能模塊服務化,獨立部署和運維。以前面提到的社交 App 為例,可以認為首頁信息流是一個服務,評論是一個服務,消息通知是一個服務,個人主頁也是一個服務。

這種服務化拆分方式是縱向拆分,是從業務維度進行拆分。標準是按照業務的關聯程度來決定,關聯比較密切的業務適合拆分為一個微服務,而功能相對比較獨立的業務適合單獨拆分為一個微服務。

還有一種服務化拆分方式是橫向拆分,是從公共且獨立功能維度拆分。標準是按照是否有公共的被多個其他服務調用,且依賴的資源獨立不與其他業務耦合。

以前面的社交 App 為例,無論是首頁信息流、評論、消息箱還是個人主頁,都需要顯示用戶的昵稱。如果把用戶的昵稱功能單獨部署成一個獨立的服務,那麼有什麼變更我只需要上線這個服務即可,其他服務不受影響,開發和上線成本就大大降低了。

服務化拆分的前置條件

一般情況下,業務系統引入新技術就必然會帶來架構的複雜度提升,在具體決策前,先要認識到新架構會帶來哪些新的問題,這些問題你和你的團隊是否能夠解決?如何解決?是自己投入人力建設,還是採用業界開源方案?

下麵幾個問題,是從單體應用遷移到微服務架構時必將面臨也必須解決的。

  • 服務如何定義:對於單體應用來說,不同功能模塊之前相互交互時,通常是以類庫的方式來提供各個模塊的功能。對於微服務來說,每個服務都運行在各自的進程之中,通過介面向外界傳達信息。無論採用哪種通訊協議,是 HTTP 還是 RPC,服務之間的調用都通過介面描述來約定,約定內容包括介面名、介面參數以及介面返回值。

  • 服務如何發佈和訂閱:單體應用由於部署在同一個 WAR 包里,介面之間的調用屬於進程內的調用。而拆分為微服務獨立部署後,就需要一個能夠記錄每個服務提供者的地址以供服務調用者查詢,也就是註冊中心(如 Zookeeper、Eureka、Consul 等)。

  • 服務如何監控:對於一個服務,需要一種通用的監控方案,能夠覆蓋業務埋點、數據收集、數據處理,最後到數據展示的全鏈路功能。

  • 服務如何治理:拆分為微服務後,服務的數量變多,依賴關係變複雜。比如一個服務的性能有問題時,依賴的服務也會受影響。可以設定一個調用性能閾值,如果一段時間內一直超過閾值,那麼依賴服務的調用可以直接返回,也就是熔斷。

  • 故障如何定位:拆分為微服務後,一次用戶調用可能依賴多個服務,每個服務又部署在不同的節點上,如果用戶調用出現問題,需要一種解決方案能夠將一次用戶請求進行標記,併在多個依賴的服務系統中繼續傳遞,以便串聯所有路徑,從而進行故障定位。

針對上述問題,必須有可行的解決方案之後,才能進行服務化拆分。

總結

無論是縱向拆分還是橫向拆分,都是將單體應用龐雜的功能進行拆分,抽離成單獨的服務部署。

但並不是功能拆分的越細越好,過度的拆分反而會讓服務數量膨脹變得難以管理,因此找到符合自己業務現狀和團隊人員技術水平的拆分粒度才是可取的。

參考

https://time.geekbang.org/column/article/13891

https://www.infoq.cn/article/2017/09/Do-your-service-first


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介 1. Sass 和 Scss Sass 和 Scss 其實是同一種東西,我們平時都稱之為 Sass;Scss 是 Sass 3 引入新的語法,其語法完全相容 CSS3,並且繼承了 Sass 的強大功能。也就是說,任何標準的 CSS3 樣式表都是具有相同語義的有效的 Scss文件。 兩者之間不同 ...
  • 1、null 對於null有一個歷史存留的 bug,null是對象類型嗎?雖然我們使用 typeof 檢測null是對象類型,這其實是一個 bug。 1.1 原因是什麼 因為 JS 最初的版本是 32 位系統的,為了將性能將用低位存儲變數類型信息,000 開頭表示代表的是對象,此時null表示全零, ...
  • 1. The Coolest Calendar 界面非常漂亮的一款日期選擇插件,有詳細的使用文檔,最新版本 1.5。 點擊下載 查看示例 2. DatePicker 這款日期插件支持單選、多選和時間區間選擇,功能齊全,有 Dialog 和 Flat 兩種模式。 點擊下載 查看示例 3. Tigra ...
  • 常見的有 、`強制瀏覽器全屏 IOS的Web APP模式 可點擊元素出現陰影` 本文主要講一些其他的或者實用的優化手段。 1. 彈出數字鍵盤 跟`IOS pattern input`的類型了。 2. 調用系統的某些功能 3. 打開原生應用 這種方式叫做 ,是一種協議,一般用來訪問 或者 中的某個功能 ...
  • 開發前準備 vue.js2.0中文,項目所使用的js框架 vue-router,vue.js配套路由 vuex,狀態管理 Element,UI框架 1,根據官方指引,構建項目框架 2,使用webpack+ sass 來寫css less是一門css預處理語言,它是拓展了css,增加了變數,Mixin ...
  • 解決Idea、WebStorm下使用Vue cli腳手架項目無法使用Webpack別名的問題 ...
  • 為什麼要用css動畫替換js動畫 導致JavaScript效率低的兩大原因:操作DOM和使用頁面動畫。 用CSS3動畫替代JS模擬動畫的好處: 不占用JS主線程; 可以利用硬體加速; 瀏覽器可對動畫做優化(元素不可見時不動畫減少對FPS影響) CSS3動畫提供了2D和3D以及常規動畫屬性介面,它可以 ...
  • 1、安裝、構建 2、項目目錄 3、antd 修改 src/App.css,在文件頂部引入 antd/dist/antd.css。 antd 目前的預設文案是英文,如果需要使用其他語言,可以參考下麵的方案。 antd 提供了一個 React 組件 ConfigProvider 用於全局配置國際化文案。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...