精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

微服務體系中的分層設計和領域劃分!

開發 架構
本文闡述了一種將分層設計和DDD領域設計思想應用于微服務體系架構的方案實踐,也是個人的最佳實踐。

 [[418024]]

 引言

看標題感覺這個東西很理論,比起“高并發、多線程”、“分布式CAP、一致性、Paxos”、“高可用SLA”等具體的干貨技術點,軟件體系知識顯得很“濕”,似乎人人都有自己的認識,但又很少有人能說完整,有一點可以確定的是,如果你未來需要獨立設計一個復雜的系統中臺,并使之未來能快速應對各種需求變化的話,科學合理的領域劃分和邊界界定需要我們“處女座級”的堅持下去,這對防止人力失控、減少項目爛尾很有幫助。合理的界定了邊界后,即便某個微服務很糟糕,也可以就輸入輸出以很少的人力投入進行重構,相反的就是牽一發而動全身,加上業務需求頻繁而來,很容易爛尾或是達不到如期的效果。

其實很多技術大神都是某一個技術點的好手,但可能在整體軟件體系上思考并不多,每個人都有自己的設計方法,大部分容易想到的設計方法處理一般的系統已經夠了,后面發生問題慢慢打補丁就行了,當我們面對各種需求變化陷入開發困境的時候我們就該想想了,咱們系統的體系設計上是否出了問題?

本文不打算涉及領域建模和設計模式等代碼級別的詳述,而是探討如何將一個復雜的大系統進行分層和拆分,這是設計一個優美系統的第一步,相信對各BU同事們快速搭建系統中臺也是很有參考意義的。文中的一些例子大家也可能遇到過,大家如果在開發中遇到困境,可以多來圈子交流和發表問題,大家一起學習進步。大概知道內容背景的可以直接跳到第3部分。想了解一個大項目如何進行科學人員安排的可以直接看5.4部分。如果你的組里還有人把數據庫模型當接口契約用,可以建議他看下5.1部分。假如你在開發過程中遇到一些別人的開發設計習慣,你覺得不是很好,但是又不知道如何說服他,都可以到評論區聊聊,大家一起討論討論。

1.摘要

本文闡述了一種將分層設計和DDD領域設計思想應用于微服務體系架構的方案實踐,也是個人的最佳實踐。對于大部分互聯網公司來說,我們主張將其Web服務架構分為五層:基礎設施層、領域服務層、應用服務層、網關層和用戶界面層(表示層)。

領域服務層和應用服務層均可以采用微服務設計進行拆分,其中領域服務層將按照DDD領域設計進行領域劃分,設計為一個個領域模塊微服務,每個微服務高度內聚,僅關注自己的業務,領域服務間通過接口調用進行松耦合。這種設計方案可以大大簡化大系統,并且在后期的維護中優勢會日漸凸顯,然而把大系統分而治之拆成微服務同時也對架構師和開發人員提出了更高的要求。

第2部分介紹了相關背景,接著第3部分探討了分層設計以及每一層的功能,第4部分結合微服務和DDD對領域服務層進行服務模塊劃分和設計。第5部分則就分層設計和DDD領域設計中常見的問題進行了整理。

2.背景介紹

想寫這樣一篇文章很久了,雖然本科學的是軟件工程,但礙于自己能力有限,從08年寫代碼以來一直斷斷續續的思考,始終對項目模塊設計和分層結構設計沒有一個可以讓自己覺得滿意且無糾結點的答案,假設了某個設計,很快在實踐中又會發現其存在著一些問題。直到2014年畢業工作了解了DDD領域驅動設計后,才有了相對清晰的方向。實際上早在2004年,Eric Envas的《領域驅動設計:軟件核心復雜性應對之道》就已出版,畢竟軟件開發自計算機普及以來已經存在很長一段時間了,早期國外程序員對軟件開發理論的研究也十分興盛,如今成熟后反而研究的相對少了,基本上依葫蘆畫瓢即可。

DDD領域驅動設計對軟件設計各個環節的人員都有較高的要求,用《領域驅動設計》一書的話來說它需要一個“領域驅動團隊”[1],它要求從分析階段,產品經理、項目經理、架構師以及開發工程師就使用統一的模型語言(Ubiquitous Language)來進行溝通,并且他們都懂一些代碼、產品和建模相關的知識,事實上這在國內很難實施,國內的產品經理約等于需求整理工,對其計算機基礎的要求是少之又少,在我所從事的公司里,也曾發生過產品經理直接指導開發,以至于后面雙方理解的同一個詞有著不同含義的情況。所以本文不打算去闡述DDD領域內部建模代碼級別的實踐,甚至本文并不認為貧血模型是不好的,本文主要探討領域之間的劃分和分層設計,正如引言說提到的,這是設計優美系統的第一步。另外提一句:其實合理設計的微服務體系中的服務本身就是功能單一邊界清晰的小應用,屆時貧血也好、DDD領域建模也好,其實都可以勝任。

