15.【.NET 8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--如何拆分單體

單體應用(Monolithic Application)是指將所有功能模塊集中在一個代碼庫中構建的應用程序。它通常是一個完整的、不可分割的整體,所有模塊共享相同的運行環境和數據庫。這種架構開發初期較為簡單,部署也較為方便,但隨著應用規模的增大,模塊間的高度耦合會導致維護困難、擴展性差等問題。

微服務(Microservices)是一種將應用程序拆分為多個獨立服務的架構設計,每個服務專注于完成特定的功能,如用戶管理、訂單處理或支付等。微服務是松耦合的,每個服務可以獨立開發、部署和擴展,并通過輕量級協議(如REST或消息隊列)與其他服務通信。它強調單一職責原則,允許團隊按需為每個服務選擇最佳的技術棧。

將單體應用拆分為微服務的主要原因在于靈活性和效率的提升。微服務架構允許獨立擴展某些高負載模塊,而無需擴展整個系統,從而提高資源利用率。團隊開發效率也得到提高,因為不同的團隊可以并行開發不同的服務。系統的可靠性也更高,即使某個服務發生故障,也不會影響整個系統的運行。此外,微服務還便于技術更新,每個服務可獨立演進,減少技術債。然而,拆分過程需要權衡復雜性,確保轉換的收益大于成本。

一、拆分前的準備工作

在將單體應用拆分為微服務之前,必須對現有的單體架構有一個全面的理解,并明確拆分的優先級。這是整個微服務遷移過程的基礎,決定了后續拆分的方向和效率。如果沒有充分的準備,可能會導致系統無法正常運行或者拆分效果不佳。因此,準備工作主要包括兩個方面:理解現有單體架構和確定拆分優先級。

1.1 理解現有單體架構

要成功將單體應用拆分為微服務,首先需要對現有的單體架構進行全面而詳細的分析。這不僅包括對業務功能的梳理,還需要深入了解模塊之間的依賴關系以及當前系統的性能瓶頸和維護難點。

  1. 梳理業務功能模塊
    梳理業務功能模塊是理解單體架構的第一步。可以通過以下幾種方式進行:

    • 功能清單:列出當前單體應用中所有的功能模塊,例如用戶管理、訂單處理、支付系統、庫存管理等。將功能模塊按照業務邏輯進行分類,形成一個清晰的功能層次結構。
    • 流程分析:繪制系統的業務流程圖,明確每個功能模塊在各個流程中的職責和作用。例如,用戶下單需要依賴用戶模塊、訂單模塊和支付模塊,理解這些流程有助于后續劃分微服務的邊界。
    • 代碼分析:通過代碼閱讀工具或代碼分析工具(如SonarQube)來挖掘模塊之間的耦合度,找到哪些模塊獨立性較高,哪些模塊與其他模塊強依賴。

    通過梳理業務功能模塊,可以清楚地了解系統的核心功能以及支持功能,為后續的模塊拆分打下基礎。

  2. 分析模塊間的依賴關系
    模塊之間的依賴關系是單體架構的核心特點之一,深刻理解這些依賴關系可以幫助我們找到拆分的關鍵點。一個常見的問題是模塊之間的強耦合,這會導致拆分難度增加。因此,以下幾個方面需要重點關注:

    • 數據依賴:哪些模塊共享了同一數據庫表?例如,用戶模塊和訂單模塊可能都會訪問用戶表,這種數據共享會在拆分時產生挑戰。
    • 功能調用:哪些模塊需要頻繁調用其他模塊的功能?例如,訂單模塊可能頻繁調用庫存模塊檢查庫存,這種強調用關系可能需要通過API重新設計。
    • 耦合點分析:通過代碼分析工具,統計模塊之間的調用次數和調用方向,找到耦合點最多的模塊。

    在分析依賴關系時,建議繪制模塊依賴圖,直觀地展示模塊之間的相互關系。這對于后續選擇拆分優先級以及設計微服務通信是非常重要的。

  3. 識別性能瓶頸與維護難點
    單體應用的性能瓶頸和維護難點通常是推動微服務化的主要動因。通過以下手段可以識別這些問題:

    • 性能監控:通過性能監控工具(如Prometheus、New Relic),分析系統中高負載的模塊。例如,某些模塊的響應時間過長或某些數據庫查詢頻率過高。
    • 錯誤日志分析:檢查系統的錯誤日志,找到故障率較高的模塊。這些模塊在微服務化時需要特別關注。
    • 維護歷史記錄:通過版本管理工具(如Git),查看哪些模塊的代碼更改頻繁。更改頻繁的模塊可能存在設計缺陷或者業務邏輯復雜,適合優先拆分。

    通過對性能瓶頸和維護難點的識別,可以明確微服務化后需要重點優化的部分,確保拆分能夠帶來實際的效益。

