系統架構的演變

什么是系統架構?

系統架構是系統的一種整體的高層次的結構表示,它確定了系統的基本組織、組件之間的關系、組件與環境的關系,以及指導其設計和發展的原則。隨著技術的發展和業務需求的增長,系統架構經歷了從簡單到復雜、從集中到分布的演變過程。

單體架構(Monolithic Architecture)

  1. 定義與結構
    • 單體架構是最早期的系統架構形式。它將應用程序的所有功能,包括用戶界面、業務邏輯、數據訪問等都打包在一個單一的代碼庫中。例如,一個簡單的 Web 應用,它的前端 HTML/CSS/JavaScript 代碼、后端處理用戶請求的業務邏輯代碼(如用 Python 的 Flask 或 Java 的 Spring Boot 編寫)以及數據庫訪問代碼都在一個項目中。
    • 整個應用作為一個獨立的單元進行開發、部署和運行。通常部署在一臺服務器上,所有的請求都由這個單一的應用實例來處理。
  2. 優點
    • 開發簡單:對于小型項目,開發人員可以快速上手。因為所有的功能都在一個代碼庫中,沒有復雜的分布式系統的概念需要考慮,如網絡通信、數據一致性等。例如,一個小型的公司內部的員工信息管理系統,只需要實現員工信息的增刪改查等基本功能,單體架構可以快速構建完成。
    • 易于測試和部署:在部署方面,只需要將整個應用打包并部署到服務器上即可。測試時,也可以作為一個整體進行單元測試和集成測試,不需要考慮多個組件之間的復雜交互。
  3. 缺點
    • 可擴展性差:隨著業務的增長,應用的功能和用戶量不斷增加,單體架構會變得越來越臃腫。例如,當一個電商系統的用戶量從幾千增長到幾十萬時,所有的業務邏輯都在一個應用中處理,服務器的資源(如 CPU、內存)會很快達到瓶頸,而且很難通過簡單地添加服務器來擴展應用的性能。
    • 維護成本高:由于所有的功能代碼都耦合在一起,一個小的功能修改可能會影響到其他部分。例如,修改數據庫訪問層的一個 SQL 查詢語句,可能會對上層的業務邏輯產生意想不到的影響,而且由于代碼庫龐大,定位問題和修復問題的難度也會增加。

垂直架構(Vertical Architecture)

  1. 定義與結構
    • 垂直架構是在單體架構的基礎上,按照業務功能進行垂直拆分。例如,對于一個電商系統,可以將其拆分為用戶管理模塊、商品管理模塊、訂單管理模塊等。每個模塊都有自己獨立的代碼庫、數據庫(可以是獨立的數據庫實例,也可以是同一個數據庫中的不同表)和服務器。
    • 這些模塊之間通過接口(如 RESTful API)進行通信。比如,用戶管理模塊提供用戶注冊、登錄等接口,訂單管理模塊通過調用這些接口來獲取用戶信息,完成訂單創建等操作。
  2. 優點
    • 提高可維護性:由于每個業務模塊是獨立的,開發團隊可以針對不同的模塊進行獨立開發、維護和升級。例如,商品管理團隊可以專注于商品信息的添加、修改和刪除功能的優化,而不用擔心會影響到用戶管理模塊的功能。
    • 一定程度的擴展性:每個模塊可以根據自己的業務需求獨立地進行擴展。例如,訂單管理模塊如果遇到大量的訂單處理請求,可以單獨增加服務器來處理訂單業務,而不會影響到其他模塊的性能。
  3. 缺點
    • 存在重復功能:不同的垂直模塊可能會有一些重復的功能,如用戶認證和授權功能。每個模塊都可能需要實現自己的用戶登錄和權限檢查邏輯,這會導致代碼重復,增加開發成本。
    • 模塊間通信復雜:模塊之間通過接口進行通信,如果接口設計不合理或者發生變化,會影響到多個模塊之間的交互。例如,用戶管理模塊修改了用戶信息接口的返回數據格式,那么所有調用這個接口的模塊(如訂單管理模塊、客服管理模塊等)都需要進行相應的修改。

