閱讀《clean architecture》也花了較長的時間,大體也瞭解到整潔的架構要作到如下兩點:前端
但感受並無對架構設計給出可行的參考。java
在《clean architecture》的第34章 「The Missing Chapter」(由 Simon Brown 編寫)給出了一個具體的案例,用四種架構設計來實現一個 「online book store」。程序員
package by layer web
這是最多見的方案,從前日後分爲:前端、後臺(business logic)、持久化DB。數據庫
優勢是:簡單、容易上手,符合大多數公司的組織架構。後端
存在的問題:網絡
PACKAGE BY FEATURE架構
垂直切分方案,全部的java代碼都放在一個package裏面併發
好處在於凸顯domain conceptapp
PORTS AND ADAPTERS
clean architecture這本書推薦的方案, 外層依賴於內層的domain
PACKAGE BY COMPONENT
本章做者 Simon Brown 提出的方案,service-centric view,將全部相關的職責打包稱一個粗粒度的Jar包
bundling all of the responsibilities related to a single coarse-grained component into a single Java package
看起來相似如今微服務的部署方式
對於以上四種結構,依賴關係看起來是這樣的
值得注意的是
Orders
而不是OrdersRepository
本章的做者最後還指出:++無論架構怎麼設計,粗心的implementation均可能違背最初的設計;依賴編譯器來保證架構的一以貫之,而不是自我約束或者過後檢查。++
看完了clean architecture後,在網上搜索架構設計相關的書籍,發現了software architecture patterns這本小冊子,篇幅很短,稱不上book,而是一個report。
software architecture patterns 指出缺少架構設計的軟件每每高度耦合,難以改變。所以,這本小冊子的目標就是介紹經常使用架構模式的特色、優勢、缺點,幫助咱們針對特定的業務需求作出合適的選擇。
分層架構也稱爲n-tire architecture,這是最爲常見的一種架構模式,通常從前日後分爲四層:presentation, business, persistence, and database。以下圖所示:
分層架構通常是一個新系統的最佳首選,由於其完美匹配傳統IT公司組織架構:通常的公司招人都是前端、後端、數據庫。
分層架構的優勢在於關注點隔離(separation of concerns),每一層作好本身這一層的職責,並向上一層提供服務便可,最爲經典的案例就是七層網絡模型,這有利於開發、測試、管理與維護。
分層架構中,須要注意的是兩個概念:closed layer、open layer
closed layer的核心就是不要越層訪問,好比在上圖中,Presentation Layer就不該該跨國Business Layer直接去Persistence Layer訪問數據。
A closed layer means that as a request moves from layer to layer, it must go through the layer right below it to get to the next layer below that one
closed layer保證了層隔離( layers of isolation),使得某一層的修改影響的範圍儘量小,比較可控。但closed layer有時候也會帶來一個問題:architecture sinkhole anti pattern(污水池反模式),具體是指,爲了查簡單數據,層層轉發請求。好比爲了在展現層顯示玩家的某個數據,須要經過業務層、再到持久化層、再到DB層;取到數據再一層層傳遞回來,在這個過程當中,業務層並無對數據有邏輯上的處理。
顯示,污水池反模式衝擊了closed layer的美好想法。如何衡量這種層層轉發的請求是否是問題,能夠參考80-20法則。
若是80%是附帶邏輯的,那麼就是ok的,但若是有80% 是 simple passthrough processing,那麼就得考慮讓某些layer open。好比在複雜的業務系統中, 常常會有一些可複用的邏輯,這個時候會抽取爲通用的服務層(service layer)。以下圖所示
open layer 、close layer的概念能夠幫助理清楚架構和請求流程之間的關係,讓架構師、程序員都清楚架構的邊界(boundary)在哪裏,重要的是,這個open-closed關係須要明確的文檔化,不要隨意打破,不然就會一團糟。
The event-driven architecture pattern is a popular distributed asynchronous architecture pattern used to produce highly scalable applications.
從上述定義能夠看出事件驅動架構的幾個特色:分佈式、異步、可伸縮。其核心是:高度解耦合、專注職責的事件處理單元(Event Processor)
事件驅動架構有兩種常見拓撲結構: the mediator and the broker.
Mediator Topology
須要一箇中心化(全局惟一)的協調單元,用於組織一個事件中的多個步驟,這些步驟中有些是可並行的,有些必須是順序執行的,這就依賴Event Mediator的調度。以下圖所示
Broker Topology
這種是沒有中心的架構
the message flow is distributed across the event processor components in a chain-like fashion through a lightweight message broker
以下圖所示
事件驅動的好處在於,高度可伸縮、便於部署、總體性能較好(得益於某些事件的併發執行)。但因爲其分佈式異步的本性,其缺點也很明顯:開發比較複雜、維護成本較高;並且很難支持事務,尤爲是一個邏輯事件跨越多個processor的時候。
微內核架構又稱之爲插件式架構(plug-in architecture)。以下圖所示:
微內核架構包含兩部分組件
plug-in modules 是相互獨立的組件,用於增長、擴展 core system 的功能。
這種架構很是適用於 product-based applications 即須要打包、下載、安裝的應用,好比桌面應用。最經典的例子就是Eclipse編輯器,玩遊戲的同窗常常下載使用的MOD也能夠看出插件。
微內核架構一般能夠是其餘架構的一部分,以實現特定部分的漸進式設計、增量開發
微服務架構並非爲了解決新問題而發明的新架構,而是從分層架構的單體式應用和SOA(service-oriented architecture)演化而來。
微服務解決了分層架構潛在的成爲單體式應用(Monolithic application)的問題:
through the development of continuous delivery, separating the application into multiple deployable units
同時,微服務還經過簡化(泛化)服務的概念,消除編排需求,簡化對服務組件的鏈接訪問。從而避免了SOA的各類缺點:複雜、昂貴、重度、難以理解和開發。
The microservices architecture style addresses this complexity by simplifying the notion of a service, eliminating orchestration needs, and simplifying connectivity and access to service components.
微服務架構以下:
其核心是service component,這些服務組件相互解耦,易於獨立開發、部署。服務組件的粒度是微服務架構中最難的挑戰
而微服務架構相比SOA而言,其優點就在於避免依賴和編排 -- 編排引入大量的複雜工做。
對於單個請求 若是service之間還要通訊,那麼多是就是粒度太小。解決辦法:
基於空間的架構,其核心目標是解決因爲數據庫瓶頸致使的低伸縮性、低併發問題。
分層架構中,在用戶規模激增的狀況下,數據層的擴展每每會成爲最後的瓶頸(相對而言,前端和業務邏輯都容易作成無狀態,比較好水平擴展)。而基於空間的架構的核心是內存複製,根本上解決了這個問題。
High scalability is achieved by removing the central database constraint and using replicated in-memory data grids instead
架構以下:
其核心組件包括
基於空間的架構不多見,並且從上面的核心組件描述來看的話,開發和維護應該都是比較負責的,因爲是數據的同步這塊。並且因爲數據都保存在內存中,那麼數據量就不能太大。
基於空間的架構適用於需求變化大的小型web應用,不適用於有大量數據操做的傳統大規模關係型數據庫應用