国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
架構(gòu)設(shè)計思維(一)
作者: 李偉山 
公眾號:技術(shù)方舟

架構(gòu)設(shè)計思維-分解

開篇我們先講兩個成語:『好高騖遠』和『高瞻遠矚』,如果一個人做一些不切實際的事情,我們稱之為好高騖遠;如果一個人有眼界視野,我們稱之為高瞻遠矚;同樣是高、遠,為何描述著兩種完全不同的人?因為前者的好、騖講的都是追求,而后者的瞻、矚,指的卻是具體的行動。當(dāng)我們把高遠的目標(biāo)只作為一種追求,而不付諸于實踐的時候,就是不切實際;當(dāng)我們把它變成“時時顧看”這樣的行動時,我們就漸漸地變得有眼界視野了。所以志存高遠并沒有錯,只是要切忌不務(wù)實?!爸塾诟哌h”這就是作為一個架構(gòu)師所需的基本修養(yǎng),而所有的架構(gòu)設(shè)計思維都是從這修養(yǎng)中汲取而來。

01

概述

所有的系統(tǒng)開發(fā)方法都要解決從需求到實踐的轉(zhuǎn)換問題,為了提高系統(tǒng)的質(zhì)量,前人提出了需求分析工程和各種建模技術(shù),但是在需求和設(shè)計之間還是很難逾越,也就是說缺乏能夠反映做決策的中間過程,于是系統(tǒng)架構(gòu)設(shè)計應(yīng)運而生。

對于架構(gòu)設(shè)計人們已經(jīng)提出了許多方法,分類為:工件驅(qū)動的方法;用例驅(qū)動的法;模式驅(qū)動的方法;領(lǐng)域驅(qū)動的方法。一個經(jīng)典的架構(gòu)設(shè)計過程模型,沿用了RUP中迭代增量的思想,由分析、描述、選擇、構(gòu)造和組合5個階段組成,如圖:

(有興趣的可以學(xué)習(xí)一下架構(gòu)設(shè)計的元模型來設(shè)計屬于自己領(lǐng)域或者產(chǎn)品線的設(shè)計過程模型,其實下面的模型也是元模型的實例化)

依據(jù)需求規(guī)格說明書分析出功能需求和架構(gòu)需求,通過用例和場景的描述,把需求分為關(guān)鍵的,次要的和可選的3類。關(guān)鍵需求決定架構(gòu),結(jié)合軟件架構(gòu)風(fēng)格和通用知識選擇最關(guān)鍵、影響最大的子系統(tǒng)分析設(shè)計并產(chǎn)生構(gòu)件。組合就是定義構(gòu)件接口,構(gòu)件作為一個封閉的功能實體,對外提供交互接口,并通過連接件將構(gòu)件連接起來形成最終的軟件架構(gòu)描述。5個階段是不斷迭代的過程,在每一次迭代中,都選取并實現(xiàn)一組用例和場景來確認(rèn)并完善架構(gòu)。

這個過程模型看似很流暢,但是,架構(gòu)師在設(shè)計時很難把握他的正確性和精準(zhǔn)性,而且用它架構(gòu)的系統(tǒng)是否對后續(xù)設(shè)計開發(fā)形成一種原則上的指導(dǎo)是很難說的。但是對于架構(gòu)師來說有些思路可以進行參考,大致將架構(gòu)思維可以分為:分解、集成、分離、復(fù)用、分層、模式、抽象、結(jié)構(gòu)化、迭代、勿做過度設(shè)計這幾部分,按照這個思維方式來設(shè)計系統(tǒng)架構(gòu)。

02

架構(gòu)設(shè)計思維-分解

分而治之是一種處理復(fù)雜問題的通用方法,在系統(tǒng)架構(gòu)中也是一種很重要的手段,例如多層架構(gòu)、OSI 七層模型都體現(xiàn)了分而治之思想。在架構(gòu)設(shè)計過程中,通過將關(guān)注點分離對架構(gòu)進行多層次分解,將系統(tǒng)層層分解為多個架構(gòu)元素,進而識別架構(gòu)元素。同時保證分解后的各個部分還能夠高內(nèi)聚,松耦合,最終又集成為一個完整的整體。分解核心是定義問題,因此架構(gòu)首先仍然需要理解清楚需求。

01

分解的作用

