架構設計(1)-談談架構


1、什么是架構和架構本質
 在軟件行業,對於什么是架構,都有很多的爭論,每個人都有自己的理解。   此君說的架構和彼君理解的架構未必是一回事。

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

一、系統與子系統

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

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

二、模塊與組件

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

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

三、框架與架構

框架是組件的規范,例如:MVC、MVP、MVVM等,是提供基礎功能的產品,例如:Ruby on Rails、Spring、Laravel、Django等。

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

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

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

 這類似建築設計規划,城市總體規划等,其實就是架構,只是應用的場景不同。蓋一座小房子,可以拍腦袋干起來,但是當你要蓋一座大樓,如果沒有一個建築設計規划,可以想象搭理最后是什么樣?

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

那什么樣的系統要考慮做架構設計?

    1. 需求相對復雜.

     2. 非功能性需求在整個系統占據重要位置.

     3. 系統生命周期長,有擴展性需求.

     4.系統基於組件或者集成的需要.

     5.業務流程再造的需要

2、架構分類
     架構可細分為業務架構、應用架構、技術架構, 代碼架構, 部署架構,.

     

 

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

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

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

一、業務架構(俯視架構):
      包括業務規划,業務模塊、業務流程,對整個系統的業務進行拆分,對領域模型進行設計,把現實的業務轉化成抽象對象。

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

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

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

二、應用架構(剖面架構,也叫邏輯架構圖):

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

類似:

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

應用架構圖關鍵有2點:

1、職責划分:   明確應用(各個邏輯模塊或者子系統)邊界
   1)邏輯分層
   2)子系統、模塊定義。
   3)關鍵類。
2、職責之間的協作:
   1)接口協議:應用對外輸出的接口。
   2)協作關系:應用之間的調用關系。

    應用分層有兩種方式:

    一種是水平分(橫向),按照功能處理順序划分應用,比如把系統分為web前端/中間服務/后台任務,這是面向業務深度的划分。

    另一種是垂直分(縱向),按照不同的業務類型划分應用,比如進銷存系統可以划分為三個獨立的應用,這是面向業務廣度的划分。

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

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

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

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

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

No.

考慮的方面

產出物

工具

說明

1

數據是集中還是分布存儲的?如何考慮分布式存儲?

數據架構圖

 

 

2

領域模型到數據庫表的轉換?表結構關系的設計?

邏輯模型

物理模型

ER圖

Power Designer

Visio

 

3

實體如何設計?充血模型和貧血模型?

UML類圖

 

 

4

使用什么數據庫?關系型還是非關系型?

選型結果

 

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

代碼架構主要定義:

一、代碼單元:
        1、配置設計
        2、框架、類庫。
二、代碼單元組織:
       1、編碼規范,編碼的慣例。
       2、項目模塊划分
       3、頂層文件結構設計,比如mvc設計。
       4、依賴關系

No.

考慮的方面

產出物

工具

說明

1

分層結構設計

分層架構圖(開發架構圖)

各種繪圖工具

好的分層結構支持自動化測試

2

開發技術選項

開發語言

開發框架

開發工具

 

考慮商用產品、開源框架、自研框架

3

模塊划分

源碼工程;Project目錄結構;

分包(分庫)

 

 

4

開發規范

開發/編碼規范文檔;

 

 

5

軟件質量屬性

分析和決策結果

 

考慮運行期和開發期軟件質量屬性,並權衡利弊進行決策。

 

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

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

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

 

    

 

 

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

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

 

考慮的方面

產出物

工具

說明

1

網絡方面:網絡拓撲;網絡設備;安全機制

拓撲圖

安全規范

 

 

2

性能方面:可靠性、可伸縮性

需要什么樣設備性能

 

 

3

部署方面:集中式還是分布式;組件部署

部署圖

 

 

 

 

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

 

架構演進路程:單體應用->分布式應用服務化-> 微服務

 

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

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

 

 

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

   1、性能需求:使用緩存改善性能

   2、並發需求:使用集群改善並發

   3、讀寫分離:數據庫地讀寫分離

  4、使用反向代理和cdn加速

  5、使用分布式文件和分布式數據庫

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

復雜性高:

以一個百萬行級別的單體應用為例,整個項目包含的模塊非常多、模塊的邊界模糊、 依賴關系不清晰、 代碼質量參差不齊、 混亂地堆砌在一起。可想而知整個項目非常復雜。 每次修改代碼都心驚膽戰, 甚至添加一個簡單的功能, 或者修改一個Bug都會帶來隱含的缺陷。

技術債務: 隨着時間推移、需求變更和人員更迭,會逐漸形成應用程序的技術債務, 並且越積 越多。“ 不壞不修”, 這在軟件開發中非常常見, 在單體應用中這種思想更甚。 已使用的系統設計或代碼難以被修改,因為應用程序中的其他模塊可能會以意料之外的方式使用它。