1.2 確定拆分優先級

在充分理解單體架構后,需要根據業務需求和技術需求確定拆分的優先級。這一步的核心是選擇合適的模塊作為起點,逐步推進微服務化的過程。

  1. 基于業務領域劃分
    業務領域是劃分微服務的基礎,一個合理的劃分可以讓微服務更貼近實際的業務需求。基于業務領域劃分時,需要遵循以下原則:

    • 領域驅動設計(DDD):通過領域驅動設計的方法,識別出核心領域、支撐領域和通用領域,確保每個微服務都能獨立完成其業務功能。
    • 核心業務優先:優先拆分核心業務模塊,例如訂單處理模塊或支付模塊。這些模塊通常是業務的核心驅動力,也是性能優化的重點。
    • 邊界清晰:確保每個業務領域的邊界清晰,避免功能重疊。例如,用戶模塊只應負責用戶相關的功能,而不要涉及訂單邏輯。

    通過業務領域劃分,可以確保微服務的職責單一,降低后續開發和維護的復雜性。

  2. 基于技術需求選擇
    除了業務領域外,還需要考慮技術上的需求。例如,一些模塊由于性能壓力大或者技術棧落后,可能需要優先拆分:

    • 高并發模塊:如支付模塊或搜索模塊,這些模塊通常需要獨立擴展以應對高并發請求。
    • 技術棧更新:某些模塊可能使用了過時的技術棧,維護成本高且難以擴展。將這些模塊拆分為微服務后,可以選擇更現代的技術棧重新實現。
    • 獨立性較高的模塊:例如日志記錄模塊或文件上傳模塊,這些模塊通常與其他模塊的依賴較少,適合作為拆分的起點。

    通過技術需求的分析,可以優先拆分那些能夠快速帶來收益的模塊,為后續的拆分積累經驗。

二、微服務架構設計

微服務架構的設計是實現單體應用拆分的核心步驟,它直接決定了后續微服務的開發、部署和運維的效率與質量。在設計微服務架構時,需要明確微服務的邊界、數據獨立性、通信機制以及安全性,確保系統的可擴展性和可靠性。

2.1 定義微服務邊界
  1. 按業務領域劃分
    微服務的邊界應與業務領域高度契合,這樣可以使每個微服務聚焦于特定的業務功能。例如,電商系統可以劃分為用戶服務、訂單服務、支付服務、商品服務等,每個服務負責一類業務邏輯。使用領域驅動設計(DDD)的方法,可以幫助識別核心領域和支撐領域,從而定義清晰的服務邊界。

  2. 遵循單一職責原則
    微服務的設計應遵循單一職責原則(SRP),即每個服務只關注一個特定的功能領域,避免職責混亂。例如,訂單服務只負責訂單的創建、查詢和管理,而不應該包含任何與用戶認證或庫存管理相關的邏輯。單一職責不僅有助于服務的獨立開發和維護,還可以降低服務間的耦合度。

2.2 數據獨立性
  1. 數據庫拆分策略
    在微服務架構中,每個服務應擁有獨立的數據庫,避免多個服務直接共享數據庫。常見的拆分策略包括:

    • 按業務領域拆分:每個服務擁有與其業務領域相關的數據。例如,用戶服務使用用戶數據庫,訂單服務使用訂單數據庫。
    • 按數據存儲類型拆分:不同的服務可以選擇最適合其業務場景的數據庫類型,例如關系型數據庫(MySQL)或文檔型數據庫(MongoDB)。
  2. 數據同步與一致性處理
    微服務之間的數據交互可能會導致數據不一致的問題,需要設計合適的同步與一致性機制:

    • 事件驅動架構:通過消息隊列(如Kafka或RabbitMQ)實現服務間的異步通信,確保數據的最終一致性。
    • 分布式事務:在必須保證強一致性的場景中,可以使用分布式事務管理器(如Saga模式或TCC模式)來協調多個服務的操作。