分布式架構(Distributed Architecture)

  1. 定義與結構
    • 分布式架構進一步將系統的各個功能單元分散到不同的計算機節點上。它包括多個層次,如分布式存儲、分布式計算等。在分布式存儲方面,數據會被存儲在多個存儲節點上,通過數據冗余和分布式算法來保證數據的可靠性和可用性。例如,在大數據存儲系統中,像 Hadoop 的 HDFS(Hadoop Distributed File System)會將文件分割成多個數據塊,存儲在不同的節點上。
    • 在分布式計算方面,任務會被分解并分配到多個計算節點上進行處理。例如,一個大規模的數據分析任務可以通過分布式計算框架(如 Apache Spark)將計算任務分配到集群中的多個節點上同時進行計算,最后將結果匯總。
  2. 優點
    • 高可擴展性:可以通過添加節點來輕松擴展系統的存儲容量和計算能力。例如,一個云計算服務提供商,當用戶對存儲資源的需求增加時,可以不斷添加存儲節點來滿足需求;當需要處理更多的計算任務時,可以添加計算節點來加速計算過程。
    • 高可用性:由于數據和計算任務分布在多個節點上,單個節點的故障不會導致整個系統癱瘓。例如,在一個分布式數據庫系統中,如果一個節點出現故障,其他節點可以繼續提供服務,并且系統可以通過數據冗余和恢復機制來修復故障節點的數據。
  3. 缺點
    • 系統復雜:分布式系統涉及到多個節點之間的通信、協調和數據一致性等問題。例如,在分布式事務處理中,要保證多個節點上的數據操作要么全部成功,要么全部失敗是一個復雜的問題。開發人員需要處理網絡延遲、節點故障等多種復雜情況,增加了系統開發和維護的難度。
    • 數據一致性挑戰:在多個節點存儲和更新數據時,很難保證數據的實時一致性。例如,在一個分布式緩存系統中,不同節點上的緩存數據可能會因為更新時間不同而出現不一致的情況,需要采用復雜的緩存一致性策略來解決這個問題。

面向服務的架構(Service - Oriented Architecture,SOA)

  1. 定義與結構?
    1. 定義:面向服務的架構(SOA)是一種軟件設計理念和架構風格,它將應用程序的不同功能單元構建成一個個服務。這些服務是獨立的、可復用的軟件組件,它們通過明確定義的接口來提供業務功能。這些接口使用標準的通信協議(如 SOAP 或 REST),使得不同的服務可以在不同的操作系統、編程語言和硬件平臺上進行交互。例如,在一個金融企業中,賬戶查詢服務、轉賬服務、理財服務等都是獨立的服務,它們可以被不同的渠道(如網上銀行、手機銀行、客服系統)調用。
    2. 結構
      • 服務提供者:負責提供具體的服務,包括服務的實現和維護。服務提供者將服務發布到服務注冊中心,使其他組件能夠發現這些服務。例如,銀行的轉賬服務系統就是一個服務提供者,它實現了轉賬的業務邏輯,并且通過服務注冊中心對外發布其轉賬服務接口。
      • 服務注冊中心:類似于一個服務的 “目錄”,它存儲了服務提供者發布的服務信息,包括服務的名稱、接口定義、位置等。其他服務使用者可以在注冊中心查找所需的服務。例如,在企業級的服務架構中,服務注冊中心會記錄各個部門提供的服務,方便其他部門查找和調用。
      • 服務使用者:通過查詢服務注冊中心,發現并調用服務提供者提供的服務來完成自身的業務功能。例如,網上銀行系統作為服務使用者,會在服務注冊中心查找轉賬服務,然后調用該服務來為用戶完成轉賬操作。
  2. 優點
    • 服務復用性高:不同的業務系統可以復用相同的服務。例如,在一個大型企業集團中,用戶認證服務可以被各個子公司的不同業務系統(如人力資源系統、財務系統、銷售系統)復用。這樣可以減少重復開發,提高開發效率,并且保證了服務的一致性。如果企業要修改用戶認證的規則,只需要在用戶認證服務中進行修改,所有使用該服務的系統都能受益。
    • 靈活性和適應性強:由于業務功能被封裝成獨立的服務,可以根據業務需求靈活地組合和編排這些服務。例如,一個電商企業在促銷活動期間,可以快速組合商品查詢服務、折扣計算服務、訂單處理服務等,構建一個新的促銷業務流程。而且,當企業業務發生變化或擴展時,如新增業務功能或修改現有業務流程,只需要對相關的服務進行調整或添加新的服務,不會對整個系統造成大規模的影響。
    • 跨平臺和跨語言集成方便:服務通過標準的通信協議進行交互,使得不同平臺(如 Windows、Linux)和不同編程語言(如 Java、Python、.NET)開發的系統能夠方便地集成。例如,一個用 Java 開發的后端服務可以通過 REST 接口與一個用 JavaScript 開發的前端應用進行通信,實現數據交互和業務協作。
    • 支持分布式開發和部署:各個服務可以由不同的團隊獨立開發和部署,提高了開發效率和系統的可維護性。例如,在一個大型軟件項目中,不同的團隊可以分別負責不同服務的開發,如一個團隊負責用戶管理服務,另一個團隊負責產品管理服務。這些團隊可以按照自己的進度進行開發、測試和部署,只要保證服務接口的兼容性即可。
  3. 缺點
    • 服務治理復雜:由于服務的數量可能較多,且服務之間相互依賴和交互,需要復雜的服務治理機制。包括服務的版本管理、服務的發現和注冊管理、服務的監控和性能優化等。例如,當一個服務的接口發生變化時,需要通知所有使用該服務的服務使用者,并確保它們能夠正確地更新和調用新的接口。如果服務治理不當,可能會導致系統的混亂和故障。
    • 性能開銷:服務之間的通信需要通過網絡和接口調用,這會帶來一定的性能開銷,如網絡延遲、消息序列化和反序列化等。與單體架構相比,SOA 架構下的系統在處理大量高頻請求時,可能會因為這些性能開銷而導致響應速度變慢。例如,在一個對實時性要求很高的交易系統中,頻繁的服務調用可能會影響交易的處理速度。
    • 安全性挑戰:服務的分布式和開放性特點使得安全管理變得復雜。需要考慮服務之間的身份驗證、授權、數據加密等安全措施。例如,當外部系統或第三方合作伙伴調用企業內部的服務時,如何確保它們是合法的、經過授權的,并且在數據傳輸過程中保證數據的安全性是一個重要的問題。
    • 系統集成難度初始較高:在構建 SOA 系統的初期,需要對業務進行詳細的分析和服務的劃分,同時要定義好服務的接口和通信協議。這需要投入大量的時間和精力,并且要求開發人員具有較高的架構設計能力和業務理解能力。如果服務劃分不合理或者接口定義不清晰,會給后續的系統集成和開發帶來困難。