近年來,隨著分布式的發展,傳統中小型機集中式服務器已經不在流行,所以微服務體系也成為了各大互聯網公司主流的選擇。直觀的感受下微服務和DDD兩者,似乎一個是微系統,另一個則是大系統的設計方法,似乎兩者天生互斥,微服務化的小系統也用不著DDD,其實并不是,DDD是針對整個復雜的軟件解決方案的一種科學設計方法,微服務化也是把復雜的大系統拆分為小系統,方便維護和管理,所以兩者都有一個特點——為復雜的大系統服務。下面咱們就來探討下,如何把DDD的領域設計和其主張的分層設計應用到微服務體系架構中。需要說明的是本文主要是個人多年來的一點總結,未必適合所有場景,有更好通用性更為廣泛的方案請不吝賜教。

3.分層設計

準確的說分層設計(Layered Architecture)跟DDD沒有必然的聯系,我最早接觸分層設計是在攜程網,當時內部使用的應該只是簡單的業務層(Biz)和表示層,數據庫訪問之類的也是放在各自的業務包下的。后來接觸和學習了《領域驅動設計:軟件核心復雜性應對之道》,書的第4章“分離領域”中說到了四層分層設計,即:基礎設施層、領域層、應用層和用戶界面層(表示層)。DDD產生的年代微服務還未流行,當時甚至基于瀏覽器的Web應用都比較少,更多的是PC軟件和EJB等網絡應用,所以作者更多的是想表達對復雜系統的邏輯分層,并不在意每個領域是單獨的系統還是一個軟件系統內不同的模塊。

所以為了跟其做區分,我們建議的四層為在其基礎上引入“服務”兩個字,即:基礎設施層、領域服務層、應用服務層和用戶界面層。這樣做的意圖是讓開發人員立刻可以了解到——每個領域模塊即一個微服務(一個領域可以對應一個或者多個模塊Module)。摘要中提到我們主張的分層體系中還有一個層,即網關層,這又是什么鬼呢。剛剛提到的DDD的時代背景,PC軟件系統或者企業內部使用的網絡應用系統是根本沒有網關層(有也是網絡網關設備)這一說的,而現如今互聯網公司產品的輸出形式無外乎Web應用(網站、或者網絡服務),并且為了更好的適配PC站和App,一般會采用前后端分離的應用設計方案,這時候會產生一個需求——內部網絡應用系統如何把自己的服務輸出到互聯網上,供外部系統或者瀏覽器網頁訪問。最直接的方式就是把應用層直接暴露在公網上,但我們不建議這么做,應用層服務更多的是關注業務應用,對網絡級的系統安全性(防DDOS、釣魚、跨域等)、請求監控等缺乏考慮,這些工作交給網關層統一管理會輕松很多(比如淘寶的TOP平臺)。

這時候我們在Web應用系統中引入網關層用于銜接表示層和應用層 ,因為這樣可以更好的劃分各層的職能。網關層也可以看作是應用服務層的對外包裝層。如果一定要把網關層做到應用服務層里理論上也是可行的,比如針對于Spring Cloud這種框架下的微服務體系,可以考慮直接暴露應用層,只需輔助一些運維手段進行統一的安全驗證和監控即可。假設我們選擇引入網關層,那么我們就得到了以下網絡應用系統分層體系:

其中,各層的職能和作用為[2]:

  •  用戶界面層:負責向用戶顯示和解釋用戶指令。這里指的用戶可以是另一個計算機系統,不一定是使用用戶界面的人(比如外部應用調用對應接口)。在全系統的視角看,通常情況下,這里指的是前端,但實際上,隨著前端的日益復雜,前端也可以分為多層,那種情況另當別論。
  •  網關層:負責提供對外的HTTP服務或者其他網絡應用層協議(這里是指OSI七層協議中的應用層,別混淆了哦)服務。該層從非業務邏輯角度對暴露到外部的接口進行鑒權、計費、風控、資源調配等操作。有些簡易的系統中,改成可以合并入應用服務層中作為一個AOP存在。
  •  應用服務層:定義軟件要完成的任務,并且指揮表達領域概念的對象來解決問題。這一層所負責的工作對業務來說意義重大,也是與其他系統的應用層進行交互的必要渠道。應用層要盡量簡單,不包含業務規則或者知識,而只為下一層中的領域對象協調任務,分配工作,使他們互相協作。它沒有反應業務情況的狀態,但是卻可以具有另外一種狀態,為用戶或者程序顯示某個任務的進度。
  •  領域服務層:負責表達業務概念,業務狀態信息以及業務規則。盡管保存業務狀態的技術細節是由基礎設施層實現的,但是反應業務情況的狀態是由本層控制并且使用的。領域層是業務軟件的核心。
  •  基礎設施層:為上面各層提供通用的技術能力,為應用層傳遞消息,為領域層提供持久化機制,為用戶界面層繪制屏幕組件(PS:這個在互聯網應用中幾乎用不到)等等。互聯網Web應用系統中基礎設施包含了數據持久化服務,中間件服務(數據庫,Redis,Memcached,zookeeper,ELK等等)以及第三方服務等。

各層除了實現自己的功能外,還需要遵守以下原則:

  1.  每一層設計保持內聚,并且只依賴于它的下方的層。
  2.  下層向上層發起的通信只能通過中間件等間接方式進行。[2]
  3.  上層和下層只能有松散耦合(各自為獨立個體,通過簡單引用關聯)。在某些微服務框架比如Dubbo中,可以把api包提供給上層引用即可。這也符合依賴倒置原則。