2.3 服務通信機制
  1. RESTful API、gRPC、消息隊列等通信方式
    微服務之間的通信方式需要根據具體需求選擇:

    • RESTful API:適用于簡單的HTTP通信,易于實現和調試。
    • gRPC:適用于高性能場景,支持多語言和二進制通信。
    • 消息隊列:適用于需要解耦的異步通信場景,例如使用RabbitMQ或Kafka處理事件通知。
  2. 服務發現與負載均衡設計
    微服務架構需要支持動態擴展和服務發現:

    • 服務注冊與發現:使用工具(如Eureka、Consul、Zookeeper)實現服務的自動注冊和發現。
    • 負載均衡:通過反向代理(如Nginx)或服務網格(如Istio)實現流量分發,提升系統性能和可靠性。
2.4 安全性與認證
  1. OAuth2、JWT 等認證機制
    微服務之間的通信和用戶訪問需要確保安全性:
    • OAuth2:適用于統一的用戶認證,提供授權碼模式、客戶端模式等多種認證方式。
    • JWT(JSON Web Token):通過簽名的方式驗證請求的合法性,適合服務間的輕量級認證。
    • 加密通信:使用TLS/SSL加密服務間的通信,避免數據被竊聽或篡改。

通過以上架構設計,微服務能夠在保證獨立性、性能和安全性的前提下,實現系統的高可用性和擴展性。這些設計原則和方法為后續的開發和部署提供了清晰的指導方向。

三、拆分與遷移步驟

拆分與遷移是從單體應用過渡到微服務架構的關鍵階段。在這一階段,需要選擇合適的模塊作為切入點,逐步拆分并遷移到微服務架構,同時通過重構和測試,保證系統的穩定性和功能的完整性。

3.1 選擇模塊并逐步拆分
  1. 從低風險模塊開始
    在拆分初期,優先選擇低風險模塊進行微服務化,例如日志記錄服務、身份認證服務或文件上傳服務。這些模塊通常與核心業務邏輯耦合較低,其功能相對獨立,拆分和遷移對整體系統的影響較小。
    低風險模塊的拆分可以幫助團隊快速積累經驗,驗證微服務架構的技術選型和設計模式,為后續高復雜度模塊的拆分奠定基礎。

  2. 使用 API 替代原有的內部調用
    拆分模塊后,原本在單體應用中通過方法調用實現的功能需要改為通過 API 調用來交互。可以采用以下步驟:

    • 定義清晰的接口:為每個微服務設計統一的 API 接口,明確輸入輸出數據格式和通信協議。
    • 逐步替換調用:在重構過程中,將原有的內部方法調用替換為微服務 API 調用,確保功能一致。
    • 接口文檔與測試:編寫詳細的 API 文檔,并使用 Postman、Swagger 等工具測試接口的可靠性。

    通過這種逐步替換的方式,可以在不影響現有系統運行的前提下完成模塊的拆分。

3.2 重構與驗證
  1. 單元測試與集成測試
    在拆分過程中,測試是保障系統功能穩定的核心手段:

    • 單元測試:為每個拆分后的微服務編寫詳細的單元測試,驗證其獨立功能的正確性。
    • 集成測試:在多個微服務間進行交互測試,確保服務間的通信正常,數據流轉無誤。
    • 模擬環境測試:在測試環境下模擬生產環境的服務調用場景,驗證微服務的負載能力和容錯機制。
  2. 保證新舊模塊共存的同時平穩過渡
    為了避免業務中斷,可以采用“藍綠部署”或“分階段遷移”的方式,保證新舊模塊在一段時間內共存:

    • 在拆分初期,新微服務上線后,仍保留單體應用中相應的模塊,確保系統在功能上的延續性。
    • 通過流量分流工具(如 Nginx、API 網關)部分引導流量到新微服務進行驗證,觀察其性能和穩定性。
    • 當新微服務經過充分驗證后,逐步完全切換流量并移除舊模塊,實現系統的平穩過渡。

    通過選擇合適的拆分模塊、替換調用方式以及全面的測試和驗證,單體應用可以逐步拆分為微服務架構,同時保證系統在拆分和遷移過程中的穩定性和可靠性。

四、總結

單體應用是將所有功能模塊集中在一個代碼庫中的整體軟件架構,開發和部署較為簡單,但隨著系統復雜度的增加,模塊間的耦合度過高會導致維護困難、擴展性差等問題。相比之下,微服務架構將應用拆分為多個獨立的服務,每個服務聚焦于特定功能,具備獨立開發、部署和擴展的能力。這種架構通過輕量級通信協議(如REST或消息隊列)實現服務間的協作,強調單一職責原則,并允許團隊為每個服務選擇最合適的技術棧。

