什麼是架構及架構的本質?

內容介紹:

一、什麼是架構和架構本質

二、架構分層和分類

三、架構級別

四、應用架構演進

五、衡量架構的合理性

六、常見架構誤區

七、架構知識體系

八、架構學習推薦

一. 什麼是架構和架構本質

====================

在軟件行業,對於什麼是架構,都有很多的爭論,每個人都有自己的理解。此君說的架構和彼君理解的架構未必是一回事。因此我們在討論架構之前,我們先討論架構的概念定義,概念是人認識這個世界的基礎,並用來溝通的手段,如果對架構概念理解不一樣,那溝通起來自然不順暢。

Linux 有架構,MySQL 有架構,JVM 也有架構,使用 Java 開發、MySQL 存儲、跑在 Linux 上的業務系統也有架構,應該關注哪一個?想要清楚以上問題需要梳理幾個有關係又相似的概念:系統與子系統、模塊與組建、框架與架構:

1.1. 系統與子系統

系統:泛指由一羣有關聯的個體組成,根據某種規則運作,能完成個別元件不能獨立完成的工作能力的羣體。

子系統:也是由一羣關聯的個體組成的系統,多半是在更大的系統中的一部分。

1.2. 模塊與組件

都是系統的組成部分,從不同角度拆分系統而已。模塊是邏輯單元,組件是物理單元。

模塊就是從邏輯上將系統分解, 即分而治之, 將複雜問題簡單化。模塊的粒度可大可小, 可以是系統,幾個子系統、某個服務,函數, 類,方法、 功能塊等等。

組件可以包括應用服務、數據庫、網絡、物理機、還可以包括 MQ、容器、Nginx 等技術組件。

1.3. 框架與架構

框架是組件實現的規範,例如:MVC、MVP、MVVM 等,是提供基礎功能的產品,例如開源框架:Ruby on Rails、Spring、Laravel、Django 等,這是可以拿來直接使用或者在此基礎上二次開發。

框架是規範,架構是結構。

我在這重新定義架構:軟件架構指軟件系統的頂層結構。

架構是經過系統性地思考, 權衡利弊之後在現有資源約束下的最合理決策, 最終明確的系統骨架: 包括子系統, 模塊, 組件. 以及他們之間協作關係, 約束規範, 指導原則. 並由它來指導團隊中的每個人思想層面上的一致。涉及四方面:

因此架構師具備能力:理解業務,全局把控,選擇合適技術,解決關鍵問題、指導研發落地實施。

架構的本質就是對系統進行有序化地重構以致符合當前業務的發展,並可以快速擴展。

那什麼樣的系統要考慮做架構設計 技術不會平白無故的出和自驅動發展起來,而架構的發展和需求是基於業務的驅動。

架構設計完全是爲了業務,

二. 架構分層和分類

架構分類可細分爲業務架構、應用架構、技術架構, 代碼架構, 部署架構。

業務架構是戰略,應用架構是戰術,技術架構是裝備。其中應用架構承上啓下,一方面承接業務架構的落地,另一方面影響技術選型。

熟悉業務,形成業務架構,根據業務架構,做出相應的應用架構,最後技術架構落地實施。

如何針對當前需求,選擇合適的應用架構,如何面向未來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都需要深入思考的問題。

2.1. 業務架構(俯視架構):

包括業務規劃,業務模塊、業務流程,對整個系統的業務進行拆分,對領域模型進行設計,把現實的業務轉化成抽象對象。

沒有最優的架構,只有最合適的架構,一切系統設計原則都要以解決業務問題爲最終目標,脫離實際業務的技術情懷架構往往會給系統帶入大坑,任何不基於業務做異想天開的架構都是耍流氓。

所有問題的前提要搞清楚我們今天面臨的業務量有多大,增長走勢是什麼樣,而且解決高併發的過程,一定是一個循序漸進逐步的過程。合理的架構能夠提前預見業務發展 1~2 年爲宜。這樣可以付出較爲合理的代價換來真正達到技術引領業務成長的效果。

看看京東業務架構(網上分享圖):

2.2. 應用架構(剖面架構,也叫邏輯架構圖):

硬件到應用的抽象,包括抽象層和編程接口。應用架構和業務架構是相輔相成的關係。業務架構的每一部分都有應用架構。

類似:

應用架構:應用作爲獨立可部署的單元,爲系統劃分了明確的邊界,深刻影響系統功能組織、代碼開發、部署和運維等各方面. 應用架構定義系統有哪些應用、以及應用之間如何分工和合作。這裏所謂應用就是各個邏輯模塊或者子系統。

應用架構圖關鍵有 2 點:

①. 職責劃分: 明確應用(各個邏輯模塊或者子系統)邊界

②. 職責之間的協作:

應用分層有兩種方式:

應用的合反映應用之間如何協作,共同完成複雜的業務 case,主要體現在應用之間的通訊機制和數據格式,通訊機制可以是同步調用 / 異步消息 / 共享 DB 訪問等,數據格式可以是文本 / XML/JSON / 二進制等。

應用的分偏向於業務,反映業務架構,應用的合偏向於技術,影響技術架構。分降低了業務複雜度,系統更有序,合增加了技術複雜度,系統更無序。

應用架構的本質是通過系統拆分,平衡業務和技術複雜性,保證系統形散神不散。

系統採用什麼樣的應用架構,受業務複雜性影響,包括企業發展階段和業務特點;同時受技術複雜性影響,包括 IT 技術發展階段和內部技術人員水平。業務複雜性(包括業務量大)必然帶來技術複雜性,應用架構目標是解決業務複雜性的同時,避免技術太複雜,確保業務架構落地。

2.3. 數據架構

數據架構指導數據庫的設計. 不僅僅要考慮開發中涉及到的數據庫,實體模型,也要考慮物理架構中數據存儲的設計。

2.4. 代碼架構(也叫開發架構):

子系統代碼架構主要爲開發人員提供切實可行的指導,如果代碼架構設計不足,就會造成影響全局的架構設計。比如公司內不同的開發團隊使用不同的技術棧或者組件,結果公司整體架構設計就會失控。

代碼架構主要定義:

①. 代碼單元:

②. 代碼單元組織:

2.5. 技術架構

技術架構:確定組成應用系統的實際運行組件(lvs,nginx,tomcat,php-fpm 等),這些運行組件之間的關係,以及部署到硬件的策略。

技術架構主要考慮系統的非功能性特徵,對系統的高可用、高性能、擴展、安全、伸縮性、簡潔等做系統級的把握。

系統架構的設計要求架構師具備軟件和硬件的功能和性能的過硬知識,這也是架構設計工作中最爲困難的工作。

2.6. 部署拓撲架構圖(實際物理架構圖):

拓撲架構,包括架構部署了幾個節點,節點之間的關係,服務器的高可用,網路接口和協議等,決定了應用如何運行,運行的性能,可維護性,可擴展性,是所有架構的基礎。這個圖主要是運維工程師主要關注的對象。

物理架構主要考慮硬件選擇和拓撲結構,軟件到硬件的映射,軟硬件的相互影響。

三. 架構級別

我們使用金字塔的架構級別來說明, 上層級別包含下層:

戰略設計與戰術設計

基於架構金字塔,我們有了系統架構的戰略設計與戰術設計的完美結合:

四. 應用架構演進

業務架構是生產力,應用架構是生產關係,技術架構是生產工具。業務架構決定應用架構,應用架構需要適配業務架構,並隨着業務架構不斷進化,同時應用架構依託技術架構最終落地。

架構演進路程:單體應用→分佈式應用服務化→微服務

4.1. 單體應用

企業一開始業務比較簡單,只應用某個簡單場景,應用服務支持數據增刪改查和簡單的邏輯即可,單體應用可以滿足要求。

典型的三級架構,前端(Web / 手機端)+ 中間業務邏輯層 + 數據庫層。這是一種典型的 Java Spring MVC 或者 Python Django 框架的應用。其架構圖如下所示:

針對單體應用,非功能性需求的做法:

單體架構的應用比較容易部署、測試, 在項目的初期,單體應用可以很好地運行。然而,隨着需求的不斷增加, 越來越多的人加入開發團隊,代碼庫也在飛速地膨脹。慢慢地,單體應用變得越來越臃腫,可維護性、靈活性逐漸降低,維護成本越來越高。下面是單體架構應用的一些缺點:

4.2. 分佈式

隨着業務深入,業務要求的產品功能越來越多,每個業務模塊邏輯也都變得更加複雜,業務的深度和廣度都增加,使得單體應用變得越來越臃腫,可維護性、靈活性逐漸降低,增加新功能開發週期越來越長,維護成本越來越高。

這時需要對系統按照業務功能模塊拆分,將各個模塊服務化,變成一個分佈式系統。業務模塊分別部署在不同的服務器上,各個業務模塊之間通過接口進行數據交互。

該架構相對於單體架構來說,這種架構提供了負載均衡的能力,大大提高了系統負載能力,解決了網站高併發的需求。另外還有以下特點:

4.3. 微服務

緊接着業務模式越來越複雜,訂單、商品、庫存、價格等各個模塊都很深入,比如價格區分會員等級,訪問渠道(app 還是 PC),銷售方式(團購還是普通)等,還有大量的價格促銷,這些規則很複雜,容易相互衝突,需要把分散到各個業務的價格邏輯進行統一管理,以基礎價格服務的方式透明地提供給上層應用,變成一個微內核的服務化架構,即微服務。

微服務的特點:

微服務雖然有很多吸引人的地方,但它並不是免費的午餐,使用它是有代價的。使用微服務架構面臨的挑戰。

五. 衡量架構的合理性

架構爲業務服務,沒有最優的架構,只有最合適的架構,架構始終以高效,穩定,安全爲目標來衡量其合理性。

合理的架構設計:

5.1. 業務需求角度

5.2. 非業務需求角度

①. 穩定性。指標:

②. 高效指標:

③. 安全指標

六. 常見架構誤區

開高走落不到實處

常見誤區

七. 架構知識體系

7.1. 架構演進

7.2. 架構模式

分層:橫向分層:應用層,服務層,數據層

分割:縱向分割:拆分功能和服務

分佈式

集羣:提高併發和可用性

緩存:優化系統性能

異步:降低系統的耦合性

冗餘:冷備和熱備,保證系統的可用性

自動化:發佈,測試,部署,監控,報警,失效轉移,故障恢復

安全:

7.3. 架構核心要素

高性能:網站的靈魂

可用性:保證服務器不宕機,一般通過冗餘部署備份服務器來完成負載均衡、數據備份、自動發佈、灰度發佈、監控報警。

伸縮性:建集羣,是否快速應對大規模增長的流量,容易添加新的機器集羣

可擴展性:主要關注功能需求,應對業務的擴展,快速響應業務的變化。是否做法開閉原則,系統耦合依賴。

安全性:網站的各種攻擊,各種漏洞是否堵住,架構是否可以做到限流作用,防止 ddos 攻擊。如:xss 攻擊、sql 注入、csr 攻擊、web 防火牆漏洞、安全漏洞、ssl 等。

作者 | 規速

來源丨 blog.csdn.net/hguisu/article/details/78258430

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/I2jSiiBCvGkQZdcTLUvzVg