這里重點說明應用服務層和領域服務層之間的關系。舉一個我經常跟部門其他開發舉的一個例子:有一家上市企業A公司,靠賣水果發家,其首席架構師科學合理的按照DDD搭建了一套基于微服務體系的賣水果應用,其架構圖如下:

今年水果行情一般,而房地產十分火熱,A公司高層發現房地產帶動的五金行業也十分火熱,于是下達任務給技術部,要求其立即著手搭建五金銷售系統,貨源已經談好。得益于首席架構師之前優秀的架構設計,他發現只需要做一個賣五金的網站以及另外對微服務進行微量的調整即可滿足老板的需求——因為賣五金和賣水果并無本質區別,他們涉及的環節幾乎一致。加入五金售賣的系統架構圖如下:

可見應用服務層代表是某一個業務應用,它代表的更多的是從需求出發的應用定義,而領域服務層則是業務領域按照自身的邊界進行設計的一個高內聚的服務體。應用層通過協調和組合各個領域服務即可形成一個新的應用服務。《領域驅動設計》中明確指出,在設計領域服務時無需考慮表示層和持久層服務的東西。我在現實開發中總是遇到大量工程師按照產品的設計稿一溜煙的從上至下設計應用層服務和領域層服務,完全沒有考慮業務領域的概念,導致后面微服務數量膨脹,功能重復度高。這種開發習慣代表的是《領域驅動設計》作者極力吐槽的一種模式——SMART UI “反模式”[5]。

4.領域劃分和微服務化

根據DDD理論,領域建模主要發生在領域服務層,各領域模塊都應該是高內聚低耦合的,具有清晰的業務邊界。本文不打算討論具體的DDD建模(服務,工廠,倉庫,實體,值對象,聚合等),這需要對DDD有較深入的研究,就目前所從事過的公司來看,似乎沒有一家真正嚴格按照DDD進行項目代碼設計的,就像摘要中說的,這對整個軟件工程鏈路上的人員都有較高的要求。有機會可以單獨寫一篇關于自己對DDD建模的思考和建議,本文更多的是討論高視角下的領域服務拆分,從而搭建一個低耦合高內聚的微服務體系。如果一定要將微服務和DDD聯系起來的話,領域層的微服務就對應了DDD中的領域模塊Module,每個Module由多個Service模式對象以及對應的模型對象(實體, 值對象以及它們的聚合)組成。

從《領域驅動設計:軟件核心復雜性應對之道。》中我學到的主要有兩塊:領域設計思想和領域建模模式。本文更多的是對前者的運用,后者的對立模式是貧血模型,大家日常用到的也都是貧血模型,我也覺得貧血模型有存在的必要性,所以本文我們主要從其中借鑒一下領域設計思想。本文所描述的設計理念,并不影響具體的模型設計方法,我們仍然可以在每個微服務中使用DDD領域建模。

如何切分領域模塊并沒有一個明確的規則,不同的場景下可能相同的業務塊邊界也不盡相同。這里提幾點領域劃分的個人心得:

  •  領域設計一定要有清晰的功能邊界。一個領域服務對應了一個功能集合,這些功能一定是有一些共性的。比如,訂單服務,那么創建訂單、修改訂單、查詢訂單列表,一般是訂單域的功能集合。
  •  領域拆分并不是一步到位的,應當根據實際情況逐步展開。從單體應用到微服務體系的拆分過程能很好的說明這個問題,一上來拆的很細的改造方案一定會死的很慘。所以如果一開始不知道應該劃分多細,完全可以先粗粒度劃分,然后隨著需要,初步拆分。比如一個電商一開始索性可以拆分為商品服務和交易服務,一個負責展示商品,一個負責購買支付。隨后隨著交易服務越來越復雜,就可以逐步的拆分成訂單服務和支付服務。
  •  領域拆分并不是一成不變的,應當具體情況具體分析。2015年在大眾點評的時候,其訂單服務就拆分為了order-service和order-query-service,一來為了讀寫分離,二來order-query-service作為單獨應用可以按需水平擴容。
  •  領域可以是多個子領域的一個虛擬集合,換句話說多個微服務也可以形成一個大域,不必糾結于領域和微服務之間的數量對應關系。我們在做架構設計PPT的時候可能就把訂單域作為一個領域,代表了這個域就是關于訂單的,具體該有幾個微服務,這需要更細的詳細設計來提供。
  •  領域層服務設計應當是調用者無關的。這一點有點像第一點,但是它強調的是領域層服務的設計不應該受調用者的影響,這個觀點在《領域驅動設計:軟件核心復雜性應對之道》這本書里也可以找得到[4]。領域層服務開發和設計的理念是關注自己的域,一旦邊界劃分清楚了,開發所需要考慮的永遠都只是輸入和輸出,提供的服務一定是盡可能通用的,面向功能來開發的,而不是面向調用方來開發的。比如某個調用方提出了一個需求:調用方B希望A服務提供一個買汽車的接口,那么A服務設計的接口就應該是buyCar(),而不是buyCarForB()。