從單體應用遷移到微服務架構,需要全面理解現有單體系統,包括梳理業務功能模塊、分析模塊依賴關系以及識別系統的性能瓶頸與維護難點。基于業務領域和技術需求劃分微服務邊界,每個服務獨立擁有數據庫,通過事件驅動或分布式事務等機制保障數據一致性。同時,微服務通過API、消息隊列等方式實現通信,借助OAuth2、JWT等機制實現安全認證。

遷移過程中,優先拆分低風險模塊,通過替換原有內部調用為API調用逐步完成拆分。在拆分后,通過單元測試和集成測試確保功能穩定性,并采取藍綠部署等策略保證新舊系統的平穩過渡。最終,微服務架構能夠顯著提高系統的靈活性、可靠性及擴展性,但需要平衡復雜性與收益。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901588.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901588.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901588.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在ARM架構Mac上部署Python 3.12與Conda環境的全鏈路指南!!!

在ARM架構Mac上部署Python 3.12與Conda環境的全鏈路指南 🚀 (M1/M2芯片實測|含性能調優避坑手冊) 🌟 核心價值點 ? 原生ARM支持:突破Rosetta轉譯的性能損耗 ? 環境隔離:Conda虛擬環境管理多…

yml文件上傳并映射到實體類

文章目錄 功能背景功能需要前端開發組件選用組件嵌套和參數綁定上傳邏輯示例 后端開發接收邏輯解析邏輯省流純手動實現(不建議) 功能背景 開發一個配置文件解析功能,需要兼容老版本的配置文件。 功能需要 前端:兩個配置文件分別…

ElasticSearch中常用的數據類型

一、映射 Elasticsearch中通過映射來指定字段的數據類型,映射方式有2種,靜態映射和動態映射。 1.動態映射 使用動態映射時,無須指定字段的數據類型,Elasticshearch會自動根據字段內容來判斷映射到哪個數據類型。 比如&#xff…

【神經網絡結構的組成】深入理解 轉置卷積與轉置卷積核

🌈 個人主頁:十二月的貓-CSDN博客 🔥 系列專欄: 🏀《深度學習理論直覺三十講》_十二月的貓的博客-CSDN博客 💪🏻 十二月的寒冬阻擋不了春天的腳步,十二點的黑夜遮蔽不住黎明的曙光 …

CSS高度坍塌?如何解決?

一、什么是高度坍塌? 高度坍塌(Collapsing Margins)是指當父元素沒有設置邊框(border)、內邊距(padding)、內容(content)或清除浮動時,其子元素的 margin 會…

Web前端開發——格式化文本與段落(上)

一、學習目標 網頁內容的排版包括文本格式化、段落格式化和整個頁面的格式化,這是設計個網頁的基礎。文本格式化標記分為字體標記、文字修飾標記。字體標記和文字修飾標記包括對于字體樣式的一些特殊修改。段落格式化標記分為段落標記、換行記、水平分隔線標記等。…

關于PHP開源CMS系統ModStart的詳細介紹及使用指南

關于PHP開源CMS系統ModStart的詳細介紹及使用指南: 🔍 ModStart是什么? 基于Laravel框架開發的模塊化CMS系統采用Apache 2.0 開源協議,完全免費可商用特別適合需要快速搭建企業級網站/管理系統的開發者 🚀 核心優勢…

TCP標志位抓包

說明 TCP協議的Header信息,URG、ACK、PSH、RST、SYN、FIN這6個字段在14字節的位置,對應的是tcp[13],因為字節數是從[0]開始數的,14字節對應的就是tcp[13],因此在抓這幾個標志位的數據包時就要明確范圍在tcp[13] 示例1…

RK3588S開發板將SPI1接口改成GPIO

參考官方教程:ROC-RK3588S-PC 一.基本知識: 1.GPIO引腳計算: ROC-RK3588S-PC 有 5 組 GPIO bank:GPIO0~GPIO4,每組又以 A0~A7, B0~B7, C0~C7, D0~D7 作為編號區分,常用以下公式計算引腳:GPIO…

Java 設計模式:適配器模式詳解

Java 設計模式:適配器模式詳解 適配器模式(Adapter Pattern)是一種結構型設計模式,它通過將一個類的接口轉換為客戶端期望的另一個接口,使原本不兼容的類能夠協同工作。適配器模式就像現實生活中的電源適配器&#xf…