架構(gòu)分解是架構(gòu)師接到需求到完成架構(gòu)設(shè)計中最關(guān)鍵的一步,分解可以幫助架構(gòu)師了解需求中未呈現(xiàn)出來的隱性需求要素,分解也是架構(gòu)師解決非功能層面需求的重要手段,架構(gòu)要解決高性能、高可用、伸縮性、可擴展性等問題,針對這些問題,我們一般從幾個方面進行入手:

  1. 應(yīng)用層:按照功能或者微服務(wù)進行分解,將系統(tǒng)劃分未若干子系統(tǒng),低耦合存在,在業(yè)務(wù)角度可以將單個應(yīng)用獨立為應(yīng)用單元(應(yīng)用單元是無狀態(tài)的),這樣可以靈活地進行伸縮。
  2. 數(shù)據(jù)層:對數(shù)據(jù)庫進行垂直拆分按照子系統(tǒng)緯度進行分庫和水平拆分按照業(yè)務(wù)緯度進行分表;但是進行分庫分表中要避免分布式事務(wù),實在無法避免可利用消息系統(tǒng)來進行規(guī)避。
  3. 代碼結(jié)構(gòu)層:代碼層一般分為三層,從下至上分別為:數(shù)據(jù)訪問層、業(yè)務(wù)邏輯層(又或稱為領(lǐng)域?qū)樱?、表示層。這也是Java Web中重要的三層架構(gòu)中的三個層次。區(qū)分層次的目的即為了“高內(nèi)聚低耦合”的思想。

02

分解的原則

01

業(yè)務(wù)原則

  1. 單一責(zé)任原則:對于一個微服務(wù)而言,具有有限的業(yè)務(wù)范圍,可以幫助我們滿足服務(wù)開發(fā)和交付的敏捷性;
  2. 適當(dāng)?shù)倪吔纾宏P(guān)注微服務(wù)的功能范圍,一個服務(wù)的大小應(yīng)該等于滿足某個特定業(yè)務(wù)能力所需要的大?。?/li>
  3. 業(yè)務(wù)分層: 從整體規(guī)劃上把業(yè)務(wù)分層,形成單向依賴,避免微服務(wù)之間的網(wǎng)狀依賴關(guān)系;
  4. 顆粒度遞增:設(shè)計初期先把業(yè)務(wù)劃分到盡可能細(xì),然后依據(jù)其它原則合并到適當(dāng)顆粒度;
  5. 非唯一依賴:至少被2個以上其它微服務(wù)依賴的功能模塊,才有必要獨立成一個微服務(wù)。

02

技術(shù)原則

  1. 部署獨立性:能獨立于其它微服務(wù)部署,一個微服務(wù)故障不影響其它微服務(wù);
  2. 動態(tài)擴展:每個微服務(wù)都可以動態(tài)的進行x軸和z軸的擴展,并適應(yīng)云環(huán)境下的自動化部署;( 參考這里 )
  3. 領(lǐng)域和應(yīng)用解耦:提供數(shù)據(jù)操作能力的領(lǐng)域服務(wù)和執(zhí)行業(yè)務(wù)邏輯的應(yīng)用服務(wù)解耦;
  4. 避免產(chǎn)生頻繁的跨庫查詢;
  5. 避免產(chǎn)生頻繁的分布式事務(wù)。

03

治理原則

  1. 在業(yè)務(wù)分層的基礎(chǔ)上,根據(jù)業(yè)務(wù)細(xì)分規(guī)則,對微服務(wù)分組;
  2. 各個分組之間通過API網(wǎng)關(guān)集成;
  3. 通過API網(wǎng)關(guān)實現(xiàn)級輕量級消息路由,鑒權(quán);
  4. 運行時管理,如服務(wù)降級,限流,監(jiān)控等可在API網(wǎng)關(guān)實現(xiàn),讓微服務(wù)功能純粹;
  5. 避免通過數(shù)據(jù)庫集成;
  6. 避免部署多個版本來兼容。

電商架構(gòu)設(shè)計模型

03

分解的過程

面對一個系統(tǒng),特別是前人沒有做過的新系統(tǒng),通常難以一下子設(shè)計出合適的架構(gòu)。在架構(gòu)設(shè)計的初期,通常都要經(jīng)歷一個不斷探索的階段。在架構(gòu)設(shè)計過程中,架構(gòu)分解是必不可少的的關(guān)鍵步驟。如何進行架構(gòu)分解?從哪里入手開始進行分解?我們需要有一個架構(gòu)分解的過程模型來指導(dǎo)分解過程,啟發(fā)和探索架構(gòu)分解的維度和線索,提高架構(gòu)分解的效率。

架構(gòu)分解過程如下圖所示,是一個迭代的模型。通過這個迭代的分解,從無到有、從粗到細(xì)、從模糊到清晰,一步步精(細(xì))化、豐富架構(gòu)。迭代的過程也是一個否定之否定的過程,隨著分解的逐步推進或系統(tǒng)的架構(gòu)演化,后面的分解除了會識別出隱性需求,也可能會對先前識別出的架構(gòu)作出調(diào)整。