微服務架構(Microservices Architecture)

  1. 定義與結構
    • 微服務架構是一種將應用分解為一組小型、獨立的服務的架構風格。每個微服務都專注于一個特定的業務功能,并且可以獨立地進行開發、部署和擴展。例如,在一個電商系統中,有用戶微服務負責用戶注冊、登錄和信息管理;產品微服務負責產品信息的維護和查詢;訂單微服務負責訂單的創建、處理和跟蹤等。
    • 這些微服務之間通過輕量級的通信協議(如 HTTP/REST 或消息隊列)進行交互。每個微服務都有自己的數據庫(可以是關系型數據庫或非關系型數據庫),并且可以使用不同的技術棧來實現。例如,用戶微服務可以用 Java 編寫,數據庫采用 MySQL;而產品微服務可以用 Node.js 編寫,數據庫采用 MongoDB。
  2. 優點
    • 獨立開發和部署:每個微服務可以由不同的團隊獨立開發和部署,提高了開發效率。例如,一個大型的互聯網公司可以有多個團隊分別負責不同的微服務,這些團隊可以按照自己的節奏進行開發、測試和部署,不會相互干擾。
    • 技術多樣性:不同的微服務可以根據自身的需求選擇最合適的技術。比如,對于一個對實時性要求很高的通知微服務,可以采用高性能的 Go 語言和消息隊列技術;而對于一個數據分析微服務,可以采用 Python 和數據挖掘庫來構建。
    • 易于擴展:可以根據業務需求對單個微服務進行擴展。例如,如果訂單微服務的業務量突然增加,可以單獨對訂單微服務進行水平擴展(添加更多的訂單微服務實例),而不會影響到其他微服務。
  3. 缺點
    • 服務治理復雜:由于微服務數量眾多,需要有效的服務治理機制來管理服務的發現、配置、監控等。例如,在一個包含幾十個微服務的系統中,要確保新的微服務能夠被其他服務發現并且正確地進行通信是一個復雜的問題,需要引入服務發現工具(如 Consul、Eureka)和配置管理工具(如 Spring Cloud Config)。
    • 分布式系統的復雜性:和分布式架構一樣,微服務架構也面臨著分布式系統的問題,如網絡通信、數據一致性等。而且由于微服務之間的交互更加頻繁,這些問題可能會更加突出。例如,在多個微服務之間進行事務處理時,要保證數據的一致性比在單體架構中更加困難。

其他重要演變

  1. 應用和數據分離:隨著網站業務的發展,用戶訪問量增大,數據量也增大,需要將應用和數據分離,形成應用服務器、文件服務器和數據庫服務器。
  2. 緩存數據:為了改善網站性能,使用緩存技術將查詢較多或改動不大的數據緩存起來,降低數據庫服務器負載壓力。
  3. 應用集群:在網站訪問高峰、并發量大的情況下,部署應用服務器集群,利用負載均衡器分散訪問流量,提供服務可用性。
  4. 數據庫讀寫分離:隨著數據繼續增加,請求數量加大,部署多個數據庫進行讀寫分離。
  5. 部署CDN節點:使用CDN技術加速用戶訪問,保證用戶從最近的服務器獲取數據。
  6. 分布式數據庫:在單表數據規模非常龐大時使用,但更常用的拆分手段是業務分庫。
  7. 使用非關系型數據庫:當網站數據足夠龐大時,關系型數據庫達到瓶頸,需要采用非關系型數據庫。

系統架構的演變

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

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

相關文章

c++總復習

C 中多態性在實際項目中的應用場景 圖形繪制系統 描述:在一個圖形繪制軟件中,可能有多種圖形,如圓形、矩形、三角形等。這些圖形都有一個共同的操作,比如繪制(draw)。通過多態性,可以定義一個基…

pip離線安裝一個github倉庫

要使用pip安裝一個本地Git倉庫,你可以按照以下步驟操作: 確保你已經克隆了Git倉庫到本地。 進入倉庫所在的目錄。 使用pip安裝。 以下是具體的命令: 克隆Git倉庫到本地(替換下面的URL為你的倉庫URL) git clone https…

【從零開始入門unity游戲開發之——C#篇04】棧(Stack)和堆(Heap),值類型和引用類型,以及特殊的引用類型string

文章目錄 知識回顧一、棧(Stack)和堆(Heap)1、什么是棧和堆2、為什么要分棧和堆3、棧和堆的區別棧堆 4、總結 二、值類型和引用類型1、那么值類型和引用類型到底有什么區別呢?值類型引用類型 2、總結 三、特殊的引用類…

【C語言實現:用隊列模擬棧與用棧模擬隊列(LeetCode 225 232)】

LeetCode刷題記錄 🌐 我的博客主頁:iiiiiankor🎯 如果你覺得我的內容對你有幫助,不妨點個贊👍、留個評論?,或者收藏?,讓我們一起進步!📝 專欄系列:LeetCode…

【Python】Selenium 爬蟲的使用技巧和案例

引言 Selenium 是 Python 中功能強大的自動化測試工具,因其能夠操控瀏覽器進行模擬操作,被廣泛應用于網頁數據爬取。相比傳統的 requests 等庫,Selenium 能更好地應對動態加載內容和復雜交互場景。本文將詳細介紹 Selenium 爬蟲的使用技巧,并提供實際案例來幫助讀者快速上…

MySQL SQL語句性能優化

MySQL SQL語句性能優化指南 一、查詢設計優化1. 避免 SELECT *2. 使用 WHERE 進行條件過濾3. 避免在索引列上使用函數和表達式4. 使用 LIMIT 限制返回行數5. 避免使用子查詢6. 優化 JOIN 操作7. 避免全表掃描 二、索引優化1. 使用合適的索引2. 覆蓋索引3. 索引選擇性4. 多列索引…

Mybatis動態sql執行過程

動態SQL的執行原理主要涉及到在運行時根據條件動態地生成SQL語句,然后將其發送給數據庫執行。以下是動態SQL執行原理的詳細解釋: 一、接收參數 動態SQL首先會根據用戶的輸入或系統的條件接收參數。這些參數可以是查詢條件、更新數據等,它們…

java jar包加密 jar-protect