5.Q&A

5.1 能不能在所有層使用數據持久層模型,簡單快捷?

大家一定聽說過不同層的數據模型的叫法不同的概念,比如數據持久層的模型對象叫DBO(database object)或者DPO(data persistence object),領域層的模型對象叫DMO(Domain Model Object)或者就叫Model,數據傳輸層的模型對象叫DTO(Data Transfer Object)。那為啥要這么多模型呢,直接使用Mybatis等ORM框架生成DBO,然后一路吐給前端不是更爽(還真有同事嘗試立項寫Mybatis插件來實現這種所謂的代碼自動化)。我個人建議如果您真的是要搭建一個復雜的大系統,大平臺,一定不要偷這種懶,最好的就是做到”一層一模型”(網關層使用應用層模型即可)。各層之間采用手動的數據賦值(getter,setter)來完成,或者使用一些轉換框架來簡化轉換代碼,個人在用getter/setter時感覺并不會耽誤什么,在一個個set的時候,恰好可以對模型的字段細節進一步確認,并且拒絕使用BeanUtils.copyProperties()這種工具類,因為這樣的工具類會讓”一層一模型”形同虛設,開發會熱衷于把DPO拷貝到領域中換個名字以保證可以用拷貝工具。下面我們來細談下不能在每一層都是用數據持久層模型的具體原因:

  •  應用層對接網關層,是向面向C端或者調用者的一個數據出口,但是調用者只需要這個出口輸出用戶感興趣的數據,并且有些敏感數據不能吐出去。如果應用層(面向調用者)使用的仍然是數據庫模型,而開發人員沒有在應用層把無關值置空的話(相信我,需求一多,工作一忙,鬼才會在意這些細節),那么數據庫里的整條記錄就作為接口輸出吐出去了。比如訂單記錄,用戶訂單列表可能只需要訂單ID,商品名稱,訂單金額。而像商家結算價這種就不能吐出去,萬一被有心人察覺到了,用戶一定會投訴——你跟商家結算價200,賣給我400?
  •  前端或者接口調用方會很痛苦,一個接口契約多一兩個無關字段是沒關系的,但是一個契約里給的30個字段,我只用到5個,前端會罵娘的,我親眼見過這種事,設計原則里有個原則叫”迪米特法則”,也叫最小知識原則,接口設計也可以參考這個原則,盡量讓你的調用方知道盡可能少的信息點就能完成相關的任務。
  •  “一層一模型”本質是解耦模型依賴。我在上家公司做架構師時為了兼顧開發的感受,決定讓他們可以在領域層和基礎設施層都是用數據持久層模型,而只需要在應用層做數據控制(解決第一個問題),然而我的妥協也慢慢露出弊端,開發有時候覺得某個數據庫字段命名不合適修改之后,整個引用了該模型的微服務都需要修改,如果一層一模型的話,只需要關聯數據庫訪問的服務修改下DPO和DM的映射就行了,其他上層微服務都是依賴DM的。雖然我們不鼓勵隨意改動數據庫字段,但設計框架上最好能支持這種情況。

剛開始推廣”一層一模型”的時候,會有耍小聰明的開發去把下一層的模型POJO直接拷貝過來改個名字,然后用BeanUtils.copyProperties()完成賦值,這樣跟直接使用數據持久層模型就沒有區別了,所以要杜絕這種情況的發生。

5.2 為啥需要應用層,領域層微服務直接通過網關暴露不就行了嗎?

對于習慣了單體應用開發者來說,一個微服務很可能就直觀對應成了一個個垂直的應用服務,每個服務間的關系是這樣的:

其實這樣的體系本質上仍然不能解決軟件的復雜性,這只是把系統簡單粗暴的拆分了,耦合問題仍然很嚴重,甚至這很有可能比原來的單體應用更復雜(多對多依賴),如果使用微服務體系來處理復雜系統,其服務體系應當是這樣的:

這兩幅圖的區別在于,其實第一幅圖中的每個服務都包含了完整的2~3層,所以不再需要單獨的應用層。而第二幅圖各個領域模塊互相協作,對外提供服務時,則需要有一層直面用戶需求的應用層。Spring Boot 學習筆記,推薦學習下。