依次從 4 個域中進行架構(gòu)分解,基本順序是先業(yè)務(wù)后技術(shù),通過多維度多層次的分解將關(guān)注點分離。

  • 業(yè)務(wù)需求分解:先從業(yè)務(wù)需求進行分解,一般業(yè)務(wù)需求來源有幾個方面:1、一線業(yè)務(wù)員;2、產(chǎn)品優(yōu)化;3、公司戰(zhàn)略目標(biāo);4、技術(shù)要求。

首先是從業(yè)務(wù)需求入手,尋找業(yè)務(wù)需求中的分解維度,將架構(gòu)從業(yè)務(wù)需求層面進行大粒度的分解。在業(yè)務(wù)域中進行分解,通常采用的分解維度是根據(jù)業(yè)務(wù)主題,將系統(tǒng)分解為多個子系統(tǒng),每個子系統(tǒng)聚焦于一個獨立的業(yè)務(wù)主題,子系統(tǒng)間具有清晰的邊界。例如對某電商系統(tǒng),我們可以根據(jù)業(yè)務(wù)需求維度進行架構(gòu)分解,初步劃分出:訂單系統(tǒng)、用戶中心、購物車系統(tǒng)、搜索系統(tǒng)、廣告系統(tǒng)、庫存系統(tǒng)、物流系統(tǒng)、商品中心、支付系統(tǒng)等模塊。

對業(yè)務(wù)需求分解不應(yīng)只局限于基于業(yè)務(wù)需求的分解,根據(jù)具體情況,還可能有其他的分解維度。一個通用的發(fā)現(xiàn)分解維度的方法是試著從領(lǐng)域模型和需求分析文檔中尋找名詞和形容詞,將文檔中的核心概念(名詞和形容詞)作為分解的候選分解維度或分解線索。

業(yè)務(wù)需求的分解中,我們要和產(chǎn)品經(jīng)理密切交流,適當(dāng)考慮企業(yè)戰(zhàn)略,這樣可在一定程度上保證架構(gòu)分解的合理性。

  • 業(yè)務(wù)功能需求分解:通過對業(yè)務(wù)流程和用例進行分析,根據(jù)功能職責(zé),進行垂直和水平分解,識別出業(yè)務(wù)功能或業(yè)務(wù)服務(wù),將它們歸類到子系統(tǒng)中相應(yīng)模塊中去。

對業(yè)務(wù)功能需求分解,一個通用的方法是試著通過動詞來將子系統(tǒng)拆分為多個服務(wù);另一個是根據(jù)資源類型(名詞)來將系統(tǒng)拆分為服務(wù),每個服務(wù)負(fù)責(zé)實現(xiàn)對應(yīng)資源上的一組操作。例如根據(jù)資源類型(用戶、商品等),對電商系統(tǒng),可分解識別出用戶查詢服務(wù)和用戶管理模塊、商品服務(wù)等。

  • 技術(shù)需求分解:是從技術(shù)角度對系統(tǒng)和模塊進行分解。在該階段,通常會選取關(guān)鍵的需求(包括功能需求和非功能性需求)和已分解出的模塊或子系統(tǒng),結(jié)合當(dāng)前的 IT 技術(shù)(技術(shù)框架、架構(gòu)模式、參考架構(gòu)、中間件、業(yè)務(wù)平臺)和架構(gòu)思想、架構(gòu)經(jīng)驗、開發(fā)人員的技能以及系統(tǒng)的上下文環(huán)境等,進一步進行架構(gòu)分解。

在技術(shù)需求分解中,對功能需求,橫切(分層)豎割是一種常用的分解手法。對非功能需求,可將性能、伸縮性、可用性等作為維度對系統(tǒng)進行分解,在非功能需求分解戰(zhàn)術(shù)中將專門說明這些維度的分解技術(shù)(稱為戰(zhàn)術(shù))。

在技術(shù)需求的分解中,對公共的技術(shù)需求應(yīng)全盤考慮,抽象出底層的公共技術(shù)基礎(chǔ)設(shè)施,例如定時任務(wù)在許多子系統(tǒng)中都存在,此時可能會規(guī)劃一個定時任務(wù)框架和定時任務(wù)執(zhí)行系統(tǒng)。也可能會采用一些成熟的框架和中間件技術(shù),如消息中間件、RPC 等。

