在軟體行業,對於什麼是架構,都有很多的爭論,每個人都有自己的理解。在不同的書籍上, 不同的作者, 對於架構的定義也不統一, 角度不同, 定義不同。此君說的架構和彼君理解的架構未必是一回事。因此我們在討論架構之前,我們先討論架構的概念定義, 因為概念是人認識這個世界的基礎和用來溝通的手段,如果對架構概... ...
在軟體行業,對於什麼是架構,都有很多的爭論,每個人都有自己的理解。
在不同的書籍上, 不同的作者, 對於架構的定義也不統一, 角度不同, 定義不同。
此君說的架構和彼君理解的架構未必是一回事。
因此我們在討論架構之前,我們先討論架構的概念定義, 因為概念是人認識這個世界的基礎和用來溝通的手段,如果對架構概念理解不一樣,那溝通起來自然不順暢,本文根據相關資料進行總結。
一、架構是什麼
Linux 有架構,MySQL 有架構,JVM 也有架構,使用 Java 開發、MySQL 存儲、跑在 Linux 上的業務系統也有架構,應該關註哪一個?想要清楚以上問題需要梳理幾個有關係又相似的概念:系統與子系統、模塊與組建、框架與架構。
一)、系統與子系統
系統:泛指由一群有關聯的個體組成,根據某種規則運作,能完成個別元件不能獨立完成的工作能力的群體,關鍵詞:
關聯:系統是由一群有關聯的個體組成的,沒有關聯的個體堆在一起不能成為一個系統。例如,把一個發動機和一臺 PC 放在一起不能稱之為一個系統,把發動機、底盤、輪胎、車架組合起來才能成為一臺汽車。
規則:系統內的個體需要按照指定的規則運作,而不是單個個個體各自為政。規則規定了系統內個體分工和協作的方式。例如,汽車發動機負責產生動力,然後通過變速器和傳動軸, 將動力輸出到車輪上,從而驅動汽車前進。
能力:系統能力與個體能力有本質的差別,系統能力不是是個體能力之和,而是產生了新的能力。例如,汽車能夠載重前進,而發動機、變速器、傳動軸、車輪本身都不具備這樣的能力。
子系統:也是由一群關聯的個體組成的系統,多半是在更大的系統中的一部分。
二)、模塊與組件
都是系統的組成部分,從不同角度拆分系統而已。模塊是邏輯單元,組件是物理單元。
模塊就是從邏輯上將系統分解, 即分而治之, 將複雜問題簡單化。模塊的粒度可大可小, 可以是系統,幾個子系統、某個服務,函數, 類,方法、 功能塊等等。劃分模塊的主要目的是職責分離。
組件可以包括應用服務、資料庫、網路、物理機、還可以包括 MQ、容器、Nginx 等技術組件。劃分組件的主要目的的是單元復用。"組件"的英文單詞 Component,對應中文的"零件"一詞,"零件"更容易理解一些。"零件"是一個物理的概念, 並且具備"獨立且可替換"的特點。現在越來越多的 UI 設計使用組件化化和模塊化。
三)、框架與架構
框架通常指的是為了實現某個業界標準或完成特定基本任務的軟體組件規範, 也指為了實現某個軟體組件規範時,提供規範所要求之基礎功能的軟體產品。
框架是組件實現的規範,例如:MVC、MVP、MVVM 等,是提供基礎功能的產品,例如開源框架:Ruby on Rails、Spring、Laravel、Django 等,這是可以拿來直接使用或者在此基礎上二次開發。再例如,SpringMVC 是 MVC 的開發框架,除了滿足 MVC 的規範,Spring 提供了很多基礎功能來幫助我們實現功能,包括註解(@Controller 等)、Spring Security、SpringJPA 等很多基礎功能。
框架是規範,架構是結構:框架和架構的區別還是比較明顯的,框架關註的是"規範", 架構關註的是"結構":
-
框架的英文是 Framework ,例如,SpringMVC 是"Web MVC Framework"; -
架構的英文是 Architecture,例如,Linux 操作系統的架構。
在 TOGAF9 是這麼定義:一個系統基本的構件(子系統, 模塊, 組件),體現在它的各個構件、構件間的相互關係、構件與環境間的關係,以及對系統設計和演進進行治理的原則中。兩種含義:
-
一個系統的形式化描述,或指導系統實現的構件級的詳細計劃; -
一組構件的結構、構件間的相互關係、以及對這些構件的設計和隨時間演進的過程進行治理的一些原則和指導策略。
架構從字面意思上,是源於古代的建築術語。把架構拆分成兩個字“架”和“構”。“架”就是“加”和“木”的結合,把木頭加起來、連接起來就是架。“構”就是結構的意思。所以,“架構”就是把“木“按照一定的結構連接起來。
對應到軟體架構,“木”代表構件(要素),“結構”代表架構的產物:
木就是系統中的要素,我們將他們稱之為架構構件(要素)。架構要素可以是子系統、模塊、應用服務、組件。
結構,是架構的產物。不同的軟體系統會有不同的結構,這些結構是為解決不同場景而設計的。連接,通過定義架構元素之間的介面和交互關係、集成機制,實現架構元素之間的連接。連接可以是分散式調用、進程間調用、組件之間的交互關係等。
總結一下架構的組成 = 要素 + 結構 + 連接,將系統要素按照特定結構進行連接交互。我在這重新定義架構(見仁見智,自己獨立思考):軟體架構指軟體系統頂層結構設計。架構是經過系統性地思考, 權衡利弊之後在現有資源約束下的最合理決策, 最終明確的系統骨架: 包括子系統, 模塊, 組件. 以及他們之間協作關係, 約束規範, 指導原則. 並由它來指導系統各方面的設計和指導團隊中的每個人思想層面上的一致。
涉及四方面:
1、系統性思考的合理決策:比如技術選型、解決實施方案(包括執行目標計劃)、成本評估、性價比評估等等。
2、結構:明確的系統骨架(結構):明確系統有哪些構件組成。
3、連接:系統協作關係:各個組成部分如何協作來實現業務請求。
4、規範:約束規範和指導原則:保證系統有序,高效、穩定運行,包括規範、原則、流程等內容。
二、架構設計目的
如果沒有架構設計,說明你的系統不夠複雜。隨著業務的增長,系統由單體應用漸進演化為分散式和微服務化。系統整體的複雜性越來越高,技術團隊可能從一個團隊變成多個專業化團隊。假如沒有架構設計,系統定會是一個無序失控的狀態,帶來的問題:
1、應用服務的邊界不是很清晰:到底該怎麼拆分沒有一個明確的原則,研發人員為了所謂微服務化而拆分,而不是從當前業務考慮。導致系統無序的狀態,開發效率低。
我們系統出現過類似的情況:一個簡單項目拆分成 8 個子服務,問他為什麼這麼拆分,說微服務化是為了應對以後擴展方便。結果這個項目從 2017 年到現在都沒有再修改過,接手人寧願新開發一個項目也不願重構。
2、應用服務層次不清晰,系統耦合嚴重:導致服務依賴出現網狀依賴結構,牽一發動全身,後續修改和擴展困難。
3、系統應用服務跟蹤問題:由於微服務化後,系統邏輯複雜,服務出現問題後,你很難快速的定位問題和修複。這是我們踩過不少坑,我們使用 dubbo 服務化,系統一旦出現問題,一推人手忙腳亂。
4、系統服務監控問題:由於研發人員基本沒有服務監控意識,都是出現問題後再想辦法如何添加服務監控介面。
5、技術體系失控問題:不同的開發團隊使用不同的技術棧或者組件,造成公司內部的技術架構失控。甚至研發人員為追求時髦新潮技術,拿應用項目來試驗新技術。
架構設計的目的是為瞭解決系統複雜性帶來的問題,其本質就是對系統進行有序化地重構以致符合當前業務的發展,並可以快速擴展。從上面架構的定義,也知道架構設計的作用涉及四方面:
1、系統性思考的合理決策。
2、明確的系統骨架。
3、系統協作關係。
4、約束規範和指導原則。
架構的本質是管理和解決系統的複雜性,提高效率。管理複雜性:對系統進行有序化重構,不斷減少系統的“熵”,使系統不斷進化,改善軟體質量為目的的內在結構性變化;提高效率:對系統進行有序化重構,以符合當前業務的發展,並可以快速擴展。
無論是何種變化,架構師通過理解業務,全局把控,權衡業務需求和技術實現,選擇合適技術,解決關鍵問題、指導研發落地實施,促進業務發展,提高效率。那什麼樣的系統要考慮做架構設計? 技術不會平白無故的出和自驅動發展起來,而架構的發展和需求是基於業務的驅動:
-
需求相對複雜 -
非功能性需求在整個系統占據重要位置 -
系統生命周期長,有擴展性需求 -
系統基於組件或者集成的需要 -
業務流程再造的需要
三、架構分類
在 EA 架構領域,有兩種常見架構方法 RUP 和 TOGAF,這兩個框架也是我們常常瞭解架構分類的兩個維度。從我個人的角度覺得 TOGAF 的分類方式更加廣泛使用。
RUP4+1 架構視圖
1995 年,Philippe Kruchten 在《IEEE Software》上發表了題為《The 4+1 View Model of Architecture》的論文,引起了業界的極大關註,並最終被 RUP 採納。即 RUP4+1 架構方法。該方法主要採用用例驅動,在軟體生命周期的各個階段對軟體進行建模,從不同視角對系統進行解讀,從而形成統一軟體過程架構描述。該方法的不同架構視圖承載不同的架構設計決策,支持不同的目標和用途。
邏輯視圖:用於描述系統軟體功能拆解後的組件關係,組件約束和邊界,反映系統整體組成與系統如何構建的過程。關註功能和邏輯層。
開發視圖:描述系統的模塊劃分和組成,以及細化到內部包的組成設計,服務於開發人員,反映系統開發實施過程。
物理視圖:描述軟體如何映射到硬體,反映系統在分佈方面的設計,系統的組件是如何部署到一組可電腦器節點上,用於指導軟體系統的部署實施過程。
處理流程視圖:用於描述系統軟體組件之間的通信時序,數據的輸入輸出,反映系統的功能流程與數據流程,通常由時序圖和流程圖表示。關註進程、線程、對象等運行時概念以及相關的併發、同步、通信等問題。
運用 4+1 視圖方法:針對不同需求進行架構設計。
TOGAF9 架構分類
TOGAF9 來對架構分類:
由於不同架構方法論,定義的架構分類也不同,RUP4+1 架構方法主要是以架構生命周期為視角進行描述,而 TOGAF9 按架構涉及內容維度來描述。因此我結合兩者細分為業務架構、應用架構、數據架構、技術架構, 代碼架構, 部署架構。
TOGAF 即 The Open Group Architecture Framework (開放組體繫結構框架),是由致力於技術標準制定和推廣的非盈利組織 The Open Group 制定的用於開發企業架構(Enterprise Architecture)的一套方法和工具。
業務架構是戰略,應用架構是戰術,技術架構是裝備。其中應用架構承上啟下,一方面承接業務架構的落地,另一方面影響技術選型。熟悉業務,形成業務架構,根據業務架構,做出相應的應用架構,最後技術架構落地實施。
1、業務架構(俯視架構)
包括業務規劃,業務模塊、業務流程,對整個系統的業務進行拆分,對領域模型進行設計,把現實的業務轉化成抽象對象。業務架構是企業治理結構、商業能力與價值流的正式藍圖。業務架構明確定義企業的治理結構、業務能力、業務流程、業務數據。其中,業務能力定義企業做什麼,業務流程定義企業怎麼做。業務架構就是對企業的業務流程,進行根本性的再思考和在思考的徹底性再設計,從而獲得成本、質量、速度等方面業績的巨大的改善或提高。總結業務架構包含:
1、戰略;2、企業業務流程(價值鏈)當前能力;3、未來能力;商業能力,IT 能力。
沒有最優的架構,只有最合適的架構,一切系統設計原則都要以解決業務問題為最終目標,脫離實際業務的技術情懷架構往往會給系統帶入大坑,任何不基於業務做異想天開的架構都是耍流氓。
所有問題的前提要搞清楚我們今天面臨的業務量有多大,增長走勢是什麼樣,而且解決高併發的過程,一定是一個循序漸進逐步的過程。合理的架構能夠提前預見業務發展 1~2 年為宜。這樣可以付出較為合理的代價換來真正達到技術引領業務成長的效果。
看看京東業務架構(網上分享圖):
2、產品架構
基礎的產品框架脫胎於業務流程,但相比業務流程,更加註重產品功能的枚舉、功能模塊之間的分界。
當我們打開一個系統,我們會看到一個精美的頁面,一些豐富的信息、導航。這些東西會引導我們去使用這個系統。這些東西就是這個系統的組成部分,就是這個系統的功能模塊。產品架構,就是將這些不同用途的功能模塊圍繞特定的業務目標進行分類整合。
功能模塊是用戶能夠完成一個操作的最小粒度的完整功能。比如一個展示可購買商品的列表頁、一個修改用戶密碼的功能。在功能模塊設計過程中,需要確保用戶能通過一個功能模塊完整的完成一項工作,而不是半個工作。
產品架構中,功能模塊是根據其相互之間的關係來組織的。一個產品中不同的功能模塊之間的關係分直接關係和間接關係。只有直接關係的功能模塊才會被組織到一起,形成一個子系統。那些存在間接關係的模塊,會在不同的層級通過直接關係的模塊產生聯繫。
當具有直接關係的功能模塊組合成一個子系統後,解決相同問題域的子系統就形成一個功能層級。功能層級按照接近用戶實操的距離程度進行從上到下,或者從左至右的劃分,這就形成了產品架構的分層。
3、應用架構(剖面架構,也叫邏輯架構圖):
硬體到應用的抽象,包括抽象層和編程介面。應用架構和業務架構是相輔相成的關係。業務架構的每一部分都有應用架構。
應用架構是要說明產品架構分哪些應用系統,應用系統間是如何集成的。這就是應用架構和應用集成架構。應用架構在產品架構的基礎上考慮兩個事情:第一、考慮的是子系統間的關係。第二、考慮將可復用的組件或模塊進行下沉,沉澱到平臺層,為業務組件提供統一的支撐。
類似:
應用架構:應用作為獨立可部署的單元,為系統劃分了明確的邊界,深刻影響系統功能組織、代碼開發、部署和運維等各方面. 應用架構定義系統有哪些應用、以及應用之間如何分工和合作。這裡所謂應用就是各個邏輯模塊或者子系統。
應用架構圖關鍵有 2 點:
1、職責劃分: 明確應用(各個邏輯模塊或者子系統)邊界
-
邏輯分層 -
子系統、模塊定義。 -
關鍵類。
2、職責之間的協作:
-
介面協議:應用對外輸出的介面。 -
協作關係:應用之間的調用關係。
應用分層有兩種方式:
一種是水平分(橫向),按照功能處理順序劃分應用,比如把系統分為 web 前端/中間服務/後臺任務,這是面向業務深度的劃分。
另一種是垂直分(縱向),按照不同的業務類型劃分應用,比如進銷存系統可以劃分為三個獨立的應用,這是面向業務廣度的劃分。
應用的合反映應用之間如何協作,共同完成複雜的業務 case,主要體現在應用之間的通訊機制和數據格式,通訊機制可以是同步調用/非同步消息/共用 DB 訪問等,數據格式可以是文本/XML/JSON/二進位等。
應用的分偏向於業務,反映業務架構,應用的合偏向於技術,影響技術架構。分降低了業務複雜度,系統更有序,合增加了技術複雜度,系統更無序。應用架構的本質是通過系統拆分,平衡業務和技術複雜性,保證系統形散神不散。
系統採用什麼樣的應用架構,受業務複雜性影響,包括企業發展階段和業務特點;同時受技術複雜性影響,包括 IT 技術發展階段和內部技術人員水平。業務複雜性(包括業務量大)必然帶來技術複雜性,應用架構目標是解決業務複雜性的同時,避免技術太複雜,確保業務架構落地。
4、數據架構
數據架構指導資料庫的設計. 不僅僅要考慮開發中涉及到的資料庫,實體模型,也要考慮物理架構中數據存儲的設計。
5、代碼架構(也叫開發架構):
子系統代碼架構主要為開發人員提供切實可行的指導,如果代碼架構設計不足,就會造成影響全局的架構設計。比如公司內不同的開發團隊使用不同的技術棧或者組件,結果公司整體架構設計就會失控。
代碼架構主要定義內容:
一、代碼單元: 1、配置設計 2、框架、類庫。
二、代碼單元組織:1、編碼規範,編碼的慣例 2、項目模塊劃分 3、頂層文件結構設計,比如 mvc 設計 4、依賴關係
最好的樣本是參考現有《阿裡巴巴 Java 開發手冊》。
6、技術架構
應用架構本身只關心需要哪些應用系統,哪些平臺來滿足業務目標的需求,而不會關心在整個構建過程中你需要使用哪些技術。技術架構是應接應用架構的技術需求,並根據識別的技術需求,進行技術選型,把各個關鍵技術和技術之間的關係描述清楚。
技術架構:確定組成應用系統的實際運行組件(lvs,nginx,tomcat,php-fpm 等),這些運行組件之間的關係,以及部署到硬體的策略。技術架構還要考慮系統的非功能性特征,對系統的高可用、高性能、擴展、安全、伸縮性、簡潔等做系統級的把握。系統架構的設計要求架構師具備軟體和硬體的功能和性能的過硬知識,這也是架構設計工作中最為困難的工作。
7、部署拓撲架構圖(實際物理架構圖):
拓撲架構,包括架構部署了幾個節點,節點之間的關係,伺服器的高可用,網路介面和協議等,決定了應用如何運行,運行的性能,可維護性,可擴展性,是所有架構的基礎。這個圖主要是運維工程師主要關註的對象。
物理架構主要考慮硬體選擇和拓撲結構,軟體到硬體的映射,軟硬體的相互影響。
三、架構級別
我們使用金字塔的架構級別來說明,上層級別包含下層:系統級、應用級、模塊級、代碼級。
系統級,即整個系統內各部分的關係以及如何治理:分層。
應用級,即單個應用的整體架構,及其與系統內單個應用的關係等。
模塊級,即應用內部的模塊架構,如代碼的模塊化、數據和狀態的管理等。
代碼級,即從代碼級別保障架構實施。
戰略設計與戰術設計
基於架構金字塔,我們有了系統架構的戰略設計與戰術設計的完美結合:
戰略設計:業務架構用於指導架構師如何進行系統架構設計。
戰術設計:應用架構要根據業務架構來設計。
戰術實施:應用架構確定以後,就是技術選型。
四、應用架構演進
業務架構是生產力,應用架構是生產關係,技術架構是生產工具。業務架構決定應用架構,應用架構需要適配業務架構,並隨著業務架構不斷進化,同時應用架構依托技術架構最終落地。
架構演進路程:單體應用->分散式應用服務化-> 微服務。
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,可能所有使用了該介面的微服務都需要做調整。
重覆勞動:很多服務可能都會使用到相同的功能,而這個功能並沒有達到分解為一個微服務的程度,這個時候,可能各個服務都會開發這一功能,從而導致代碼重覆。儘管可以使用共用庫來解決這個問題(例如可以將這個功能封裝成公共組件,需要該功能的微服務引用該組件),但共用庫在多語言環境下就不一定行得通了。
五、衡量架構的合理性
架構為業務服務,沒有最優的架構,只有最合適的架構, 架構始終以高效,穩定,安全為目標來衡量其合理性。
合理的架構設計:
1、業務需求角度
1、能解決當下業務需求和問題
2、高效完成業務需求: 能以優雅且可復用的方式解決當下所有業務問題
3、前瞻性設計: 能在未來一段時間都能以第 2 種方式滿足業務,從而不會每次當業務進行演變時,導致架構翻天覆地的變化。
2、非業務需求角度
(一)、穩定性。指標:
1、高可用:要儘可能的提高軟體的可用性,我想每個操作人都不願意看到自己的工作無法正常進行。黑盒白盒測試、單元測試、自動化測試、故障註入測試、提高測試覆蓋率等方式來一步一步推進。
(二)、高效指標:
1、文檔化:不管是整體還是部分的整個生命周期內都必須做好文檔化,變動的來源包括但不限於 BUG,需求。
2、可擴展:軟體的設計秉承著低耦合的理念去做,註意在合理的地方抽象。方便功能更改、新增和運用技術的迭代,並且支持在適時對架構做出重構。
3、高復用:為了避免重覆勞動,為了降低成本,我們希望能夠重用之前的代碼、之前的設計。這點對於架構環境的依賴是最大的。
(三)、安全指標
安全:組織的運作過程中產生的數據都是具有商業價值的,保證數據的安全也是刻不容緩的一部分。以免出現 XX 門之類醜聞。加密、https 等為普遍手段。
六、常見架構誤區
● 開高走落不到實處
● 遺漏關鍵性約束與非功能需求
● 為虛無的未來埋單而過度設計
● 過早做出關鍵性決策
● 客戶說啥就是啥成為傳話筒
● 埋頭幹活兒缺乏前瞻性
● 架構設計還要考慮系統可測性
● 架構設計不要企圖一步到位
誤區 1——架構專門由架構師來做,業務開發人員無需關註
架構的再好,最終還是需要代碼來落地,並且組織越大這個落地的難度越大。不單單是系統架構,每個解決方案每個項目也由自己的架構,如分層、設計模式等。如果每一塊磚瓦不夠堅固,那麼整個系統還是會由崩塌的風險。所謂“千里之堤,潰於蟻穴”。
誤區 2——架構師確定了架構藍圖之後任務就結束了
架構不是“空中樓閣”,最終還是要落地的,但是架構師完全不去深入到第一線怎麼知道“地”在哪?怎麼才能落的穩穩噹噹。
誤區 3——不做出完美的架構設計不開工
世上沒有最好架構,只有最合適的架構,不要企圖一步到位。我們需要的不是一下子造出一輛汽車,而是從單輪車 --> 自行車 --> 摩托車,最後再到汽車。想象一下 2 年後才能造出的產品,當初市場還存在嗎?
誤區 4—— 為虛無的未來埋單而過度設計
在創業公司初期,業務場景和需求邊界很難把握,產品需要快速迭代和變現,需求頻繁更新,這個時候需要的是快速實現。不要過多考慮未來的擴展,說不定功能做完,效果不好就無用了。如果業務模式和應用場景邊界都已經比較清晰,是應該適當的考慮未來的擴展性設計。
誤區 5——一味追隨大公司的解決方案
由於大公司巨大成功的光環效應,再加上從大公司挖來的技術高手的影響,網站在討論架構決策時,最有說服力的一句話就成了“淘寶就是這麼搞的”或者“騰訊 就是這麼搞的”。
大公司的經驗和成功模式固然重要,值得學習借鑒,但如果因此而變得盲從,就失去了堅持自我的勇氣,在架構演化的道路上遲早會迷路。
誤區 6——為了技術而技術
技術是為業務而存在的,除此毫無意義。在技術選型和架構設計中,脫離網站業務發展的實際,一味追求時髦的新技術,可能會將技術發展引入崎嶇小道,架構之路越走越難。考慮實現成本、時間、人員等各方面都要綜合考慮,理想與現實需要折中。
七、架構書籍推薦
1、《大型網站技術架構:核心原理與案例分析》
這是比較早,比較系統介紹大型網站技術架構的書,通俗易懂又充滿智慧,即便你之前完全沒接觸過網站開發,通讀前幾章,也能快速獲取到常見的網站技術架構及其應用場景。非常贊。
2、《億級流量網站架構核心技術》
相比《大型網站技術架構》的高屋建瓴,開濤的這本《億級流量網站架構核心技術》則落實到細節,網站架構中常見的各種技術,比如緩存、隊列、線程池、代理……,統統都講到了,而且配有核心代碼。甚至連 Nginx 的配置都有!
如果你想在實現大流量網站時找參考技術和代碼,這本書最合適啦。
3、《架構即未來》
這是一本“神書”啦,超越具體技術層面,著重剖析架構問題的根源,幫助我們弄清楚應該以何種方式管理、領導、組織和配置團隊。
4、《分散式服務架構:原理、設計與實戰》
這本書全面介紹了分散式服務架構的原理與設計,並結合作者在實施微服務架構過程中的實踐經驗,總結了保障線上服務健康、可靠的最佳方案,是一本架構級、實戰型的重量級著作。
5、《聊聊架構》
這算是架構方面的一本神書了,從架構的原初談起,從業務的拆分談起,談到架構的目的,架構師的角色,架構師如何將架構落地……強烈推薦。
不過,對於沒有架構實踐經驗的小伙伴來講,可能會覺得這本書比較虛,概念多,實戰少。但如果你有過一兩個項目的架構經驗,就會深深認同書中追本溯源探討的架構理念。
6、《軟體架構師的 12 項修煉》
大多數時候所謂的“技術之玻璃天花板”其實只是缺乏軟技能而已。這些技能可以學到,缺乏的知識可以通過決定改變的努力來彌補。
總結參考:
《大型網站技術架構》、《軟體架構師設計》、《TOGAF9》
作者:guisuhuang
本文來自博客園,作者:古道輕風,轉載請註明原文鏈接:https://www.cnblogs.com/88223100/p/Talk-about-architecture-design.html