python manimgl數學動畫演示_微積分_線性代數原理_ubuntu安裝問題[已解決]

1.背景 最近調研python opencv, cuda加速矩陣/向量運算, 對于矩陣的線性變換, 秩, 轉秩, 行列式變化等概概念模糊不清. 大概課本依舊是天書, 于是上B站搜索線性代數, 看到 3Blue1Brown 線性變換本質 視頻, 點擊觀看. 驚為天人 --> 豁然開朗 --> 突然頓悟 --> 開心不已…

Git 學習筆記

這篇筆記記錄了我在git學習中常常用到的指令&#xff0c;方便在未來進行查閱。此篇文章也會根據筆者的學習進度持續更新。 網站分享 Git 常用命令大全 Learn Git Branching 基礎 $ git init //在當前位置配置一個git版本庫 $ git add <file> //將文件添加至…

Dynamics365 ExportPdfTemplateExportWordTemplate兩個Action調用的body構造

這兩天在用ExportPdfTemplate做pdf導出功能時&#xff0c;遇到了如下問題InnerException : Microsoft.OData.ODataException: An unexpected StartArray node was found when reading from the JSON reader. A PrimitiveValue node was expected. 我的場景是使用power automate…

經典算法 判斷一個圖是不是樹

判斷一個圖是不是樹 問題描述 給一個以0 0結尾的整數對列表&#xff0c;除0 0外的每兩個整數表示一條連接了這兩個節點的邊。假設節點編號不超過100000大于0。你只要判斷由這些節點和邊構成的圖是不是樹。是輸出YES&#xff0c;不是輸出NO。 輸入樣例1 6 8 5 3 5 2 6 4 5…

【嵌入式八股2】C++:STL容器與算法

1. STL常見容器及其內部實現的數據結構 序號 名稱 描述 存儲結構 常用方法和操作 1vector動態分配的數組順序數組&#xff08;array&#xff09;v.push_back(), v.pop_back(), v.insert(), v.erase(), v.capacity(), v.size(), v.at(idx), v.front(), v.back()2list雙向鏈表離…

vmcore分析鎖問題實例(x86-64)

問題描述&#xff1a;系統出現panic&#xff0c;dmesg有如下打印&#xff1a; [122061.197311] task:irq/181-ice-enp state:D stack:0 pid:3134 ppid:2 flags:0x00004000 [122061.197315] Call Trace: [122061.197317] <TASK> [122061.197318] __schedule0…

在Apple Silicon上部署Spark-TTS:四大核心庫的技術魔法解析!!!

在Apple Silicon上部署Spark-TTS&#xff1a;四大核心庫的技術魔法解析 &#x1f680; &#xff08;M2芯片實測&#xff5c;Python 3.12.9PyTorch 2.6.0全流程解析&#xff09; 一、核心庫功能全景圖 &#x1f50d; 在Spark-TTS的部署過程中&#xff0c;pip install numpy li…

leetcode03 -- 武漢旅游查詢系統

武漢旅游查詢系統 1 界面展示 1.首頁地圖界面 2.查找功能 在查找框內輸入查找的景點名稱 查找到的景點在地圖上進行定位,右側展示景點的詳細信息。 3.添加景點功能 在地圖上點擊某個位置,系統彈出一個輸入框供用戶填寫景點的名稱和描述。 在彈出的輸入框中輸入景點名…

玩機進階教程----MTK芯片設備刷機導致的死磚修復實例解析 連電腦毫無反應 非硬件問題

在高通芯片機型中,我們可以通過短接主板測試點來激活高通芯片特有的9008底層端口來刷寫救磚固件。但通常MTK芯片類的設備聯機電腦即可觸發深刷模式。但有些例外的情況會導致鏈接電腦毫無反應。遇到類似故障的友友可以參閱此博文嘗試解決。 通過博文了解 1??????-----實…

09-設計模式企業場景 面試題-mk

文章目錄 1.工廠(方法)模式1.1.簡單工廠模式(不是設計模式,是編程習慣)1.2.工廠方法模式(企業開發中最常見)1.3.抽象工廠模式2.策略模式2.1.登錄案例(工廠模式+策略模式)3.責任鏈設計模式4.單點登錄怎么是實現的?5.權限認證是如何實現的6.上傳數據的安全性你們怎么控…