技術(shù)需求分解通常是比較復(fù)雜的,這一方面來源于問題域的本質(zhì)復(fù)雜性,特別是各種非功能性需求的復(fù)雜性,需要架構(gòu)師掌握應(yīng)對這些需求的常見模式。另一方面也是由于 互聯(lián)網(wǎng)技術(shù)的日新月異,要求架構(gòu)師對技術(shù)敏感,與時俱進。要注意的是,當(dāng)在技術(shù)域分解中碰到困難時,可以再回到業(yè)務(wù)域中去尋找答案和線索。

  • 架構(gòu)需求分解:全面考慮各類涉眾在架構(gòu)層面的關(guān)鍵需求,特別是非功能需求,例如性能需求、可伸縮性需求等,進一步對系統(tǒng)進行分解。

架構(gòu)需求分解包括了前面說的業(yè)務(wù)需求分解、業(yè)務(wù)功能需求分解、技術(shù)需求分解,通常架構(gòu)需求分解和它們有部分是重疊的,例如在技術(shù)需求和架構(gòu)需求中都有性能方面的架構(gòu)分解。架構(gòu)需求分解保證我們的分解是完備的,沒有遺漏。

04

分解緯度

架構(gòu)分解就是從多個維度多層次對系統(tǒng)進行分解,識別出架構(gòu)元素,逐步精化、豐富系統(tǒng)架構(gòu)的過程。從上面可以總結(jié)出,緯度大致有,業(yè)務(wù)緯度、業(yè)務(wù)功能緯度、技術(shù)緯度,涉眾緯度。

根據(jù)具體的系統(tǒng),還可發(fā)掘出許多分解維度,如時間維度、物理空間維度、優(yōu)先級維度、職責(zé)角色維度(不同的角色)、客戶端維度、調(diào)用方維度(不同的調(diào)用方)、請求類型維度、數(shù)據(jù)維度、數(shù)據(jù)處理維度。緯度就看架構(gòu)師對于需求的理解程度多深刻。

05

分解戰(zhàn)術(shù)

將在架構(gòu)層面應(yīng)對非功能需求特性的架構(gòu)模式或架構(gòu)策略稱為戰(zhàn)術(shù),例如對可用性,常用的戰(zhàn)術(shù)包括:冗余、錯誤檢測。

06

分解的粒度

多維度多層次分解到什么粒度才停止?這個沒有統(tǒng)一的標(biāo)準(zhǔn),通常要能進行并行開發(fā),能指導(dǎo)后續(xù)的詳細(xì)設(shè)計。需要根據(jù)具體的產(chǎn)品或項目來定,有的到模塊級別就行,對關(guān)鍵的部分,可以到類級別。

07

分解的時機

架構(gòu)分解的時機通常就是架構(gòu)改造演化的時機。當(dāng)架構(gòu)出現(xiàn)腐化和臭味,已經(jīng)難以滿足關(guān)鍵涉眾的關(guān)鍵需求,例如用戶的響應(yīng)速度越來越慢已經(jīng)接近臨界值,并且根據(jù)預(yù)見,響應(yīng)速度還有可能繼續(xù)較低;開發(fā)人員越來越難以維護,這個時候可以考慮進行架構(gòu)演化,對架構(gòu)進行改造。當(dāng)然如果能提前預(yù)見系統(tǒng)的問題,經(jīng)過慎重評估后,在問題發(fā)生之前,提前一段時間進行架構(gòu)演化也是可以的。

要注意的問題是不要過度分解,過早分解,這樣做除了增加成本,還可能帶來風(fēng)險。例如很多系統(tǒng)在建設(shè)初期,考慮到規(guī)模較小和快速上線,通常都是一個整體的系統(tǒng),不會進行大的架構(gòu)分解,以后隨著需求和規(guī)模的逐漸增加,會逐步進行架構(gòu)改造和架構(gòu)分解。

03

總結(jié)

分解作為架構(gòu)設(shè)計中關(guān)鍵的步驟,架構(gòu)分解沒有成熟的方法體系來指導(dǎo)架構(gòu)師,但是以上的過程和緯度可以作為一定的參考來進行架構(gòu)分解,架構(gòu)分解的關(guān)鍵點在于分解緯度和分解戰(zhàn)術(shù),希望能幫助架構(gòu)師們。后續(xù)我會繼續(xù)講解其他套路。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
架構(gòu)師,怎樣才能搞定上下游客戶?
對架構(gòu)設(shè)計的想法 -
從瀑布型開發(fā)到迭代型開發(fā)的轉(zhuǎn)變
學(xué)術(shù)特輯|帶你一起探索復(fù)雜系統(tǒng)的三種典型設(shè)計方法
什么才是真正的架構(gòu)設(shè)計?
多維度的軟件架構(gòu)分解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服