達成了微服務體系是解決復雜系統的出路之一這個共識后,我們再來看”應用層服務存在的必要性”有哪些理由:

  •  統一權限校驗:如上文所說,網關層只負責網絡級的安全防護,業務層的權限校驗則需要應用層來完成,試想一個沒有應用層的微服務體系,就意味著每一個微服務都需要加上權限校驗邏輯,這不僅編碼上困難(可以用過濾器,AOP),而且對于成千上萬個微服務(據了解,騰訊目前微服務數量已經超過2萬,大眾點評有將近千個微服務)來說,這會浪費大量時間,調用鏈越長,浪費的時間越多。換句話說,微服務體系有一個不突出但是很重要的特征—— 領域間環境安全,領域間的通信應當是可信的 ,否則分布式的缺點(多服務意味著多次通信)會被加劇。
  •  業務數據網關:舉個例子,一個order-service提供了一個queryOrder的接口,輸入起始日期查詢對應的訂單列表,其有2個消費者:C端網站應用服務 和 報表應用服務 ,C端網站應用服務 只需要知道訂單的基本信息如下單時間、商品名稱、金額就可以了,而報表應用服務是給管理者看的,需要的訂單數據很全,除了C端網站應用服務需要的之外,還需要看平臺與商家的結算金額。根據第4部分最后一點的思路,我們肯定不能為調用方寫定制接口(寫不完的,有的要這個數據,有的要那個數據,每次新增調用方,領域服務還得找人修改)。而如果我們統一使用的全量數據,并且沒有應用層(同樣的也沒有應用層模型DTO了),那么很可能我們吐出去的數據包含了我們與商家的結算價,這會引發很多不必要的麻煩的。所以應用層還充當了業務數據網關的作用,應用層應用服務需要保證僅吐出調用方感興趣的數據。
  •  資源控制和緩存:想象一下雙十一高并發的情況,如果查詢庫存每次都查庫是多么恐怖的一件事。所以一般僅在支付的時候做一次庫存校驗,而在商品展示時查緩存的庫存即可。那么問題來了,如果沒有應用層,緩存直接放在庫存微服務上是否可行呢?首先這會入侵庫存領域,庫存微服務需要按照調用方的需求做特定時間的緩存,而不是自己想緩存多久就多久,我想庫存微服務的開發者也會很不滿的,他會提出,讓你自己去做緩存。他的方案是科學的,因為還有一些其他服務可能需要實時的數據。這時候就需要有一層來做對其下方微服務返回的數據按照應用自身的需求進行必要的緩存,而不是把這些需求都推給資源提供方,想象一下一個資源提供方有多少需求者,每個需求方都有自己的定制需求,該多痛苦。當然這一點也不是說微服務自身不能做緩存,微服務自身的緩存一定是考慮自身域的合理性后的一個措施(比如訂單查詢服務會做一個500ms的緩存,因為不會有正常人500ms里點兩次查詢還必須要求兩次都是最新的),而不是由調用方來決定的。
  •  資源聚合和加工:其實第2點也有加工的味道在里面,只是這里更多的是描述應用層應用根據自身需求來對下層返回的數據進行聚合和處理的過程。舉個例子就能很好的說明這一點:任何APP都有首頁,而首頁的數據可能是五花八門的,可以有用戶昵稱、最近下的訂單簡要信息、最近支出曲線、積分信息等。這4個信息可以來自4個領域微服務,他們是:用戶中心、訂單中心、支付中心和積分中心。那么有讀者會說,直接暴露微服務讓前端分別調用4個接口再做聚合不是也行嗎?顯然這種粗暴的方式是極其不合理的,會額外增加廣域網網絡調用3次不說,還傳輸了很多不必要的信息。
  •  應用隔離和流控:如果將每個領域服務直接暴露到網關層對外提供服務,那么在多應用場景下,多個應用間是共享這些服務能力的,在服務降級的時候,如果需要按照應用進行降級(比如將優先級不高的應用進行限流),就很難實現。但如果每個應用對應了一個應用層服務,只需要對其暴露的網關接口進行統一限流就行了,或者在應用層做一個開關,將其流量阻止在應用層,而不是拖垮整個領域服務。舉個例子,假如我們的平臺不僅有自己的網站服務,還有第三方的對接服務,如果某個第三方被攻擊而我們直接將領域服務暴露了出去,那么我們就需要在各個領域層服務里去編寫對應的開關,這將侵入領域層服務,導致不必要的耦合。而有了應用層這些都不是問題,因為應用層充當了一個調度者的角色,調度者可以很輕松的決定是否調度下層的服務。