部署頻率低: 隨着代碼的增多,構建和部署的時間也會增加。而在單體應用中, 每次功能的變更或缺陷的修復都會導致需要重新部署整個應用。全量部署的方式耗時長、 影響范圍大、 風險高, 這使得單體應用項目上線部署的頻率較低。 而部署頻率低又導致兩次發布之間會有大量的功能變更和缺陷修復,出錯率比較高。

可靠性差: 某個應用Bug,例如死循環、內存溢出等, 可能會導致整個應用的崩潰。

擴展能力受限: 單體應用只能作為一個整體進行擴展,無法根據業務模塊的需要進行伸縮。例如,應用中有的模塊是計算密集型的,它需要強勁的CPU; 有的模塊則是IO密集型的,需要更大的內存。 由於這些模塊部署在一起,不得不在硬件的選擇上做出妥協。

阻礙技術創新: 單體應用往往使用統一的技術平台或方案解決所有的問題, 團隊中的每個成員 都必須使用相同的開發語言和框架,要想引入新框架或新技術平台會非常困難。

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

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

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

降低了耦合度:把模塊拆分,使用接口通信,降低模塊之間的耦合度。

責任清晰:把項目拆分成若干個子項目,不同的團隊負責不同的子項目。

擴展方便:增加功能時只需要再增加一個子項目,調用其他系統的接口就可以。

部署方便:可以靈活的進行分布式部署。

提高代碼的復用性:比如Service層,如果不采用分布式rest服務方式架構就會在手機Wap商城,微信商城,PC,Android,iOS每個端都要寫一個Service層邏輯,開發量大,難以維護一起升級,這時候就可以采用分布式rest服務方式,公用一個service層。

缺點:系統之間的交互要使用遠程通信,接口開發增大工作量,但是利大於弊。

 

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

      微服務的特點:

易於開發和維護: 一個微服務只會關注一個特定的業務功能,所以它業務清晰、代碼量較少。 開發和維護單個微服務相對簡單。而整個應用是由若干個微服務構建而成的,所以整個應用也會被維持在一個可控狀態。

單個微服務啟動較快: 單個微服務代碼量較少, 所以啟動會比較快。

局部修改容易部署: 單體應用只要有修改,就得重新部署整個應用,微服務解決了這樣的問題。 一般來說,對某個微服務進行修改,只需要重新部署這個服務即可。

技術棧不受限:在微服務架構中,可以結合項目業務及團隊的特點,合理地選擇技術棧。例如某些服務可使用關系型數據庫MySQL;某些微服務有圖形計算的需求,可以使用Neo4j;甚至可根據需要,部分微服務使用Java開發,部分微服務使用Node.js開發。

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

運維要求較高:更多的服務意味着更多的運維投入。在單體架構中,只需要保證一個應用的正常運行。而在微服務中,需要保證幾十甚至幾百個服務服務的正常運行與協作,這給運維帶來了很大的挑戰。

分布式固有的復雜性:使用微服務構建的是分布式系統。對於一個分布式系統,系統容錯、網絡延遲、分布式事務等都會帶來巨大的挑戰。

接口調整成本高:微服務之間通過接口進行通信。如果修改某一個微服務的API,可能所有使用了該接口的微服務都需要做調整。

重復勞動:很多服務可能都會使用到相同的功能,而這個功能並沒有達到分解為一個微服務的程度,這個時候,可能各個服務都會開發這一功能,從而導致代碼重復。盡管可以使用共享庫來解決這個問題(例如可以將這個功能封裝成公共組件,需要該功能的微服務引用該組件),但共享庫在多語言環境下就不一定行得通了。

     
   

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

一、穩定性。指標:

1. 高可用:要盡可能的提高軟件的可用性,我想每個操作人都不願意看到自己的工作無法正常進行。黑盒白盒測試、單元測試、自動化測試、故障注入測試、提高測試覆蓋率等方式來一步一步推進。

二、高效指標:

1. 文檔化:不管是整體還是部分的整個生命周期內都必須做好文檔化,變動的來源包括但不限於BUG,需求。

2. 可擴展:軟件的設計秉承着低耦合的理念去做,注意在合理的地方抽象。方便功能更改、新增和運用技術的迭代,並且支持在適時對架構做出重構。

3. 高復用:為了避免重復勞動,為了降低成本,我們希望能夠重用之前的代碼、之前的設計。這點對於架構環境的依賴是最大的。

三、安全指標

1. 安全:組織的運作過程中產生的數據都是具有商業價值的,保證數據的安全也是刻不容緩的一部分。以免出現XX門之類丑聞。加密、https等為普遍手段

5、常見架構誤區
誤區1——架構專門由架構師來做,業務開發人員無需關注:架構的再好,最終還是需要代碼來落地,並且組織越大這個落地的難度越大。不單單是系統架構,每個解決方案每個項目也由自己的架構,如分層、設計模式等。如果每一塊磚瓦不夠堅固,那么整個系統還是會由崩塌的風險。所謂“千里之堤,潰於蟻穴”。