介紹 java 本身是開放性極強的語言,代碼也容易被反編譯,沒有語言層面的一些常規保護機制,jar包很容易被反編譯和破解。 受classfinal(已停止維護)設計啟發,針對springboot日常項目開發,重新編寫安全可靠的jar包加殼加密技術,用于保護軟件版權。 使用說…

Linux:Git

Git常見指令: git help xx_command git xx_command --help git --version 查看git版本git config --global user.name "xxx_name" 全局級別的簽名設置,全局的放在本用 git config --global user.ema…

【WiFi】WiFi中RSSI、SNR、NF之間關系及說明

RSSI(接收信號強度指示) 定義: RSSI 是一個相對值,用于表示接收到的無線信號的強度。它通常由無線設備的硬件(如無線網卡或無線芯片)直接提供。 計算: RSSI 的計算通常是由設備的無線芯片完成的…

提升音頻轉錄準確性:VAD技術的應用與挑戰

引言 在音頻轉錄技術飛速發展的今天,我們面臨著一個普遍問題:在嘈雜環境中,轉錄系統常常將非人聲誤識別為人聲,導致轉錄結果出現錯誤。例如,在whisper模式下,系統可能會錯誤地轉錄出“謝謝大家”。本文將探…

[ZMQ] -- ZMQ通信Protobuf數據結構 1

1、前言背景 工作需要域間實現zmq通信,剛開始需要比較簡單的數據結構,比如兩個bool,后面可能就需要傳輸比較大的數據,所以記錄下實現流程,至于為啥選擇proto數據結構去做大數據傳輸,可能是地平線也用這個&…

順序表的使用,對數據的增刪改查

主函數: 3.c #include "3.h"//頭文件調用 SqlListptr sql_cerate()//創建順序表函數 {SqlListptr ptr(SqlListptr)malloc(sizeof(SqlList));//在堆區申請連續的空間if(NULLptr){printf("創建失敗\n");return NULL;//如果沒有申請成功&#xff…

React和Vue中暴露子組件的屬性和方法給父組件用,并且控制子組件暴露的顆粒度的做法

React 在 React 中,forwardRef 是一種高級技術,它允許你將 ref 從父組件傳遞到子組件,從而直接訪問子組件的 DOM 節點或公開的方法。這對于需要操作子組件內部狀態或 DOM 的場景非常有用。為了使子組件能夠暴露其屬性和方法給父組件&#xf…

《C++ 實時視頻流物體跟蹤與行為分析全解析》

在當今科技飛速發展的時代,視頻監控與智能分析技術在眾多領域發揮著極為重要的作用。從安防監控到智能交通,從工業自動化到人機交互,利用 C 處理實時視頻流中的物體跟蹤和行為分析成為了熱門且極具挑戰性的研究與開發方向。本文將深入探討其中…

5G中的隨機接入過程可以不用收RAR?

有朋友提到了一種不用接收RAR的RA過程,問這個是怎么回事。其實在剛剛寫過的LTM cell switch篇章中就有提到,這里把所有相關的內容整理如下。 在RACH-less LTM場景,在進行LTM cell switch之前就要先知道target cell的TA信息,進而才…

git 導出某段時間修改的文件 windows

第一步:列出兩次commitID之間的文件變動 git diff oldid newid --name-only// 例如 git diff 4a886c57a8b5611a2abcfcd120461c2e92f7029a HEAD --name-only 4a886c57a8b5611a2abcfcd120461c2e92f7029a 代表之前 HEAD 代表最新或者換成某次commitID 例如&#xf…

Qt 聯合Halcon配置

文章目錄 配置代碼窗口綁定 配置 選擇添加庫 選擇外部庫 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…

new URL(`../assets/images/${name}`, import.meta.url).href

背景: 文章講述了Vite框架中關于資源文件(如圖片)在默認配置下,如何正確處理開發環境和打包后的不同引用方式。重點介紹了使用import.meta.url和new URL() 來動態獲取并處理靜態資源URL的方法,以及注意事項&#xff0…

8、筆記本品牌分類介紹:LG - 計算機硬件品牌系列文章

LG筆記本品牌以其高性能和先進技術而聞名,?提供多種型號以滿足不同用戶的需求。? LG筆記本產品線包括多種類型,?以滿足不同用戶的需求。?其中,?LG Gram Pro系列以其超薄設計和高性能配置受到關注。?該系列筆記本采用16:10的OLED顯示屏&…