為了加深對應用層的理解,我們舉個代碼的例子,假如我們寫一個很簡單的首頁應用: 

  1. Response getHomeData(Request request){  
  2.     String nickName = userService.getNickName(request.getUserId());   
  3.     OrderInfo orderInfo = orderService.queryLatestOrder(request.getUserId());  
  4.     CostTrend costTrend = payService.queryCostTrend(request.getUserId());  
  5.     Integer points = pointService.queryAvailablePoints(request.getUserId());  
  6.     return new Response(nickName, orderInfo, costTrend, points);  

這里的4個服務類實例userService,orderService、payService和pointService如果都是本地的方法,那么這就是一個單體應用,而微服務化后這4個可能都是微服務了,但是應用層應用的結構還是可以不用變化(現在很多的RPC框架都做到了與調用本地方法無差別)。這就是應用層的位置所在。另外,微服務系列面試題和答案全部整理好了,微信搜索Java技術棧,在后臺發送:面試,可以在線閱讀。

5.3 什么是反模式?

這里的反模式是指《領域驅動設計:軟件核心復雜性應對之道》這本書里提到的與DDD相違背的模式,也是Eric極其反對的一種模式,即SmartUI模式(注意反模式不等于SmartUI,只是在本書中作為一個反模式的例子而已),這是一種什么樣的模式呢,其實我很早之前做C++ Builder(和Delphi很像)的時候還不知道,C++ Builder就是一種SmartUI模式。但其實SmartUI并沒有錯,對于小規模的PC本地應用開發來說也是有很多好處的。舉個例子,C++ Builder中在窗體上添加一個按鈕,然后雙擊按鈕添加事件,這樣就跟實際操作的時候有機的結合了起來。

換句話說就是使用界面驅動業務開發。在大型系統的開發上,這種模式是害人精,我很理解Eric為啥這么討厭它。曾有一次我帶領著一個團隊做封閉式開發,在過完產品需求后,家里出了點事我請了幾天假,回來后發現產品經理竟然指揮讓開發按照UI原型來設計數據庫,我審核的時候發現這些開發設計的表有極其多的冗余,而有一些重要的過程變量值卻沒有考慮到。比如他們會為每個頁面建幾個表,這顯然是行不通的,科學的方法是拆分領域,每個領域自己建立自己的表。UI只是應用層整合了各領域服務的數據并且處理后輸出的一種展示。

5.4 分層設計的開發步驟是怎樣的?

假設我們以一個標準的SaaS項目為主,也就是表示層是前端頁面(可以是APP,H5,M站,小程序,PC站等),那么高效的一種開發步驟可以是這樣的:

  1.  業務、產品、開發PM進行需求評審(可行性等)
  2.  產品準備好原型
  3.  產品、開發(前后端)、架構師(或有架構師能力的資深開發)開會過PRD,了解要做什么
  4.  架構師開始設計領域(資深架構師一下午就能搞定),前端開始切圖,應用層開發開始按照UI和PRD設計前端每個頁面使用的Restful接口(比如直接Springfox代碼生成Swagger)
  5.  架構師設計完領域后分工給領域層開發,進行領域邊界明確,然后領域層開發開始設計數據庫表等。
  6.  這樣前后端開發就同時開工了。
  7.   開發初步完成后,自測加連調。
  8.  后續就是測試發布了。

具體階段和時間線可以參考下圖:

6.結語

真實技術開發日常討論的經常是高并發、多線程、大數據,分布式、RPC,很少有人討論軟件架構設計方面的,架構師文化不應該只是對某個技術點的深入挖掘,也應該多討論些大型軟件設計理念方面的。  

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2021-04-06 09:43:41

微服務架構數據

2023-07-04 15:00:47

微服務架構開發

2022-12-16 09:29:23

攜程微服務

2022-08-08 10:09:58

服務網格架構

2021-12-07 22:59:59

Java框架微服務

2009-11-23 12:39:26

2012-12-20 17:40:37

2012-12-21 10:52:12

2020-10-20 10:46:10

DevOps運維體系

2014-05-09 14:30:03

思科人才培養思科

2023-01-29 09:06:24

微服務劃分關聯

2015-11-19 17:21:12

2018-01-10 14:22:05

2020-12-01 12:08:45

微服務架構DOMA

2017-10-24 15:25:46

微服務架構.識別

2022-04-25 10:44:08

微服務架構設計

2024-12-31 11:05:07

2024-07-26 08:00:00

2012-12-28 16:30:05

IT運維服務企業

2021-12-01 07:26:13

領域驅動建模
點贊
收藏

51CTO技術棧公眾號

国产精品高潮呻吟久久av无限| 日韩限制级电影在线观看| 欧美日韩综合网| 黄色av一区二区| 成人影视亚洲图片在线| 欧美三级欧美一级| 91大学生片黄在线观看| 天天插天天干天天操| 国产日韩欧美| 日韩中文字在线| 完美搭档在线观看| 亚洲精品粉嫩美女一区| 亚洲欧美国产三级| 久久伦理网站| 国产精品无码一区二区桃花视频| 国产欧美二区| www.美女亚洲精品| 在线天堂www在线国语对白| 97精品国产99久久久久久免费| 亚洲美女免费在线| 日本一区网站| 免费av一级片| 老司机精品视频在线| 性色av一区二区三区免费| 999久久久国产| 色先锋久久影院av| 日韩欧美的一区| 少妇一级淫免费放| 蜜桃视频动漫在线播放| 亚洲欧洲精品一区二区三区| 免费在线一区二区| 亚洲精品久久久久久动漫器材一区| 日本欧美在线看| 4438全国成人免费| 精品无码黑人又粗又大又长| 日韩精品免费一区二区三区| 亚洲欧美日本另类| 国产一卡二卡三卡四卡| 91丨精品丨国产| 欧美在线观看一区二区| 各处沟厕大尺度偷拍女厕嘘嘘| 九九热最新地址| 操欧美女人视频| 欧美精品自拍偷拍| 亚洲福利精品视频| 久久精品女人天堂av免费观看 | 亚洲五码中文字幕| 在线成人性视频| 超碰在线国产| 久久久久久久久99精品| 精品久久久久久一区二区里番| 99在线精品视频免费观看20| 卡一卡二国产精品| 国产精品美女在线观看| 欧美日韩a v| 久久久一二三| 日韩av片永久免费网站| 五月婷婷亚洲综合| 国产婷婷精品| 78色国产精品| 久久国产黄色片| 夜夜爽av福利精品导航| 国内揄拍国内精品| 日韩黄色在线视频| av成人天堂| 51精品在线观看| 中文字幕激情小说| 天堂影院一区二区| 国产精品久久久久久久app| 日韩av免费播放| 青青草国产精品97视觉盛宴| 国产精品美女久久久久av超清| 国内av在线播放| 久久精品国产**网站演员| 国产日产亚洲精品| 99国产揄拍国产精品| 国产盗摄视频一区二区三区| 国产精品免费一区二区三区四区| 天天色天天操天天射| 972aa.com艺术欧美| 免费h精品视频在线播放| 韩国三级在线观看久| 欧美国产精品一区二区| 欧美aaa在线观看| 欧美xxxbbb| 色综合天天综合色综合av| 国产野外作爱视频播放| 高清不卡一区| 亚洲国产精品成人va在线观看| 一起草在线视频| 精品成av人一区二区三区| 色多多国产成人永久免费网站| 在线看的片片片免费| 亚洲第一网站| 国产精品视频xxxx| 成人午夜免费在线观看| 久久久一区二区三区捆绑**| 中文字幕一区二区三区精彩视频| 污网站在线免费看| 色哟哟一区二区三区| 久久精品亚洲天堂| 日韩伦理一区二区三区| 中文字幕国内精品| 国产精品成人aaaa在线| 日本视频一区二区三区| 国产精品一区二区三区精品| 东热在线免费视频| 亚洲一线二线三线视频| 婷婷激情四射五月天| swag国产精品一区二区| 中文字幕在线观看日韩| 日产亚洲一区二区三区| 久久精品99久久久| 免费国产在线精品一区二区三区| 国产网友自拍视频导航网站在线观看 | 国产日韩亚洲欧美| 91久久偷偷做嫩草影院| 亚洲网站免费观看| 97se亚洲国产综合自在线观| www.黄色网址.com| 成人日韩在线观看| 亚洲国产精品视频在线观看| 老司机精品免费视频| 国产精品久久777777毛茸茸 | av资源免费观看| 国产精品乡下勾搭老头1| 欧美一区二区三区在线免费观看| v天堂福利视频在线观看| 在线视频国产一区| 国产中文字幕一区二区| 亚洲视频精品| 91丝袜脚交足在线播放| 98在线视频| 欧美性生交xxxxx久久久| 亚洲熟妇一区二区| 影音先锋日韩精品| 成人精品久久久| 成年人视频网站在线| 狠狠色香婷婷久久亚洲精品| 永久免费未满蜜桃| 欧美精品三区| 91午夜在线播放| 欧美一级片在线免费观看| 伊人色综合一区二区三区影院视频| 91精品一区二区三区在线观看| 中文字幕成人动漫| 免费视频一区| 久久影院理伦片| 欧美另类老肥妇| 亚洲国产精品悠悠久久琪琪 | 欧美电影一区| 国产精品成人一区二区| 免费a级毛片在线观看| 欧美视频13p| 风间由美一二三区av片| 一本久道综合久久精品| 久久久综合亚洲91久久98| 手机在线理论片| 亚洲男人天堂网站| 免费又黄又爽又猛大片午夜| 国产亚洲制服色| 国产精品入口免费软件| 国语对白永久免费| 捆绑调教美女网站视频一区| 一区二区三区|亚洲午夜| 久久电影天堂| 久久五月天综合| 性猛交xxxx乱大交孕妇印度| 亚洲综合一区二区三区| japanese在线观看| 久久国产66| 日韩hmxxxx| 日本亚洲欧洲无免费码在线| 亚洲色图50p| 正在播放木下凛凛xv99| 亚洲视频1区2区| av在线天堂网| 亚洲在线国产日韩欧美| 日韩精品成人一区二区在线观看| 久久青草视频| 色综合视频网站| 神马亚洲视频| 欧美日韩国产a| 欧美成人精品一区二区免费看片 | 国产精品久久久久久久久久新婚 | 九九热最新视频//这里只有精品 | 第四色中文综合网| 97激碰免费视频| av在线播放免费| 日韩一卡二卡三卡四卡| 欧美日韩综合在线观看| 国产区在线观看成人精品| 国产精品久久久久久久99| 亚洲精品免费观看| 一区二区免费在线视频| 久久久久久久久久久久久久久久久久久久| 欧美在线性爱视频| 成人黄色网址| 亚洲人成在线观看| 国产精品久久久久久久久久久久久久久久久久 | 爽爽爽在线观看| 国产精品多人| 三区精品视频观看| 超碰精品在线| 国产精品视频久久久久| 国产传媒在线| 久久久成人精品| 久久这里精品| 欧美mv和日韩mv国产网站| 波多野结衣一本一道| 一区二区三区国产| 永久免费av无码网站性色av| 国产91丝袜在线播放九色| www.xxx亚洲| 亚洲二区免费| 在线无限看免费粉色视频| 特黄特色欧美大片| 成人在线观看91| 国产成人精品一区二区三区免费| 91国产美女在线观看| 91小视频xxxx网站在线| 在线视频一区二区| 青青久草在线| 亚洲白拍色综合图区| 国产视频一二三四区| 欧美视频一区二区三区在线观看| 精品成人免费视频| 亚洲一区二区三区激情| 国精产品久拍自产在线网站| 久久精品夜色噜噜亚洲aⅴ| 亚洲男女在线观看| 国产sm精品调教视频网站| 蜜臀一区二区三区精品免费视频| 性xx色xx综合久久久xx| 日本免费a视频| 91精品蜜臀一区二区三区在线| 日韩免费电影一区二区| 美女网站一区| 裸模一区二区三区免费| 国产精品调教| 好吊色欧美一区二区三区四区 | 2021久久国产精品不只是精品| 九九九久久久久久久| 久久爱www久久做| www.亚洲高清| 日韩精品一二三区| 日韩有码免费视频| 久久精品人人| 777米奇影视第四色| 国产日韩一区| jizzjizz国产精品喷水| 亚洲精品三级| 国产免费黄色av| 国产日韩欧美| 少妇人妻互换不带套| 日日摸夜夜添夜夜添精品视频 | 免费在线观看一区二区三区| 日本成人黄色网| 青草国产精品久久久久久| 中文字幕在线导航| 久久国产尿小便嘘嘘| 九九九九九九九九| 国产成人av一区二区| 国产白袜脚足j棉袜在线观看| 成人国产精品免费网站| 黑丝av在线播放| 国产无人区一区二区三区| 超碰97av在线| 亚洲伦在线观看| 国产污视频在线看| 欧美性极品xxxx做受| 综合网在线观看| 欧美视频自拍偷拍| 国产视频在线一区| 亚洲国产精久久久久久| 国产私拍精品| 久青草国产97香蕉在线视频| av影院在线| 国产精品igao视频| 国产精品一区二区精品视频观看| 99久久综合狠狠综合久久止| 久久久久影视| 亚洲一区二区精品在线| 国内精品美女在线观看| 日韩精品一区二区三区色欲av| 免费av网站大全久久| 欧美性猛交xx| 久久先锋资源网| 欧美激情精品久久久久久免费| 亚洲香肠在线观看| 无码人妻久久一区二区三区 | 2020久久国产精品| 日韩成人综合网| 国产一区二区三区黄| 国产蜜臀一区二区打屁股调教| 欧美性猛交xxxx乱大交3| av手机天堂网| 欧美电影精品一区二区| 激情小视频在线观看| 欧美日韩高清在线观看| 亚洲伦理影院| 国产精品久久久久久久小唯西川 | 自拍偷拍视频在线| av成人毛片| 午夜xxxxx| 国产亚洲欧美中文| 久久久全国免费视频| 欧美亚洲日本国产| 熟妇高潮一区二区高潮| 日韩有码在线观看| 成人一区福利| 国产精品swag| 伊人久久大香线蕉精品组织观看| 欧美一级黄色影院| 成人美女在线观看| 国产精品嫩草影院俄罗斯 | 中文字幕在线日亚洲9| 亚洲黄页网在线观看| 国产激情在线| 国产精品视频播放| 国产成人影院| 青青青国产在线观看| 国产精品99久久久| 免费成人深夜蜜桃视频| 色婷婷久久久综合中文字幕 | 国产不卡视频在线播放| 日韩欧美视频免费观看| 在线免费观看日本一区| 婷婷色在线视频| 欧美激情视频给我| 精品伊人久久| 小说区视频区图片区| 蜜臀91精品一区二区三区| 免费污网站在线观看| 欧美视频中文在线看| 四虎精品一区二区三区| 欧美精品电影免费在线观看| 国产精品久久免费视频 | 激情综合激情| japan高清日本乱xxxxx| 亚洲天堂中文字幕| 一级做a爰片久久毛片16| 一区二区三区www| 日韩网站中文字幕| 日本日本精品二区免费| 久久午夜精品一区二区| xxxx日本免费| 在线免费av一区| 91看片在线观看| 国产美女主播一区| 国产精品二区不卡| 日本在线观看视频一区| 亚洲人成网站色在线观看| 国产又色又爽又黄又免费| xxxxx成人.com| 亚洲精品三区| www.18av.com| 国产成人精品三级高清久久91| 国产精品视频1区| 蜜桃国内精品久久久久软件9| 久久久999视频| 国产偷国产偷精品高清尤物| 懂色av蜜臀av粉嫩av喷吹| 中文字幕国内精品| 精品国产亚洲一区二区三区在线 | 麻豆网在线观看| 91av一区二区三区| 伊人影院久久| 99久久久久久久久久| 在线观看成人小视频| 五月香视频在线观看| av成人午夜| 9久re热视频在线精品| 免费黄色片网站| 欧美一区二区精美| 国产污视频在线播放| 视频一区免费观看| 国产一区二区三区免费| 日本五十熟hd丰满| 国产亚洲一区二区在线| 国产成人久久精品一区二区三区| 日韩小视频网站| 久久精品欧美日韩精品| 国产农村妇女毛片精品| 午夜精品福利视频| 成人av二区| 免费在线观看日韩av| 欧美性少妇18aaaa视频| 超碰在线免费播放| 久久久久网址| 狠狠色狠狠色合久久伊人| 黄网在线观看视频| www.欧美精品一二三区| 极品国产人妖chinesets亚洲人妖| 日韩一级理论片| 亚洲一区二区三区自拍| 国产精品天堂| 豆国产97在线| 久久国产精品露脸对白| 在线看成人av|