一文詳談架構(gòu)設(shè)計_第1頁
一文詳談架構(gòu)設(shè)計_第2頁
一文詳談架構(gòu)設(shè)計_第3頁
一文詳談架構(gòu)設(shè)計_第4頁
一文詳談架構(gòu)設(shè)計_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

一文詳談架構(gòu)設(shè)計在軟件行業(yè),對于什么是架構(gòu),都有很多的爭論,每個人都有自己的理解。在不同的書籍上,不同的作者,對于架構(gòu)的定義也不統(tǒng)一,角度不同,定義不同。此君說的架構(gòu)和彼君理解的架構(gòu)未必是一回事。因此我們在討論架構(gòu)之前,我們先討論架構(gòu)的概念定義,因為概念是人認識這個世界的基礎(chǔ)和用來溝通的手段,如果對架構(gòu)概念理解不一樣,那溝通起來自然不順暢,本文根據(jù)相關(guān)資料進行總結(jié)。一、架構(gòu)是什么Linux有架構(gòu),MySQL有架構(gòu),JVM也有架構(gòu),使用Java開發(fā)、MySQL存儲、跑在Linux上的業(yè)務(wù)系統(tǒng)也有架構(gòu),應(yīng)該關(guān)注哪一個?想要清楚以上問題需要梳理幾個有關(guān)系又相似的概念:系統(tǒng)與子系統(tǒng)、模塊與組建、框架與架構(gòu)。一)、系統(tǒng)與子系統(tǒng)系統(tǒng):泛指由一群有關(guān)聯(lián)的個體組成,根據(jù)某種規(guī)則運作,能完成個別元件不能獨立完成的工作能力的群體,關(guān)鍵詞:關(guān)聯(lián):系統(tǒng)是由一群有關(guān)聯(lián)的個體組成的,沒有關(guān)聯(lián)的個體堆在一起不能成為一個系統(tǒng)。例如,把一個發(fā)動機和一臺PC放在一起不能稱之為一個系統(tǒng),把發(fā)動機、底盤、輪胎、車架組合起來才能成為一臺汽車。規(guī)則:系統(tǒng)內(nèi)的個體需要按照指定的規(guī)則運作,而不是單個個個體各自為政。規(guī)則規(guī)定了系統(tǒng)內(nèi)個體分工和協(xié)作的方式。例如,汽車發(fā)動機負責產(chǎn)生動力,然后通過變速器和傳動軸,將動力輸出到車輪上,從而驅(qū)動汽車前進。能力:系統(tǒng)能力與個體能力有本質(zhì)的差別,系統(tǒng)能力不是是個體能力之和,而是產(chǎn)生了新的能力。例如,汽車能夠載重前進,而發(fā)動機、變速器、傳動軸、車輪本身都不具備這樣的能力。子系統(tǒng):也是由一群關(guān)聯(lián)的個體組成的系統(tǒng),多半是在更大的系統(tǒng)中的一部分。二)、模塊與組件都是系統(tǒng)的組成部分,從不同角度拆分系統(tǒng)而已。模塊是邏輯單元,組件是物理單元。模塊就是從邏輯上將系統(tǒng)分解,即分而治之,將復雜問題簡單化。模塊的粒度可大可小,可以是系統(tǒng),幾個子系統(tǒng)、某個服務(wù),函數(shù),類,方法、功能塊等等。劃分模塊的主要目的是職責分離。組件可以包括應(yīng)用服務(wù)、數(shù)據(jù)庫、網(wǎng)絡(luò)、物理機、還可以包括MQ、容器、Nginx等技術(shù)組件。劃分組件的主要目的的是單元復用。"組件"的英文單詞Component,對應(yīng)中文的"零件"一詞,"零件"更容易理解一些。"零件"是一個物理的概念,并且具備"獨立且可替換"的特點?,F(xiàn)在越來越多的UI設(shè)計使用組件化化和模塊化。三)、框架與架構(gòu)框架通常指的是為了實現(xiàn)某個業(yè)界標準或完成特定基本任務(wù)的軟件組件規(guī)范,也指為了實現(xiàn)某個軟件組件規(guī)范時,提供規(guī)范所要求之基礎(chǔ)功能的軟件產(chǎn)品。框架是組件實現(xiàn)的規(guī)范,例如:MVC、MVP、MVVM等,是提供基礎(chǔ)功能的產(chǎn)品,例如開源框架:RubyonRails、Spring、Laravel、Django等,這是可以拿來直接使用或者在此基礎(chǔ)上二次開發(fā)。再例如,SpringMVC是MVC的開發(fā)框架,除了滿足MVC的規(guī)范,Spring提供了很多基礎(chǔ)功能來幫助我們實現(xiàn)功能,包括注解(@Controller等)、SpringSecurity、SpringJPA等很多基礎(chǔ)功能??蚣苁且?guī)范,架構(gòu)是結(jié)構(gòu):框架和架構(gòu)的區(qū)別還是比較明顯的,框架關(guān)注的是"規(guī)范",架構(gòu)關(guān)注的是"結(jié)構(gòu)":框架的英文是Framework,例如,SpringMVC是"WebMVCFramework";架構(gòu)的英文是Architecture,例如,Linux操作系統(tǒng)的架構(gòu)。在TOGAF9是這么定義:一個系統(tǒng)基本的構(gòu)件(子系統(tǒng),模塊,組件),體現(xiàn)在它的各個構(gòu)件、構(gòu)件間的相互關(guān)系、構(gòu)件與環(huán)境間的關(guān)系,以及對系統(tǒng)設(shè)計和演進進行治理的原則中。兩種含義:一個系統(tǒng)的形式化描述,或指導系統(tǒng)實現(xiàn)的構(gòu)件級的詳細計劃;一組構(gòu)件的結(jié)構(gòu)、構(gòu)件間的相互關(guān)系、以及對這些構(gòu)件的設(shè)計和隨時間演進的過程進行治理的一些原則和指導策略。架構(gòu)從字面意思上,是源于古代的建筑術(shù)語。把架構(gòu)拆分成兩個字“架”和“構(gòu)”?!凹堋本褪恰凹印焙汀澳尽钡慕Y(jié)合,把木頭加起來、連接起來就是架?!皹?gòu)”就是結(jié)構(gòu)的意思。所以,“架構(gòu)”就是把“木“按照一定的結(jié)構(gòu)連接起來。對應(yīng)到軟件架構(gòu),“木”代表構(gòu)件(要素),“結(jié)構(gòu)”代表架構(gòu)的產(chǎn)物:木就是系統(tǒng)中的要素,我們將他們稱之為架構(gòu)構(gòu)件(要素)。架構(gòu)要素可以是子系統(tǒng)、模塊、應(yīng)用服務(wù)、組件。結(jié)構(gòu),是架構(gòu)的產(chǎn)物。不同的軟件系統(tǒng)會有不同的結(jié)構(gòu),這些結(jié)構(gòu)是為解決不同場景而設(shè)計的。連接,通過定義架構(gòu)元素之間的接口和交互關(guān)系、集成機制,實現(xiàn)架構(gòu)元素之間的連接。連接可以是分布式調(diào)用、進程間調(diào)用、組件之間的交互關(guān)系等。總結(jié)一下架構(gòu)的組成=要素+結(jié)構(gòu)+連接,將系統(tǒng)要素按照特定結(jié)構(gòu)進行連接交互。我在這重新定義架構(gòu)(見仁見智,自己獨立思考):軟件架構(gòu)指軟件系統(tǒng)頂層結(jié)構(gòu)設(shè)計。架構(gòu)是經(jīng)過系統(tǒng)性地思考,權(quán)衡利弊之后在現(xiàn)有資源約束下的最合理決策,最終明確的系統(tǒng)骨架:包括子系統(tǒng),模塊,組件.以及他們之間協(xié)作關(guān)系,約束規(guī)范,指導原則.并由它來指導系統(tǒng)各方面的設(shè)計和指導團隊中的每個人思想層面上的一致。涉及四方面:1、系統(tǒng)性思考的合理決策:比如技術(shù)選型、解決實施方案(包括執(zhí)行目標計劃)、成本評估、性價比評估等等。2、結(jié)構(gòu):明確的系統(tǒng)骨架(結(jié)構(gòu)):明確系統(tǒng)有哪些構(gòu)件組成。3、連接:系統(tǒng)協(xié)作關(guān)系:各個組成部分如何協(xié)作來實現(xiàn)業(yè)務(wù)請求。4、規(guī)范:約束規(guī)范和指導原則:保證系統(tǒng)有序,高效、穩(wěn)定運行,包括規(guī)范、原則、流程等內(nèi)容。二、架構(gòu)設(shè)計目的如果沒有架構(gòu)設(shè)計,說明你的系統(tǒng)不夠復雜。隨著業(yè)務(wù)的增長,系統(tǒng)由單體應(yīng)用漸進演化為分布式和微服務(wù)化。系統(tǒng)整體的復雜性越來越高,技術(shù)團隊可能從一個團隊變成多個專業(yè)化團隊。假如沒有架構(gòu)設(shè)計,系統(tǒng)定會是一個無序失控的狀態(tài),帶來的問題:1、應(yīng)用服務(wù)的邊界不是很清晰:到底該怎么拆分沒有一個明確的原則,研發(fā)人員為了所謂微服務(wù)化而拆分,而不是從當前業(yè)務(wù)考慮。導致系統(tǒng)無序的狀態(tài),開發(fā)效率低。我們系統(tǒng)出現(xiàn)過類似的情況:一個簡單項目拆分成8個子服務(wù),問他為什么這么拆分,說微服務(wù)化是為了應(yīng)對以后擴展方便。結(jié)果這個項目從2017年到現(xiàn)在都沒有再修改過,接手人寧愿新開發(fā)一個項目也不愿重構(gòu)。2、應(yīng)用服務(wù)層次不清晰,系統(tǒng)耦合嚴重:導致服務(wù)依賴出現(xiàn)網(wǎng)狀依賴結(jié)構(gòu),牽一發(fā)動全身,后續(xù)修改和擴展困難。3、系統(tǒng)應(yīng)用服務(wù)跟蹤問題:由于微服務(wù)化后,系統(tǒng)邏輯復雜,服務(wù)出現(xiàn)問題后,你很難快速的定位問題和修復。這是我們踩過不少坑,我們使用dubbo服務(wù)化,系統(tǒng)一旦出現(xiàn)問題,一推人手忙腳亂。4、系統(tǒng)服務(wù)監(jiān)控問題:由于研發(fā)人員基本沒有服務(wù)監(jiān)控意識,都是出現(xiàn)問題后再想辦法如何添加服務(wù)監(jiān)控接口。5、技術(shù)體系失控問題:不同的開發(fā)團隊使用不同的技術(shù)棧或者組件,造成公司內(nèi)部的技術(shù)架構(gòu)失控。甚至研發(fā)人員為追求時髦新潮技術(shù),拿應(yīng)用項目來試驗新技術(shù)。架構(gòu)設(shè)計的目的是為了解決系統(tǒng)復雜性帶來的問題,其本質(zhì)就是對系統(tǒng)進行有序化地重構(gòu)以致符合當前業(yè)務(wù)的發(fā)展,并可以快速擴展。從上面架構(gòu)的定義,也知道架構(gòu)設(shè)計的作用涉及四方面:1、系統(tǒng)性思考的合理決策。2、明確的系統(tǒng)骨架。3、系統(tǒng)協(xié)作關(guān)系。4、約束規(guī)范和指導原則。架構(gòu)的本質(zhì)是管理和解決系統(tǒng)的復雜性,提高效率。管理復雜性:對系統(tǒng)進行有序化重構(gòu),不斷減少系統(tǒng)的“熵”,使系統(tǒng)不斷進化,改善軟件質(zhì)量為目的的內(nèi)在結(jié)構(gòu)性變化;提高效率:對系統(tǒng)進行有序化重構(gòu),以符合當前業(yè)務(wù)的發(fā)展,并可以快速擴展。無論是何種變化,架構(gòu)師通過理解業(yè)務(wù),全局把控,權(quán)衡業(yè)務(wù)需求和技術(shù)實現(xiàn),選擇合適技術(shù),解決關(guān)鍵問題、指導研發(fā)落地實施,促進業(yè)務(wù)發(fā)展,提高效率。那什么樣的系統(tǒng)要考慮做架構(gòu)設(shè)計?技術(shù)不會平白無故的出和自驅(qū)動發(fā)展起來,而架構(gòu)的發(fā)展和需求是基于業(yè)務(wù)的驅(qū)動:需求相對復雜非功能性需求在整個系統(tǒng)占據(jù)重要位置系統(tǒng)生命周期長,有擴展性需求系統(tǒng)基于組件或者集成的需要業(yè)務(wù)流程再造的需要三、架構(gòu)分類在EA架構(gòu)領(lǐng)域,有兩種常見架構(gòu)方法RUP和TOGAF,這兩個框架也是我們常常了解架構(gòu)分類的兩個維度。從我個人的角度覺得TOGAF的分類方式更加廣泛使用。RUP4+1架構(gòu)視圖1995年,PhilippeKruchten在《IEEESoftware》上發(fā)表了題為《The4+1ViewModelofArchitecture》的論文,引起了業(yè)界的極大關(guān)注,并最終被RUP采納。即RUP4+1架構(gòu)方法。該方法主要采用用例驅(qū)動,在軟件生命周期的各個階段對軟件進行建模,從不同視角對系統(tǒng)進行解讀,從而形成統(tǒng)一軟件過程架構(gòu)描述。該方法的不同架構(gòu)視圖承載不同的架構(gòu)設(shè)計決策,支持不同的目標和用途。邏輯視圖:用于描述系統(tǒng)軟件功能拆解后的組件關(guān)系,組件約束和邊界,反映系統(tǒng)整體組成與系統(tǒng)如何構(gòu)建的過程。關(guān)注功能和邏輯層。開發(fā)視圖:描述系統(tǒng)的模塊劃分和組成,以及細化到內(nèi)部包的組成設(shè)計,服務(wù)于開發(fā)人員,反映系統(tǒng)開發(fā)實施過程。物理視圖:描述軟件如何映射到硬件,反映系統(tǒng)在分布方面的設(shè)計,系統(tǒng)的組件是如何部署到一組可計算機器節(jié)點上,用于指導軟件系統(tǒng)的部署實施過程。處理流程視圖:用于描述系統(tǒng)軟件組件之間的通信時序,數(shù)據(jù)的輸入輸出,反映系統(tǒng)的功能流程與數(shù)據(jù)流程,通常由時序圖和流程圖表示。關(guān)注進程、線程、對象等運行時概念以及相關(guān)的并發(fā)、同步、通信等問題。運用4+1視圖方法:針對不同需求進行架構(gòu)設(shè)計。TOGAF9架構(gòu)分類TOGAF9來對架構(gòu)分類:由于不同架構(gòu)方法論,定義的架構(gòu)分類也不同,RUP4+1架構(gòu)方法主要是以架構(gòu)生命周期為視角進行描述,而TOGAF9按架構(gòu)涉及內(nèi)容維度來描述。因此我結(jié)合兩者細分為業(yè)務(wù)架構(gòu)、應(yīng)用架構(gòu)、數(shù)據(jù)架構(gòu)、技術(shù)架構(gòu),代碼架構(gòu),部署架構(gòu)。TOGAF即TheOpenGroupArchitectureFramework(開放組體系結(jié)構(gòu)框架),是由致力于技術(shù)標準制定和推廣的非盈利組織TheOpenGroup制定的用于開發(fā)企業(yè)架構(gòu)(EnterpriseArchitecture)的一套方法和工具。業(yè)務(wù)架構(gòu)是戰(zhàn)略,應(yīng)用架構(gòu)是戰(zhàn)術(shù),技術(shù)架構(gòu)是裝備。其中應(yīng)用架構(gòu)承上啟下,一方面承接業(yè)務(wù)架構(gòu)的落地,另一方面影響技術(shù)選型。熟悉業(yè)務(wù),形成業(yè)務(wù)架構(gòu),根據(jù)業(yè)務(wù)架構(gòu),做出相應(yīng)的應(yīng)用架構(gòu),最后技術(shù)架構(gòu)落地實施。1、業(yè)務(wù)架構(gòu)(俯視架構(gòu))包括業(yè)務(wù)規(guī)劃,業(yè)務(wù)模塊、業(yè)務(wù)流程,對整個系統(tǒng)的業(yè)務(wù)進行拆分,對領(lǐng)域模型進行設(shè)計,把現(xiàn)實的業(yè)務(wù)轉(zhuǎn)化成抽象對象。業(yè)務(wù)架構(gòu)是企業(yè)治理結(jié)構(gòu)、商業(yè)能力與價值流的正式藍圖。業(yè)務(wù)架構(gòu)明確定義企業(yè)的治理結(jié)構(gòu)、業(yè)務(wù)能力、業(yè)務(wù)流程、業(yè)務(wù)數(shù)據(jù)。其中,業(yè)務(wù)能力定義企業(yè)做什么,業(yè)務(wù)流程定義企業(yè)怎么做。業(yè)務(wù)架構(gòu)就是對企業(yè)的業(yè)務(wù)流程,進行根本性的再思考和在思考的徹底性再設(shè)計,從而獲得成本、質(zhì)量、速度等方面業(yè)績的巨大的改善或提高??偨Y(jié)業(yè)務(wù)架構(gòu)包含:1、戰(zhàn)略;2、企業(yè)業(yè)務(wù)流程(價值鏈)當前能力;3、未來能力;商業(yè)能力,IT能力。沒有最優(yōu)的架構(gòu),只有最合適的架構(gòu),一切系統(tǒng)設(shè)計原則都要以解決業(yè)務(wù)問題為最終目標,脫離實際業(yè)務(wù)的技術(shù)情懷架構(gòu)往往會給系統(tǒng)帶入大坑,任何不基于業(yè)務(wù)做異想天開的架構(gòu)都是耍流氓。所有問題的前提要搞清楚我們今天面臨的業(yè)務(wù)量有多大,增長走勢是什么樣,而且解決高并發(fā)的過程,一定是一個循序漸進逐步的過程。合理的架構(gòu)能夠提前預(yù)見業(yè)務(wù)發(fā)展1~2年為宜。這樣可以付出較為合理的代價換來真正達到技術(shù)引領(lǐng)業(yè)務(wù)成長的效果??纯淳〇|業(yè)務(wù)架構(gòu)(網(wǎng)上分享圖):2、產(chǎn)品架構(gòu)基礎(chǔ)的產(chǎn)品框架脫胎于業(yè)務(wù)流程,但相比業(yè)務(wù)流程,更加注重產(chǎn)品功能的枚舉、功能模塊之間的分界。當我們打開一個系統(tǒng),我們會看到一個精美的頁面,一些豐富的信息、導航。這些東西會引導我們?nèi)ナ褂眠@個系統(tǒng)。這些東西就是這個系統(tǒng)的組成部分,就是這個系統(tǒng)的功能模塊。產(chǎn)品架構(gòu),就是將這些不同用途的功能模塊圍繞特定的業(yè)務(wù)目標進行分類整合。功能模塊是用戶能夠完成一個操作的最小粒度的完整功能。比如一個展示可購買商品的列表頁、一個修改用戶密碼的功能。在功能模塊設(shè)計過程中,需要確保用戶能通過一個功能模塊完整的完成一項工作,而不是半個工作。產(chǎn)品架構(gòu)中,功能模塊是根據(jù)其相互之間的關(guān)系來組織的。一個產(chǎn)品中不同的功能模塊之間的關(guān)系分直接關(guān)系和間接關(guān)系。只有直接關(guān)系的功能模塊才會被組織到一起,形成一個子系統(tǒng)。那些存在間接關(guān)系的模塊,會在不同的層級通過直接關(guān)系的模塊產(chǎn)生聯(lián)系。當具有直接關(guān)系的功能模塊組合成一個子系統(tǒng)后,解決相同問題域的子系統(tǒng)就形成一個功能層級。功能層級按照接近用戶實操的距離程度進行從上到下,或者從左至右的劃分,這就形成了產(chǎn)品架構(gòu)的分層。3、應(yīng)用架構(gòu)(剖面架構(gòu),也叫邏輯架構(gòu)圖):硬件到應(yīng)用的抽象,包括抽象層和編程接口。應(yīng)用架構(gòu)和業(yè)務(wù)架構(gòu)是相輔相成的關(guān)系。業(yè)務(wù)架構(gòu)的每一部分都有應(yīng)用架構(gòu)。應(yīng)用架構(gòu)是要說明產(chǎn)品架構(gòu)分哪些應(yīng)用系統(tǒng),應(yīng)用系統(tǒng)間是如何集成的。這就是應(yīng)用架構(gòu)和應(yīng)用集成架構(gòu)。應(yīng)用架構(gòu)在產(chǎn)品架構(gòu)的基礎(chǔ)上考慮兩個事情:第一、考慮的是子系統(tǒng)間的關(guān)系。第二、考慮將可復用的組件或模塊進行下沉,沉淀到平臺層,為業(yè)務(wù)組件提供統(tǒng)一的支撐。類似:應(yīng)用架構(gòu):應(yīng)用作為獨立可部署的單元,為系統(tǒng)劃分了明確的邊界,深刻影響系統(tǒng)功能組織、代碼開發(fā)、部署和運維等各方面.應(yīng)用架構(gòu)定義系統(tǒng)有哪些應(yīng)用、以及應(yīng)用之間如何分工和合作。這里所謂應(yīng)用就是各個邏輯模塊或者子系統(tǒng)。應(yīng)用架構(gòu)圖關(guān)鍵有2點:1、職責劃分:

