什么是系統架構?
系統架構是系統的一種整體的高層次的結構表示,它確定了系統的基本組織、組件之間的關系、組件與環境的關系,以及指導其設計和發展的原則。隨著技術的發展和業務需求的增長,系統架構經歷了從簡單到復雜、從集中到分布的演變過程。
單體架構(Monolithic Architecture)
- 定義與結構
- 單體架構是最早期的系統架構形式。它將應用程序的所有功能,包括用戶界面、業務邏輯、數據訪問等都打包在一個單一的代碼庫中。例如,一個簡單的 Web 應用,它的前端 HTML/CSS/JavaScript 代碼、后端處理用戶請求的業務邏輯代碼(如用 Python 的 Flask 或 Java 的 Spring Boot 編寫)以及數據庫訪問代碼都在一個項目中。
- 整個應用作為一個獨立的單元進行開發、部署和運行。通常部署在一臺服務器上,所有的請求都由這個單一的應用實例來處理。
- 優點
- 開發簡單:對于小型項目,開發人員可以快速上手。因為所有的功能都在一個代碼庫中,沒有復雜的分布式系統的概念需要考慮,如網絡通信、數據一致性等。例如,一個小型的公司內部的員工信息管理系統,只需要實現員工信息的增刪改查等基本功能,單體架構可以快速構建完成。
- 易于測試和部署:在部署方面,只需要將整個應用打包并部署到服務器上即可。測試時,也可以作為一個整體進行單元測試和集成測試,不需要考慮多個組件之間的復雜交互。
- 缺點
- 可擴展性差:隨著業務的增長,應用的功能和用戶量不斷增加,單體架構會變得越來越臃腫。例如,當一個電商系統的用戶量從幾千增長到幾十萬時,所有的業務邏輯都在一個應用中處理,服務器的資源(如 CPU、內存)會很快達到瓶頸,而且很難通過簡單地添加服務器來擴展應用的性能。
- 維護成本高:由于所有的功能代碼都耦合在一起,一個小的功能修改可能會影響到其他部分。例如,修改數據庫訪問層的一個 SQL 查詢語句,可能會對上層的業務邏輯產生意想不到的影響,而且由于代碼庫龐大,定位問題和修復問題的難度也會增加。
垂直架構(Vertical Architecture)
- 定義與結構
- 垂直架構是在單體架構的基礎上,按照業務功能進行垂直拆分。例如,對于一個電商系統,可以將其拆分為用戶管理模塊、商品管理模塊、訂單管理模塊等。每個模塊都有自己獨立的代碼庫、數據庫(可以是獨立的數據庫實例,也可以是同一個數據庫中的不同表)和服務器。
- 這些模塊之間通過接口(如 RESTful API)進行通信。比如,用戶管理模塊提供用戶注冊、登錄等接口,訂單管理模塊通過調用這些接口來獲取用戶信息,完成訂單創建等操作。
- 優點
- 提高可維護性:由于每個業務模塊是獨立的,開發團隊可以針對不同的模塊進行獨立開發、維護和升級。例如,商品管理團隊可以專注于商品信息的添加、修改和刪除功能的優化,而不用擔心會影響到用戶管理模塊的功能。
- 一定程度的擴展性:每個模塊可以根據自己的業務需求獨立地進行擴展。例如,訂單管理模塊如果遇到大量的訂單處理請求,可以單獨增加服務器來處理訂單業務,而不會影響到其他模塊的性能。
- 缺點
- 存在重復功能:不同的垂直模塊可能會有一些重復的功能,如用戶認證和授權功能。每個模塊都可能需要實現自己的用戶登錄和權限檢查邏輯,這會導致代碼重復,增加開發成本。
- 模塊間通信復雜:模塊之間通過接口進行通信,如果接口設計不合理或者發生變化,會影響到多個模塊之間的交互。例如,用戶管理模塊修改了用戶信息接口的返回數據格式,那么所有調用這個接口的模塊(如訂單管理模塊、客服管理模塊等)都需要進行相應的修改。
分布式架構(Distributed Architecture)
- 定義與結構
- 分布式架構進一步將系統的各個功能單元分散到不同的計算機節點上。它包括多個層次,如分布式存儲、分布式計算等。在分布式存儲方面,數據會被存儲在多個存儲節點上,通過數據冗余和分布式算法來保證數據的可靠性和可用性。例如,在大數據存儲系統中,像 Hadoop 的 HDFS(Hadoop Distributed File System)會將文件分割成多個數據塊,存儲在不同的節點上。
- 在分布式計算方面,任務會被分解并分配到多個計算節點上進行處理。例如,一個大規模的數據分析任務可以通過分布式計算框架(如 Apache Spark)將計算任務分配到集群中的多個節點上同時進行計算,最后將結果匯總。
- 優點
- 高可擴展性:可以通過添加節點來輕松擴展系統的存儲容量和計算能力。例如,一個云計算服務提供商,當用戶對存儲資源的需求增加時,可以不斷添加存儲節點來滿足需求;當需要處理更多的計算任務時,可以添加計算節點來加速計算過程。
- 高可用性:由于數據和計算任務分布在多個節點上,單個節點的故障不會導致整個系統癱瘓。例如,在一個分布式數據庫系統中,如果一個節點出現故障,其他節點可以繼續提供服務,并且系統可以通過數據冗余和恢復機制來修復故障節點的數據。
- 缺點
- 系統復雜:分布式系統涉及到多個節點之間的通信、協調和數據一致性等問題。例如,在分布式事務處理中,要保證多個節點上的數據操作要么全部成功,要么全部失敗是一個復雜的問題。開發人員需要處理網絡延遲、節點故障等多種復雜情況,增加了系統開發和維護的難度。
- 數據一致性挑戰:在多個節點存儲和更新數據時,很難保證數據的實時一致性。例如,在一個分布式緩存系統中,不同節點上的緩存數據可能會因為更新時間不同而出現不一致的情況,需要采用復雜的緩存一致性策略來解決這個問題。
面向服務的架構(Service - Oriented Architecture,SOA)
- 定義與結構?
- 定義:面向服務的架構(SOA)是一種軟件設計理念和架構風格,它將應用程序的不同功能單元構建成一個個服務。這些服務是獨立的、可復用的軟件組件,它們通過明確定義的接口來提供業務功能。這些接口使用標準的通信協議(如 SOAP 或 REST),使得不同的服務可以在不同的操作系統、編程語言和硬件平臺上進行交互。例如,在一個金融企業中,賬戶查詢服務、轉賬服務、理財服務等都是獨立的服務,它們可以被不同的渠道(如網上銀行、手機銀行、客服系統)調用。
- 結構:
- 服務提供者:負責提供具體的服務,包括服務的實現和維護。服務提供者將服務發布到服務注冊中心,使其他組件能夠發現這些服務。例如,銀行的轉賬服務系統就是一個服務提供者,它實現了轉賬的業務邏輯,并且通過服務注冊中心對外發布其轉賬服務接口。
- 服務注冊中心:類似于一個服務的 “目錄”,它存儲了服務提供者發布的服務信息,包括服務的名稱、接口定義、位置等。其他服務使用者可以在注冊中心查找所需的服務。例如,在企業級的服務架構中,服務注冊中心會記錄各個部門提供的服務,方便其他部門查找和調用。
- 服務使用者:通過查詢服務注冊中心,發現并調用服務提供者提供的服務來完成自身的業務功能。例如,網上銀行系統作為服務使用者,會在服務注冊中心查找轉賬服務,然后調用該服務來為用戶完成轉賬操作。
- 優點
- 服務復用性高:不同的業務系統可以復用相同的服務。例如,在一個大型企業集團中,用戶認證服務可以被各個子公司的不同業務系統(如人力資源系統、財務系統、銷售系統)復用。這樣可以減少重復開發,提高開發效率,并且保證了服務的一致性。如果企業要修改用戶認證的規則,只需要在用戶認證服務中進行修改,所有使用該服務的系統都能受益。
- 靈活性和適應性強:由于業務功能被封裝成獨立的服務,可以根據業務需求靈活地組合和編排這些服務。例如,一個電商企業在促銷活動期間,可以快速組合商品查詢服務、折扣計算服務、訂單處理服務等,構建一個新的促銷業務流程。而且,當企業業務發生變化或擴展時,如新增業務功能或修改現有業務流程,只需要對相關的服務進行調整或添加新的服務,不會對整個系統造成大規模的影響。
- 跨平臺和跨語言集成方便:服務通過標準的通信協議進行交互,使得不同平臺(如 Windows、Linux)和不同編程語言(如 Java、Python、.NET)開發的系統能夠方便地集成。例如,一個用 Java 開發的后端服務可以通過 REST 接口與一個用 JavaScript 開發的前端應用進行通信,實現數據交互和業務協作。
- 支持分布式開發和部署:各個服務可以由不同的團隊獨立開發和部署,提高了開發效率和系統的可維護性。例如,在一個大型軟件項目中,不同的團隊可以分別負責不同服務的開發,如一個團隊負責用戶管理服務,另一個團隊負責產品管理服務。這些團隊可以按照自己的進度進行開發、測試和部署,只要保證服務接口的兼容性即可。
- 缺點
- 服務治理復雜:由于服務的數量可能較多,且服務之間相互依賴和交互,需要復雜的服務治理機制。包括服務的版本管理、服務的發現和注冊管理、服務的監控和性能優化等。例如,當一個服務的接口發生變化時,需要通知所有使用該服務的服務使用者,并確保它們能夠正確地更新和調用新的接口。如果服務治理不當,可能會導致系統的混亂和故障。
- 性能開銷:服務之間的通信需要通過網絡和接口調用,這會帶來一定的性能開銷,如網絡延遲、消息序列化和反序列化等。與單體架構相比,SOA 架構下的系統在處理大量高頻請求時,可能會因為這些性能開銷而導致響應速度變慢。例如,在一個對實時性要求很高的交易系統中,頻繁的服務調用可能會影響交易的處理速度。
- 安全性挑戰:服務的分布式和開放性特點使得安全管理變得復雜。需要考慮服務之間的身份驗證、授權、數據加密等安全措施。例如,當外部系統或第三方合作伙伴調用企業內部的服務時,如何確保它們是合法的、經過授權的,并且在數據傳輸過程中保證數據的安全性是一個重要的問題。
- 系統集成難度初始較高:在構建 SOA 系統的初期,需要對業務進行詳細的分析和服務的劃分,同時要定義好服務的接口和通信協議。這需要投入大量的時間和精力,并且要求開發人員具有較高的架構設計能力和業務理解能力。如果服務劃分不合理或者接口定義不清晰,會給后續的系統集成和開發帶來困難。
微服務架構(Microservices Architecture)
- 定義與結構
- 微服務架構是一種將應用分解為一組小型、獨立的服務的架構風格。每個微服務都專注于一個特定的業務功能,并且可以獨立地進行開發、部署和擴展。例如,在一個電商系統中,有用戶微服務負責用戶注冊、登錄和信息管理;產品微服務負責產品信息的維護和查詢;訂單微服務負責訂單的創建、處理和跟蹤等。
- 這些微服務之間通過輕量級的通信協議(如 HTTP/REST 或消息隊列)進行交互。每個微服務都有自己的數據庫(可以是關系型數據庫或非關系型數據庫),并且可以使用不同的技術棧來實現。例如,用戶微服務可以用 Java 編寫,數據庫采用 MySQL;而產品微服務可以用 Node.js 編寫,數據庫采用 MongoDB。
- 優點
- 獨立開發和部署:每個微服務可以由不同的團隊獨立開發和部署,提高了開發效率。例如,一個大型的互聯網公司可以有多個團隊分別負責不同的微服務,這些團隊可以按照自己的節奏進行開發、測試和部署,不會相互干擾。
- 技術多樣性:不同的微服務可以根據自身的需求選擇最合適的技術。比如,對于一個對實時性要求很高的通知微服務,可以采用高性能的 Go 語言和消息隊列技術;而對于一個數據分析微服務,可以采用 Python 和數據挖掘庫來構建。
- 易于擴展:可以根據業務需求對單個微服務進行擴展。例如,如果訂單微服務的業務量突然增加,可以單獨對訂單微服務進行水平擴展(添加更多的訂單微服務實例),而不會影響到其他微服務。
- 缺點
- 服務治理復雜:由于微服務數量眾多,需要有效的服務治理機制來管理服務的發現、配置、監控等。例如,在一個包含幾十個微服務的系統中,要確保新的微服務能夠被其他服務發現并且正確地進行通信是一個復雜的問題,需要引入服務發現工具(如 Consul、Eureka)和配置管理工具(如 Spring Cloud Config)。
- 分布式系統的復雜性:和分布式架構一樣,微服務架構也面臨著分布式系統的問題,如網絡通信、數據一致性等。而且由于微服務之間的交互更加頻繁,這些問題可能會更加突出。例如,在多個微服務之間進行事務處理時,要保證數據的一致性比在單體架構中更加困難。
其他重要演變
- 應用和數據分離:隨著網站業務的發展,用戶訪問量增大,數據量也增大,需要將應用和數據分離,形成應用服務器、文件服務器和數據庫服務器。
- 緩存數據:為了改善網站性能,使用緩存技術將查詢較多或改動不大的數據緩存起來,降低數據庫服務器負載壓力。
- 應用集群:在網站訪問高峰、并發量大的情況下,部署應用服務器集群,利用負載均衡器分散訪問流量,提供服務可用性。
- 數據庫讀寫分離:隨著數據繼續增加,請求數量加大,部署多個數據庫進行讀寫分離。
- 部署CDN節點:使用CDN技術加速用戶訪問,保證用戶從最近的服務器獲取數據。
- 分布式數據庫:在單表數據規模非常龐大時使用,但更常用的拆分手段是業務分庫。
- 使用非關系型數據庫:當網站數據足夠龐大時,關系型數據庫達到瓶頸,需要采用非關系型數據庫。
系統架構的演變