CSDN看到一篇介紹架構設計的博客,內容提綱挈領,內容豐富。依據原文整理,加上本身的理解和總結。 推薦給你們。點擊原文能夠查看出處。php
原文連接:https://blog.csdn.net/hguisu/...前端
在軟件行業,對於什麼是架構,都有不少的爭論,每一個人都有本身的理解。此君說的架構和彼君理解的架構未必是一回事。所以咱們在討論架構以前,咱們先討論架構的概念定義,概念是人認識這個世界的基礎,並用來溝通的手段,若是對架構概念理解不同,那溝通起來天然不暢。nginx
Linux有架構,MySQL有架構,JVM也有架構,使用Java開發、MySQL存儲、跑在Linux上的業務系統也有架構,應該關注哪個?web
想要清楚以上問題須要梳理幾個有關係又類似的概念:系統與子系統、模塊與組建、框架與架構:sql
S君: 區分系統、模塊、組件、框架和架構數據庫
- 系統(system)和子系統:有關聯的個體,根據某種規則運行,共同完成獨特的功能。子系統:系統的組成部分。
- 模塊(module)和組件(component):模塊和組件都是系統的組成部分,只是從不一樣角度拆分系統而已。 從邏輯角度拆分獲得的是模塊,從物理角度拆分獲得的是組件。 模塊是爲了實現職責分離, 組件是爲了實現複用。
- 框架:爲了實現某個業界標準或完成特定基本任務的軟件組件規範,按照規範提供所要求基礎功能的軟件產品。
- 架構:頂層設計
系統:泛指由一羣有關聯的個體組成,根據某種規則運做,能完成個別元件不能獨立完成的工做能力的羣體。編程
子系統:也是由一羣關聯的個體組成的系統,多半是在更大的系統中的一部分。設計模式
都是系統的組成部分,從不一樣角度拆分系統而已。模塊是邏輯單元,組件是物理單元。緩存
模塊就是從邏輯上將系統分解, 即分而治之, 將複雜問題簡單化。模塊的粒度可大可小, 能夠是系統,幾個子系統、某個服務,函數, 類,方法、 功能塊等等。tomcat
組件能夠包括應用服務、數據庫、網絡、物理機、還能夠包括MQ、容器、Nginx等技術組件。
框架是組件實現的規範,例如:MVC、MVP、MVVM等,是提供基礎功能的產品,例如開源框架:Ruby on Rails、Spring、Laravel、Django等,這是能夠拿來直接使用或者在此基礎上二次開發。
框架是規範,架構是結構。
S君:架構是什麼?架構師解決什麼問題?
- 架構是通過系統性地思考1, 權衡利弊以後在現有資源約束下的最合理決策, 最終明確的系統骨架2。包括子系統, 模塊, 組件. 以及他們之間協做關係3, 約束規範, 指導原則4。並由它來指導團隊中的每一個人思想層面上的一致。
- 架構師能力要求:理解業務,全局把控,選擇合適技術,解決關鍵問題、指導研發落地實施。
我在這從新定義架構:軟件架構指軟件系統的頂層結構。
架構是通過系統性地思考, 權衡利弊以後在現有資源約束下的最合理決策, 最終明確的系統骨架。包括子系統, 模塊, 組件. 以及他們之間協做關係, 約束規範, 指導原則。並由它來指導團隊中的每一個人思想層面上的一致。涉及四方面:
所以架構師具有能力:理解業務,全局把控,選擇合適技術,解決關鍵問題、指導研發落地實施。
架構的本質就是對系統進行有序化地重構以至符合當前業務的發展,並能夠快速擴展。
那什麼樣的系統要考慮作架構設計 技術不會無緣無故的出和自驅動發展起來,而架構的發展和需求是基於業務的驅動。
架構設計徹底是爲了業務:
S君:
業務架構是戰略,應用架構是戰術,技術架構是裝備
- 業務架構(俯視架構):包括業務規劃,業務模塊、業務流程,對整個系統的業務進行拆分,對領域模型進行設計,把現實的業務轉化成抽象對象。
- 應用架構(剖面架構): 承接業務架構和技術架構。應用架構的本質是經過系統拆分,平衡業務和技術複雜性,保證系統形散神不散。
應用做爲獨立可部署的單元,爲系統劃分了明確的邊界,深入影響系統功能組織、代碼開發、部署和運維等各方面,應用架構定義系統有哪些應用、以及應用之間如何分工和合做。應用的分偏向於業務,反映業務架構,應用的合偏向於技術,影響技術架構。
- 技術架構:肯定組成應用系統的實際運行組件(技術選型),這些運行組件之間的關係,以及部署到硬件的策略。
技術架構主要考慮系統的非功能性特徵,對系統的高可用、高性能、擴展、安全、伸縮性、簡潔等作系統級的把握
- 三者關係:
業務架構是生產力,應用架構是生產關係,技術架構是生產工具。業務架構決定應用架構,應用架構須要適配業務架構,並隨着業務架構不斷進化,同時應用架構依託技術架構最終落地
補充材料:節選《軟件架構設計》 關注微信公衆號回覆【架構設計】獲取相關書籍
- 架構五視圖:
- 邏輯架構:邏輯架構關注功能,不只包括用戶可見的功能,還包括爲實現用戶功能而必須提供的「輔助功能模塊」。
- 開發架構:開發架構關注程序包,不只包括要編寫的源程序,還包括能夠直接使用的第三方SDK 和現場框架、類庫,以及開發的系統將運行於其上的系統軟件或中間件。關注編譯時刻的靜態依賴關係。
- 運行架構:運行架構關注進程、線程、對象等運行時概念,以及相關的併發,同步,通訊等問題。運行架構關注運行期間各個單元的交互。
- 物理架構:物理架構關注「目標程序及其依賴的運行庫和系統軟件」最終如何安裝或部署到物理機器,以及如何部署機器和網絡來配合軟件系統的可靠性,可伸縮性等要求。
- 數據架構:數據架構關注持久化數據的存儲方案,不只包括實體及實體關係的存儲格式、還包括數據傳遞,數據複製,數據同步等策略。
架構分類可細分爲業務架構、應用架構、技術架構, 代碼架構, 部署架構、數據架構
業務架構是戰略,應用架構是戰術,技術架構是裝備。其中應用架構承上啓下,一方面承接業務架構的落地,另外一方面影響技術選型。
熟悉業務,造成業務架構,根據業務架構,作出相應的應用架構,最後技術架構落地實施。
如何針對當前需求,選擇合適的應用架構,如何面向將來,保證架構平滑過渡,這個是軟件開發者,特別是架構師,都須要深刻思考的問題。
包括業務規劃,業務模塊、業務流程,對整個系統的業務進行拆分,對領域模型進行設計,把現實的業務轉化成抽象對象。
沒有最優的架構,只有最合適的架構,一切系統設計原則都要以解決業務問題爲最終目標,脫離實際業務的技術情懷架構每每會給系統帶入大坑,任何不基於業務作異想天開的架構都是耍流氓。
全部問題的前提要搞清楚咱們今天面臨的業務量有多大,增加走勢是什麼樣,並且解決高併發的過程,必定是一個按部就班逐步的過程。合理的架構可以提早預見業務發展1~2年爲宜。這樣能夠付出較爲合理的代價換來真正達到技術引領業務成長的效果。
看看京東業務架構(網上分享圖):
硬件到應用的抽象,包括抽象層和編程接口。應用架構和業務架構是相輔相成的關係。業務架構的每一部分都有應用架構。
相似:
應用架構:應用做爲獨立可部署的單元,爲系統劃分了明確的邊界,深入影響系統功能組織、代碼開發、部署和運維等各方面. 應用架構定義系統有哪些應用、以及應用之間如何分工和合做。這裏所謂應用就是各個邏輯模塊或者子系統。
應用架構圖關鍵有2點:
①. 職責劃分: 明確應用(各個邏輯模塊或者子系統)邊界
②. 職責之間的協做:
應用分層有兩種方式:
一種是水平分(橫向),按照功能處理順序劃分應用,好比把系統分爲web前端/中間服務/後臺任務,這是面向業務深度的劃分。
另外一種是垂直分(縱向),按照不一樣的業務類型劃分應用,好比進銷存系統能夠劃分爲三個獨立的應用,這是面向業務廣度的劃分。
應用的反映應用之間如何協做,共同完成複雜的業務case,主要體如今應用之間的通信機制和數據格式,通信機制能夠是同步調用/異步消息/共享DB訪問等,數據格式能夠是文本/XML/JSON/二進制等。
應用的分偏向於業務,反映業務架構,應用的合偏向於技術,影響技術架構。分下降了業務複雜度,系統更有序,合增長了技術複雜度,系統更無序。
應用架構的本質是經過系統拆分,平衡業務和技術複雜性,保證系統形散神不散。
系統採用什麼樣的應用架構,受業務複雜性影響,包括企業發展階段和業務特色;同時受技術複雜性影響,包括IT技術發展階段和內部技術人員水平。業務複雜性(包括業務量大)必然帶來技術複雜性,應用架構目標是解決業務複雜性的同時,避免技術太複雜,確保業務架構落地。
數據架構指導數據庫的設計. 不只僅要考慮開發中涉及到的數據庫,實體模型,也要考慮物理架構中數據存儲的設計。
子系統代碼架構主要爲開發人員提供切實可行的指導,若是代碼架構設計不足,就會形成影響全局的架構設計。好比公司內不一樣的開發團隊使用不一樣的技術棧或者組件,結果公司總體架構設計就會失控。
代碼架構主要定義:
①. 代碼單元:
②. 代碼單元組織:
技術架構:肯定組成應用系統的實際運行組件(lvs,nginx,tomcat,php-fpm等),這些運行組件之間的關係,以及部署到硬件的策略。
技術架構主要考慮系統的非功能性特徵,對系統的高可用、高性能、擴展、安全、伸縮性、簡潔等作系統級的把握。
系統架構的設計要求架構師具有軟件和硬件的功能和性能的過硬知識,這也是架構設計工做中最爲困難的工做。
拓撲架構,包括架構部署了幾個節點,節點之間的關係,服務器的高可用,網路接口和協議等,決定了應用如何運行,運行的性能,可維護性,可擴展性,是全部架構的基礎。這個圖主要是運維工程師主要關注的對象。
物理架構主要考慮硬件選擇和拓撲結構,軟件到硬件的映射,軟硬件的相互影響。
S君:
- 戰略設計即業務架構設計
- 戰術設計即應用架構設計
- 戰術實施即技術架構實施
咱們使用金字塔的架構級別來講明,上層級別包含下層:
戰略設計與戰術設計
基於架構金字塔,咱們有了系統架構的戰略設計與戰術設計的完美結合:
S君應用架構演化過程:單體應用-> 服務化 -> 微服務
業務架構是生產力,應用架構是生產關係,技術架構是生產工具。業務架構決定應用架構,應用架構須要適配業務架構,並隨着業務架構不斷進化,同時應用架構依託技術架構最終落地。
架構演進路程:單體應用→分佈式應用服務化→微服務
企業一開始業務比較簡單,只應用某個簡單場景,應用服務支持數據增刪改查和簡單的邏輯便可,單體應用能夠知足要求。
典型的三級架構,前端(Web/手機端)+中間業務邏輯層+數據庫層。這是一種典型的Java Spring MVC或者Python Django框架的應用。其架構圖以下所示:
針對單體應用,非功能性需求的作法:
單體架構的應用比較容易部署、測試, 在項目的初期,單體應用能夠很好地運行。然而,隨着需求的不斷增長, 愈來愈多的人加入開發團隊,代碼庫也在飛速地膨脹。慢慢地,單體應用變得愈來愈臃腫,可維護性、靈活性逐漸下降,維護成本愈來愈高。下面是單體架構應用的一些缺點:
擴展能力受限:單體應用只能做爲一個總體進行擴展,沒法根據業務模塊的須要進行伸縮。例如,應用中有的模塊是計算密集型的,它須要強勁的CPU;有的模塊則是IO密集型的,須要更大的內存。因爲這些模塊部署在一塊兒,不得不在硬件的選擇上作出妥協。
隨着業務深刻,業務要求的產品功能愈來愈多,每一個業務模塊邏輯也都變得更加複雜,業務的深度和廣度都增長,使得單體應用變得愈來愈臃腫,可維護性、靈活性逐漸下降,增長新功能開發週期愈來愈長,維護成本愈來愈高。
這時須要對系統按照業務功能模塊拆分,將各個模塊服務化,變成一個分佈式系統。業務模塊分別部署在不一樣的服務器上,各個業務模塊之間經過接口進行數據交互。
該架構相對於單體架構來講,這種架構提供了負載均衡的能力,大大提升了系統負載能力,解決了網站高併發的需求。另外還有如下特色:
缺點:系統之間的交互要使用遠程通訊,接口開發增大工做量,可是利大於弊。
緊接着業務模式愈來愈複雜,訂單、商品、庫存、價格等各個模塊都很深刻,好比價格區分會員等級,訪問渠道(app仍是PC),銷售方式(團購仍是普通)等,還有大量的價格促銷,這些規則很複雜,容易相互衝突,須要把分散到各個業務的價格邏輯進行統一管理,以基礎價格服務的方式透明地提供給上層應用,變成一個微內核的服務化架構,即微服務。
微服務的特色:
微服務雖然有不少吸引人的地方,但它並非免費的午飯,使用它是有代價的。使用微服務架構面臨的挑戰。
架構爲業務服務,沒有最優的架構,只有最合適的架構,架構始終以高效,穩定,安全爲目標來衡量其合理性。
合理的架構設計:
①. 穩定性指標:
高可用:要儘量的提升軟件的可用性,我想每一個操做人都不肯意看到本身的工做沒法正常進行。黑盒白盒測試、單元測試、自動化測試、故障注入測試、提升測試覆蓋率等方式來一步一步推動。
②. 高效指標:
文檔化:無論是總體仍是部分的整個生命週期內都必須作好文檔化,變更的來源包括但不限於BUG,需求。
可擴展:軟件的設計秉承着低耦合的理念去作,注意在合理的地方抽象。方便功能更改、新增和運用技術的迭代,而且支持在適時對架構作出重構。
高複用:爲了不重複勞動,爲了下降成本,咱們但願可以重用以前的代碼、以前的設計。這點對於架構環境的依賴是最大的。
③. 安全指標
安全:組織的運做過程當中產生的數據都是具備商業價值的,保證數據的安全也是刻不容緩的一部分。以避免出現XX門之類醜聞。加密、https等爲廣泛手段
S君:架構設計須要考慮功能需求和非功能需求,要根據現狀又要有必定的前瞻性,也講究方法又要講究落地,要按部就班,不斷演化
常見誤區:
分層:橫向分層:應用層,服務層,數據層
分割:縱向分割:拆分功能和服務
分佈式
集羣:提升併發和可用性
緩存:優化系統性能
異步:下降系統的耦合性
冗餘:冷備和熱備,保證系統的可用性
自動化:發佈,測試,部署,監控,報警,失效轉移,故障恢復
安全:
高性能:網站的靈魂
可用性:保證服務器不宕機,通常經過冗餘部署備份服務器來完成
伸縮性:建集羣,是否快速應對大規模增加的流量,容易添加新的機器
可擴展性:主要關注功能需求,應對業務的擴展,快速響應業務的變化。是否作法開閉原則,系統耦合依賴
安全性:網站的各類攻擊,各類漏洞是否堵住,架構是否能夠作到限流做用,防止ddos攻擊。
這是比較早,比較系統介紹大型網站技術架構的書,通俗易懂又充滿智慧,即使你以前徹底沒接觸過網站開發,通讀前幾章,也能快速獲取到常見的網站技術架構及其應用場景。很是贊。
相比《大型網站技術架構》的高屋建瓴,開濤的這本《億級流量網站架構核心技術》則落實到細節,網站架構中常見的各類技術,好比緩存、隊列、線程池、代理……,通通都講到了,並且配有核心代碼。甚至連 Nginx 的配置都有!
若是你想在實現大流量網站時找參考技術和代碼,這本書最合適啦。
這是一本「神書」啦,超越具體技術層面,着重剖析架構問題的根源,幫助咱們弄清楚應該以何種方式管理、領導、組織和配置團隊。
這本書全面介紹了分佈式服務架構的原理與設計,並結合做者在實施微服務架構過程當中的實踐經驗,總結了保障線上服務健康、可靠的最佳方案,是一本架構級、實戰型的重量級著做。
這算是架構方面的一本神書了,從架構的原初談起,從業務的拆分談起,談到架構的目的,架構師的角色,架構師如何將架構落地……強烈推薦。
不過,對於沒有架構實踐經驗的小夥伴來說,可能會以爲這本書比較虛,概念多,實戰少。但若是你有過一兩個項目的架構經驗,就會深深認同書中追本溯源探討的架構理念。
大多數時候所謂的「技術之玻璃天花板」其實只是缺少軟技能而已。這些技能能夠學到,缺少的知識能夠經過決定改變的努力來彌補。
參考:
回覆「資料」,免費獲取 一份獨家嘔心整理的技術資料!