明確應(yīng)用(各個邏輯模塊或者子系統(tǒng))邊界邏輯分層子系統(tǒng)、模塊定義。關(guān)鍵類。2、職責之間的協(xié)作:接口協(xié)議:應(yīng)用對外輸出的接口。協(xié)作關(guān)系:應(yīng)用之間的調(diào)用關(guān)系。應(yīng)用分層有兩種方式:一種是水平分(橫向),按照功能處理順序劃分應(yīng)用,比如把系統(tǒng)分為web前端/中間服務(wù)/后臺任務(wù),這是面向業(yè)務(wù)深度的劃分。另一種是垂直分(縱向),按照不同的業(yè)務(wù)類型劃分應(yīng)用,比如進銷存系統(tǒng)可以劃分為三個獨立的應(yīng)用,這是面向業(yè)務(wù)廣度的劃分。應(yīng)用的合反映應(yīng)用之間如何協(xié)作,共同完成復雜的業(yè)務(wù)case,主要體現(xiàn)在應(yīng)用之間的通訊機制和數(shù)據(jù)格式,通訊機制可以是同步調(diào)用/異步消息/共享DB訪問等,數(shù)據(jù)格式可以是文本/XML/JSON/二進制等。應(yīng)用的分偏向于業(yè)務(wù),反映業(yè)務(wù)架構(gòu),應(yīng)用的合偏向于技術(shù),影響技術(shù)架構(gòu)。分降低了業(yè)務(wù)復雜度,系統(tǒng)更有序,合增加了技術(shù)復雜度,系統(tǒng)更無序。應(yīng)用架構(gòu)的本質(zhì)是通過系統(tǒng)拆分,平衡業(yè)務(wù)和技術(shù)復雜性,保證系統(tǒng)形散神不散。系統(tǒng)采用什么樣的應(yīng)用架構(gòu),受業(yè)務(wù)復雜性影響,包括企業(yè)發(fā)展階段和業(yè)務(wù)特點;同時受技術(shù)復雜性影響,包括IT技術(shù)發(fā)展階段和內(nèi)部技術(shù)人員水平。業(yè)務(wù)復雜性(包括業(yè)務(wù)量大)必然帶來技術(shù)復雜性,應(yīng)用架構(gòu)目標是解決業(yè)務(wù)復雜性的同時,避免技術(shù)太復雜,確保業(yè)務(wù)架構(gòu)落地。4、數(shù)據(jù)架構(gòu)數(shù)據(jù)架構(gòu)指導數(shù)據(jù)庫的設(shè)計.不僅僅要考慮開發(fā)中涉及到的數(shù)據(jù)庫,實體模型,也要考慮物理架構(gòu)中數(shù)據(jù)存儲的設(shè)計。5、代碼架構(gòu)(也叫開發(fā)架構(gòu)):子系統(tǒng)代碼架構(gòu)主要為開發(fā)人員提供切實可行的指導,如果代碼架構(gòu)設(shè)計不足,就會造成影響全局的架構(gòu)設(shè)計。比如公司內(nèi)不同的開發(fā)團隊使用不同的技術(shù)棧或者組件,結(jié)果公司整體架構(gòu)設(shè)計就會失控。代碼架構(gòu)主要定義內(nèi)容:一、代碼單元:1、配置設(shè)計2、框架、類庫。二、代碼單元組織:1、編碼規(guī)范,編碼的慣例2、項目模塊劃分3、頂層文件結(jié)構(gòu)設(shè)計,比如mvc設(shè)計4、依賴關(guān)系最好的樣本是參考現(xiàn)有《阿里巴巴Java開發(fā)手冊》。6、技術(shù)架構(gòu)應(yīng)用架構(gòu)本身只關(guān)心需要哪些應(yīng)用系統(tǒng),哪些平臺來滿足業(yè)務(wù)目標的需求,而不會關(guān)心在整個構(gòu)建過程中你需要使用哪些技術(shù)。技術(shù)架構(gòu)是應(yīng)接應(yīng)用架構(gòu)的技術(shù)需求,并根據(jù)識別的技術(shù)需求,進行技術(shù)選型,把各個關(guān)鍵技術(shù)和技術(shù)之間的關(guān)系描述清楚。技術(shù)架構(gòu):確定組成應(yīng)用系統(tǒng)的實際運行組件(lvs,nginx,tomcat,php-fpm等),這些運行組件之間的關(guān)系,以及部署到硬件的策略。技術(shù)架構(gòu)還要考慮系統(tǒng)的非功能性特征,對系統(tǒng)的高可用、高性能、擴展、安全、伸縮性、簡潔等做系統(tǒng)級的把握。系統(tǒng)架構(gòu)的設(shè)計要求架構(gòu)師具備軟件和硬件的功能和性能的過硬知識,這也是架構(gòu)設(shè)計工作中最為困難的工作。7、部署拓撲架構(gòu)圖(實際物理架構(gòu)圖):拓撲架構(gòu),包括架構(gòu)部署了幾個節(jié)點,節(jié)點之間的關(guān)系,服務(wù)器的高可用,網(wǎng)路接口和協(xié)議等,決定了應(yīng)用如何運行,運行的性能,可維護性,可擴展性,是所有架構(gòu)的基礎(chǔ)。這個圖主要是運維工程師主要關(guān)注的對象。物理架構(gòu)主要考慮硬件選擇和拓撲結(jié)構(gòu),軟件到硬件的映射,軟硬件的相互影響。三、架構(gòu)級別我們使用金字塔的架構(gòu)級別來說明,上層級別包含下層:系統(tǒng)級、應(yīng)用級、模塊級、代碼級。系統(tǒng)級,即整個系統(tǒng)內(nèi)各部分的關(guān)系以及如何治理:分層。應(yīng)用級,即單個應(yīng)用的整體架構(gòu),及其與系統(tǒng)內(nèi)單個應(yīng)用的關(guān)系等。模塊級,即應(yīng)用內(nèi)部的模塊架構(gòu),如代碼的模塊化、數(shù)據(jù)和狀態(tài)的管理等。代碼級,即從代碼級別保障架構(gòu)實施。戰(zhàn)略設(shè)計與戰(zhàn)術(shù)設(shè)計基于架構(gòu)金字塔,我們有了系統(tǒng)架構(gòu)的戰(zhàn)略設(shè)計與戰(zhàn)術(shù)設(shè)計的完美結(jié)合:戰(zhàn)略設(shè)計:業(yè)務(wù)架構(gòu)用于指導架構(gòu)師如何進行系統(tǒng)架構(gòu)設(shè)計。戰(zhàn)術(shù)設(shè)計:應(yīng)用架構(gòu)要根據(jù)業(yè)務(wù)架構(gòu)來設(shè)計。戰(zhàn)術(shù)實施:應(yīng)用架構(gòu)確定以后,就是技術(shù)選型。四、應(yīng)用架構(gòu)演進業(yè)務(wù)架構(gòu)是生產(chǎn)力,應(yīng)用架構(gòu)是生產(chǎn)關(guān)系,技術(shù)架構(gòu)是生產(chǎn)工具。業(yè)務(wù)架構(gòu)決定應(yīng)用架構(gòu),應(yīng)用架構(gòu)需要適配業(yè)務(wù)架構(gòu),并隨著業(yè)務(wù)架構(gòu)不斷進化,同時應(yīng)用架構(gòu)依托技術(shù)架構(gòu)最終落地。架構(gòu)演進路程:單體應(yīng)用->分布式應(yīng)用服務(wù)化->微服務(wù)。1、單體應(yīng)用企業(yè)一開始業(yè)務(wù)比較簡單,只應(yīng)用某個簡單場景,應(yīng)用服務(wù)支持數(shù)據(jù)增刪改查和簡單的邏輯即可,單體應(yīng)用可以滿足要求。典型的三級架構(gòu),前端(Web/手機端)+中間業(yè)務(wù)邏輯層+數(shù)據(jù)庫層。這是一種典型的JavaSpringMVC或者PythonDjango框架的應(yīng)用。其架構(gòu)圖如下所示:針對單體應(yīng)用,非功能性需求的做法:1、性能需求:使用緩存改善性能2、并發(fā)需求:使用集群改善并發(fā)3、讀寫分離:數(shù)據(jù)庫地讀寫分離4、使用反向代理和cdn加速5、使用分布式文件和分布式數(shù)據(jù)庫單體架構(gòu)的應(yīng)用比較容易部署、測試,在項目的初期,單體應(yīng)用可以很好地運行。然而,隨著需求的不斷增加,越來越多的人加入開發(fā)團隊,代碼庫也在飛速地膨脹。慢慢地,單體應(yīng)用變得越來越臃腫,可維護性、靈活性逐漸降低,維護成本越來越高,下面是單體架構(gòu)應(yīng)用的一些缺點。復雜性高:以一個百萬行級別的單體應(yīng)用為例,整個項目包含的模塊非常多、模塊的邊界模糊、依賴關(guān)系不清晰、代碼質(zhì)量參差不齊、混亂地堆砌在一起??上攵麄€項目非常復雜。每次修改代碼都心驚膽戰(zhàn),甚至添加一個簡單的功能,或者修改一個Bug都會帶來隱含的缺陷。技術(shù)債務(wù):隨著時間推移、需求變更和人員更迭,會逐漸形成應(yīng)用程序的技術(shù)債務(wù),并且越積越多。“不壞不修”,這在軟件開發(fā)中非常常見,在單體應(yīng)用中這種思想更甚。已使用的系統(tǒng)設(shè)計或代碼難以被修改,因為應(yīng)用程序中的其他模塊可能會以意料之外的方式使用它。部署頻率低:隨著代碼的增多,構(gòu)建和部署的時間也會增加。而在單體應(yīng)用中,每次功能的變更或缺陷的修復都會導致需要重新部署整個應(yīng)用。全量部署的方式耗時長、影響范圍大、風險高,這使得單體應(yīng)用項目上線部署的頻率較低。而部署頻率低又導致兩次發(fā)布之間會有大量的功能變更和缺陷修復,出錯率比較高。可靠性差:某個應(yīng)用Bug,例如死循環(huán)、內(nèi)存溢出等,可能會導致整個應(yīng)用的崩潰。擴展能力受限:單體應(yīng)用只能作為一個整體進行擴展,無法根據(jù)業(yè)務(wù)模塊的需要進行伸縮。例如,應(yīng)用中有的模塊是計算密集型的,它需要強勁的CPU;有的模塊則是IO密集型的,需要更大的內(nèi)存。由于這些模塊部署在一起,不得不在硬件的選擇上做出妥協(xié)。阻礙技術(shù)創(chuàng)新:單體應(yīng)用往往使用統(tǒng)一的技術(shù)平臺或方案解決所有的問題,團隊中的每個成員都必須使用相同的開發(fā)語言和框架,要想引入新框架或新技術(shù)平臺會非常困難。2、分布式隨著業(yè)務(wù)深入,業(yè)務(wù)要求的產(chǎn)品功能越來越多,每個業(yè)務(wù)模塊邏輯也都變得更加復雜,業(yè)務(wù)的深度和廣度都增加,使得單體應(yīng)用變得越來越臃腫,可維護性、靈活性逐漸降低,增加新功能開發(fā)周期越來越長,維護成本越來越高。這時需要對系統(tǒng)按照業(yè)務(wù)功能模塊拆分,將各個模塊服務(wù)化,變成一個分布式系統(tǒng)。業(yè)務(wù)模塊分別部署在不同的服務(wù)器上,各個業(yè)務(wù)模塊之間通過接口進行數(shù)據(jù)交互。該架構(gòu)相對于單體架構(gòu)來說,這種架構(gòu)提供了負載均衡的能力,大大提高了系統(tǒng)負載能力,解決了網(wǎng)站高并發(fā)的需求。另外還有以下特點:降低了耦合度:把模塊拆分,使用接口通信,降低模塊之間的耦合度。責任清晰:把項目拆分成若干個子項目,不同的團隊負責不同的子項目。擴展方便:增加功能時只需要再增加一個子項目,調(diào)用其他系統(tǒng)的接口就可以。部署方便:可以靈活的進行分布式部署。提高代碼的復用性:比如Service層,如果不采用分布式rest服務(wù)方式架構(gòu)就會在手機Wap商城,微信商城,PC,Android,iOS每個端都要寫一個Service層邏輯,開發(fā)量大,難以維護一起升級,這時候就可以采用分布式rest服務(wù)方式,公用一個service層。缺點:系統(tǒng)之間的交互要使用遠程通信,接口開發(fā)增大工作量,但是利大于弊。3、微服務(wù)緊接著業(yè)務(wù)模式越來越復雜,訂單、商品、庫存、價格等各個模塊都很深入,比如價格區(qū)分會員等級,訪問渠道(app還是PC),銷售方式(團購還是普通)等,還有大量的價格促銷,這些規(guī)則很復雜,容易相互沖突,需要把分散到各個業(yè)務(wù)的價格邏輯進行統(tǒng)一管理,以基礎(chǔ)價格服務(wù)的方式透明地提供給上層應(yīng)用,變成一個微內(nèi)核的服務(wù)化架構(gòu),即微服務(wù)。微服務(wù)的特點:易于開發(fā)和維護:一個微服務(wù)只會關(guān)注一個特定的業(yè)務(wù)功能,所以它業(yè)務(wù)清晰、代碼量較少。開發(fā)和維護單個微服務(wù)相對簡單。而整個應(yīng)用是由若干個微服務(wù)構(gòu)建而成的,所以整個應(yīng)用也會被維持在一個可控狀態(tài)。單個微服務(wù)啟動較快:單個微服務(wù)代碼量較少,所以啟動會比較快。局部修改容易部署:單體應(yīng)用只要有修改,就得重新部署整個應(yīng)用,微服務(wù)解決了這樣的問題。一般來說,對某個微服務(wù)進行修改,只需要重新部署這個服務(wù)即可。技術(shù)棧不受限:在微服務(wù)架構(gòu)中,可以結(jié)合項目業(yè)務(wù)及團隊的特點,合理地選擇技術(shù)棧。例如某些服務(wù)可使用關(guān)系型數(shù)據(jù)庫MySQL;某些微服務(wù)有圖形計算的需求,可以使用Neo4j;甚至可根據(jù)需要,部分微服務(wù)使用Java開發(fā),部分微服務(wù)使用Node.js開發(fā)。微服務(wù)雖然有很多吸引人的地方,但它并不是免費的午餐,使用它是有代價的。使用微服務(wù)架構(gòu)面臨的挑戰(zhàn)。運維要求較高:更多的服務(wù)意味著更多的運維投入。在單體架構(gòu)中,只需要保證一個應(yīng)用的正常運行。而在微服務(wù)中,需要保證幾十甚至幾百個服務(wù)服務(wù)的正常運行與協(xié)作,這給運維帶來了很大的挑戰(zhàn)。分布式固有的復雜性:使用微服務(wù)構(gòu)建的是分布式系統(tǒng)。對于一個分布式系統(tǒng),系統(tǒng)容錯、網(wǎng)絡(luò)延遲、分布式事務(wù)等都會帶來巨大的挑戰(zhàn)。接口調(diào)整成本高:微服務(wù)之間通過接口進行通信。如果修改某一個微服務(wù)的API,可能所有使用了該接口的微服務(wù)都需要做調(diào)整。重復勞動:很多服務(wù)可能都會使用到相同的功能,而這個功能并沒有達到分解為一個微服務(wù)的程度,這個時候,可能各個服務(wù)都會開發(fā)這一功能,從而導致代碼重復。盡管可以使用共享庫來解決這個問題(例如可以將這個功能封裝成公共組件,需要該功能的微服務(wù)引用該組件),但共享庫在多語言環(huán)境下就不一定行得通了。五、衡量架構(gòu)的合理性架構(gòu)為業(yè)務(wù)服務(wù),沒有最優(yōu)的架構(gòu),只有最合適的架構(gòu),架構(gòu)始終以高效,穩(wěn)定,安全為目標來衡量其合理性。合理的架構(gòu)設(shè)計:1、業(yè)務(wù)需求角度1、能解決當下業(yè)務(wù)需求和問題2、高效完成業(yè)務(wù)需求:能以優(yōu)雅且可復用的方式解決當下所有業(yè)務(wù)問題3、前瞻性設(shè)計:能在未來一段時間都能以第2種方式滿足業(yè)務(wù),從而不會每次當業(yè)務(wù)進行演變時,導致架構(gòu)翻天覆地的變化。2、非業(yè)務(wù)需求角度(一)、穩(wěn)定性。指標:1、高可用:要盡可能的提高軟件的可用性,我想每個操作人都不愿意看到自己的工作無法正常進行。黑盒白盒測試、單元測試、自動化測試、故障注入測試、提高測試覆蓋率等方式來一步一步推進。(二)、高效指標:1、文檔化:不管是整體還是部分的整個生命周期內(nèi)都必須做好文檔化,變動的來源包括但不限于BUG,需求。2、可擴展:軟件的設(shè)計秉承著低耦合的理念去做,注意在合理的地方抽象。方便功能更改、新增和運用技術(shù)的迭代,并且支持在適時對架構(gòu)做出重構(gòu)。3、高復用:為了避免重復勞動,為了降低成本,我們希望能夠重用之前的代碼、之前的設(shè)計。這點對于架構(gòu)環(huán)境的依賴是最大的。(三)、安全指標安全:組織的運作過程中產(chǎn)生的數(shù)據(jù)都是具有商業(yè)價值的,保證數(shù)據(jù)的安全也是刻不容緩的一部分。以免出現(xiàn)XX門之類丑聞。加密、https等為普遍手段。六、常見架構(gòu)誤區(qū)●開高走落不到實處●遺漏關(guān)鍵性約束與非功能需求●為虛無的未來埋單而過度設(shè)計●過早做出關(guān)鍵性決策●客戶說啥就是啥成為傳話筒●埋頭干活兒缺乏前瞻性●架構(gòu)設(shè)計還要考慮系統(tǒng)可測性●架構(gòu)設(shè)計不要企圖一步到位誤區(qū)1——架構(gòu)專門由架構(gòu)師來做,業(yè)務(wù)開發(fā)人員無需關(guān)注架構(gòu)的再好,最終還是需要代碼來落地,并且組織越大這個落地的難度越大。不單單是系統(tǒng)架構(gòu),每個解決方案每個項目也由自己的架構(gòu),如分層、設(shè)計模式等。如果每一塊磚瓦不夠堅固,那么整個系統(tǒng)還是會由崩塌的風險。所謂“千里之堤,潰于蟻穴”。誤區(qū)2——架構(gòu)師確定了架構(gòu)藍圖之后任務(wù)就結(jié)束了架構(gòu)不是“空中樓閣”,最終還是要落地的,但是架構(gòu)師完全不去深入到第一線怎么知道“地”在哪?怎么才能落的穩(wěn)穩(wěn)當當。誤區(qū)3——不做出完美的架構(gòu)設(shè)計不開工世上沒有最好架構(gòu),只有最合適

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論