誤區2——架構師確定了架構藍圖之后任務就結束了:架構不是“空中樓閣”,最終還是要落地的,但是架構師完全不去深入到第一線怎么知道“地”在哪?怎么才能落的穩穩當當。

誤區3——不做出完美的架構設計不開工:世上沒有最好架構,只有最合適的架構,不要企圖一步到位。我們需要的不是一下子造出一輛汽車,而是從單輪車 --> 自行車 --> 摩托車,最后再到汽車。想象一下2年后才能造出的產品,當初市場還存在嗎?

誤區4—— 為虛無的未來埋單而過度設計

誤區5——埋頭干活兒缺乏前瞻性

 

6、架構知識體系
架構演進

初始階段:LAMP,部署在一台服務器
應用服務器和數據服務器分離
使用緩存改善性能
使用集群改善並發
數據庫地讀寫分離
使用反向代理和cdn加速
使用分布式文件和分布式數據庫
業務拆分
分布式服務
架構模式

分層:橫向分層:應用層,服務層,數據層
分割:縱向分割:拆分功能和服務
分布式
分布式應用和服務
分布式靜態資源

分布式數據和存儲
分布式計算
集群:提高並發和可用性
緩存:優化系統性能
cdn
方向代理訪問資源
本地緩存
分布式緩存
異步:降低系統的耦合性 
提供系統的可用性
加快響應速度
冗余:冷備和熱備,保證系統的可用性
自動化:發布,測試,部署,監控,報警,失效轉移,故障恢復
安全:
架構核心要素

高性能:網站的靈魂
性能測試
前端優化
應用優化
數據庫優化
可用性:保證服務器不宕機,一般通過冗余部署備份服務器來完成
負載均衡
數據備份
自動發布
灰度發布
監控報警
伸縮性:建集群,是否快速應對大規模增長的流量,容易添加新的機器
集群
負載均衡
緩存負載均衡
可擴展性:主要關注功能需求,應對業務的擴展,快速響應業務的變化。是否做法開閉原則,系統耦合依賴
分布式消息
服務化
安全性:網站的各種攻擊,各種漏洞是否堵住,架構是否可以做到限流作用,防止ddos攻擊。
xss攻擊
sql注入
csr攻擊
web防火牆漏洞
安全漏洞
ssl
 

7、架構書籍推薦
 1. 《大型網站技術架構:核心原理與案例分析》

這是比較早,比較系統介紹大型網站技術架構的書,通俗易懂又充滿智慧,即便你之前完全沒接觸過網站開發,通讀前幾章,也能快速獲取到常見的網站技術架構及其應用場景。非常贊。

 2. 《億級流量網站架構核心技術》

相比《大型網站技術架構》的高屋建瓴,開濤的這本《億級流量網站架構核心技術》則落實到細節,網站架構中常見的各種技術,比如緩存、隊列、線程池、代理……,統統都講到了,而且配有核心代碼。甚至連 Nginx 的配置都有!

如果你想在實現大流量網站時找參考技術和代碼,這本書最合適啦。

3. 《架構即未來》

這是一本“神書”啦,超越具體技術層面,着重剖析架構問題的根源,幫助我們弄清楚應該以何種方式管理、領導、組織和配置團隊。

4. 《分布式服務架構:原理、設計與實戰》

這本書全面介紹了分布式服務架構的原理與設計,並結合作者在實施微服務架構過程中的實踐經驗,總結了保障線上服務健康、可靠的最佳方案,是一本架構級、實戰型的重量級著作。

5. 《聊聊架構》

這算是架構方面的一本神書了,從架構的原初談起,從業務的拆分談起,談到架構的目的,架構師的角色,架構師如何將架構落地……強烈推薦。

不過,對於沒有架構實踐經驗的小伙伴來講,可能會覺得這本書比較虛,概念多,實戰少。但如果你有過一兩個項目的架構經驗,就會深深認同書中追本溯源探討的架構理念。

6. 《軟件架構師的12項修煉》

大多數時候所謂的“技術之玻璃天花板”其實只是缺乏軟技能而已。這些技能可以學到,缺乏的知識可以通過決定改變的努力來彌補。

 

 

 

總結參考:

《大型網站技術架構》、《軟件架構師設計》

http://www.rowkey.me/blog/2017/08/24/arch/

https://mp.weixin.qq.com/s?__biz=MjM5MDE0Mjc4MA==&mid=2650992472&idx=1&sn=ab1234fff936fda3e5cf1f6780cb733d&mpshare=1&scene=23&srcid=1017To1tEophZ2h3McPAESCO##

 

總結參考:

《大型網站技術架構》
————————————————
版權聲明:本文為CSDN博主「規速」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hguisu/article/details/78258430

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM