本書首先介紹軟件架構的含義并給出簡單的設計示例,之后分為四個部分涵蓋軟件開發(fā)生命周期中的各個階段:討論構成系統(tǒng)的每個組成單元的一般性原則及其核心內容;重點介紹一些成功的架構模式,包括它們的優(yōu)勢和局限性;闡述如何進行軟件測試以及如何構建和共享代碼;講解持續(xù)運維,涵蓋日志、系統(tǒng)度量、性能分析、代碼調試和架構調整等內容。
開發(fā)規(guī)模和復雜性不斷增長的大型系統(tǒng)需要深刻理解軟件項目的實施過程。軟件開發(fā)人員、架構師和技術管理團隊遵循高級軟件設計模式(如微服務架構、事件驅動架構,以及領域驅動設計規(guī)定的策略模式),可以簡化開發(fā)過程。 本書涵蓋了這些成熟的架構設計模式,并以前瞻性的方法幫助Python開發(fā)人員管理復雜應用程序的開發(fā),令其從Python測試套件中獲取最大價值。 本書從系統(tǒng)設計的起始階段開始,讓你了解軟件開發(fā)的思路和項目中要考慮的重點問題。書中闡述了各種架構模式,如微服務、Web服務和事件驅動架構,以及如何選擇最適合你的項目的模式。然后,在建立相關概念的基礎上,討論如何進行開發(fā)、調試和測試,以編寫高質量的代碼,并為系統(tǒng)部署做好準備。此外,本書還講解了當系統(tǒng)部署到最終用戶之后如何實現(xiàn)持續(xù)運維,因為軟件開發(fā)的生命周期永無止境。 學完本書,你將形成“架構思維”:一種不一樣的軟件設計方法,包括對運行中的系統(tǒng)進行調整。 通過學習本書,你將可以: ? 像架構師一樣思考,分析軟件架構模式。 ? 探索API設計、數(shù)據(jù)存儲和數(shù)據(jù)呈現(xiàn)方法。 ? 探究常見架構模式的細微差別。 ? 利用微服務等架構模式的組件并實現(xiàn)其互操作。 ? 采用測試驅動開發(fā)模式執(zhí)行高質量的代碼測試。 ? 將大塊可重用的代碼構建為軟件包。 ? 保持系統(tǒng)向后兼容性并部署其迭代變更。
Preface前 言
軟件的發(fā)展意味著隨著時間的推移系統(tǒng)會變得越來越復雜,需要越來越多的開發(fā)人員協(xié)同工作。隨著軟件系統(tǒng)規(guī)模的增長,一個總體的架構也隨之產(chǎn)生。如果沒有對系統(tǒng)架構進行很好的規(guī)劃,軟件系統(tǒng)將會變得非;靵y且難以維護。
軟件架構所要解決的問題就是規(guī)劃和設計軟件系統(tǒng)的架構。一個設計良好的架構可以讓不同的團隊相互交流,同時對各自的責任和目標有清晰的認識。
系統(tǒng)的架構應當被設計成可以在最小的阻礙下進行日常軟件開發(fā),而且允許增加功能,以及對系統(tǒng)進行擴展。一個處于運行狀態(tài)的系統(tǒng),其架構總是在變化,還可以對其進行功能調整和擴充,從而以一種審慎而平滑的方式重塑不同的軟件單元。
在本書中,我們將學習軟件架構系統(tǒng)的各方面內容,從頂層設計到用于支持高層功能的低層細節(jié)。本書內容分為四個部分,涵蓋軟件開發(fā)生命周期中的各個階段:
編寫代碼之前首先進行設計;
采用經(jīng)驗證的架構模式;
用代碼實現(xiàn)設計;
持續(xù)運維以適應變化,并確保系統(tǒng)按預期狀態(tài)運行。
本書內容將包含上述所有相關內容的不同技術實現(xiàn)。
目標讀者
本書是為那些想要擴充其軟件架構知識的開發(fā)人員準備的,無論是經(jīng)驗豐富的開發(fā)人員,還是想提高自身能力的軟件開發(fā)新手,都可以通過學習本書內容,用更寬廣的視野來應對更大規(guī)模的軟件系統(tǒng)開發(fā)。
本書使用Python編寫的代碼作為示例。雖然不要求讀者是Python開發(fā)專家,但需要具備一定的Python基礎知識。
本書內容
第1章介紹什么是軟件架構以及為什么它很有用,同時還提供一個設計示例。
第一部分涵蓋編寫軟件代碼之前的設計階段的相關內容:
第2章展示設計可用API的基礎知識,這些API可以方便地抽象出各種操作。
第3章講述存儲系統(tǒng)的特殊性以及如何為應用程序設計合適的數(shù)據(jù)表示。
第4章討論處理存儲數(shù)據(jù)的代碼,以及如何使其滿足需求。
第二部分包含各種不同的架構模式,這些模式重用了已被驗證的軟件架構:
第5章展示“十二要素App”方法論在有效處理Web服務時的良好實踐,并將其應用于不同場景。
第6章闡述Web服務器以及在實施和軟件設計過程中需要考慮的相關要素。
第7章描述另一種類型的異步系統(tǒng),它接收信息時不立即返回響應。
第8章闡述更多異步系統(tǒng)的高級用法,以及一些不同的可創(chuàng)建的模式。
第9章介紹兩種針對復雜系統(tǒng)的架構,并闡述它們之間的區(qū)別。
第三部分是本書的代碼實現(xiàn)部分,介紹如何編寫代碼:
第10章闡述測試的基本原理以及如何在編碼過程中使用TDD(Test Driven Development,測試驅動開發(fā))。
第11章討論創(chuàng)建可重復使用的代碼的過程,以及如何對其進行分發(fā)。
第四部分是關于持續(xù)運維的內容,即系統(tǒng)正在運行,并且需要在調整和修改的同時對其進行監(jiān)控:
第12章闡述如何記錄運行中的系統(tǒng)正在做什么。
第13章討論如何多方匯集數(shù)據(jù)以查看整個系統(tǒng)的狀況。
第14章闡述如何了解代碼的執(zhí)行情況以提高其性能。
第15章涵蓋深入挖掘代碼執(zhí)行的過程以發(fā)現(xiàn)并修復其中的錯誤。
第16章描述如何在運行的系統(tǒng)中有效地進行架構調整。
充分利用本書
本書的示例代碼使用Python語言,并假定讀者能夠自如地閱讀,但不需要專家級別的水平。
如果之前接觸過包含多種服務的復雜系統(tǒng),將有利于理解軟件架構所帶來的各種挑戰(zhàn)。這對于有幾年或更多經(jīng)驗的開發(fā)人員來說應該很簡單。
熟悉Web服務和REST接口有助于更好地理解某些原理。
下載示例代碼文件
本書的代碼包托管在GitHub上,地址是https://github.com/PacktPublishing/Python-Architecture-Patterns。
下載彩色圖片
我們還提供了一個PDF文件,其中包含本書所用到的屏幕截圖、圖表的彩色圖片文件?
以從https://static.packt-cdn.com/downloads/9781801819992_ColorImages.pdf下載。
排版約定
本書中使用了以下排版約定。
CodeInText(代碼體):表示文本中的程序代碼、對象名、模塊名、文件夾名、文件名、文件擴展名、路徑名、虛擬URL和用戶輸入等。下面是一個例子:“對于這個方法,我們需要導入requests(請求)模塊”。
示例代碼塊如下:
請注意,為簡潔起見,書中列出的代碼可能被編輯過。必要時可參考GitHub上的完整代碼。
本書中所有在命令行輸入或輸出的內容均為如下形式(注意$符號):
本書中所有在Python解釋器中輸入的內容均為如下形式(注意>>>符號)。預期的程序輸出信息將出現(xiàn)在沒有>>>符號的地方:
要進入Python解釋器,需運行不帶參數(shù)的python3命令:
本書中所有在命令行輸入或輸出的內容均為如下形式:
黑體字:表示一個新術語、一個重要的詞或在界面上看到的詞,比如,菜單或對話框中的詞。例如:“在Administration(管理)面板上選擇System info(系統(tǒng)信息)菜單”。
表示警告或重要說明。
表示提示或技巧。
詹姆·布爾塔(Jaime Buelta)是擁有20多年經(jīng)驗的杰出程序員,其中10余年全職從事Python開發(fā)。在此期間,他接觸了很多不同的技術,幫助航空航天、工業(yè)系統(tǒng)、在線視頻游戲服務、金融服務和教育工具等多個行業(yè)領域的客戶達成目標。自2018年以來,Jaime一直在撰寫技術書籍,總結職業(yè)生涯中的經(jīng)驗教訓,除本書外,他還著有Python Automation Cookbook和Hands On Docker for Microservices in Python。Jaime目前居住在愛爾蘭都柏林。
一本書的出版非一人之功。這離不開直接參與完善、改進文稿的人員的辛苦付出,還有與Python基金會及其技術社區(qū)那些出色的技術人員進行的大量溝通和交流,這些溝通和交流形成了書中的觀點。當然,如果沒有我了不起的妻子Dana付出的愛和支持,本書也不可能完成。
Contents目 錄
譯者序
前言
關于作者
關于審校者
第1章 軟件架構簡介 1
1.1 設計軟件系統(tǒng)的架構 1
1.2 劃分為較小的單元 3
1.3 康威定律:對軟件架構的影響 5
1.4 應用示例:概述 6
1.5 軟件架構安全 8
1.6 小結 9
第一部分 設計
第2章 API設計 13
2.1 抽象 14
2.1.1 使用合適的抽象 15
2.1.2 抽象失效 16
2.1.3 資源與操作抽象 17
2.2 RESTful接口 18
2.2.1 實用性定義 19
2.2.2 HTTP頭部及狀態(tài) 21
2.2.3 資源設計 24
2.2.4 資源與參數(shù) 25
2.2.5 分頁 26
2.2.6 RESTful API流程設計 27
2.2.7 使用Open API規(guī)范 29
2.3 認證 32
2.3.1 HTML接口認證 33
2.3.2 RESTful接口認證 34
2.4 API版本管理 38
2.4.1 為何需要版本管理 38
2.4.2 內部版本與外部版本 38
2.4.3 語義化版本管理 39
2.4.4 簡單的版本管理 40
2.5 前端與后端 41
2.6 HTML接口 43
2.6.1 傳統(tǒng)HTML接口 43
2.6.2 動態(tài)頁面 44
2.6.3 單頁應用程序 45
2.6.4 混合模式 46
2.7 API設計示例 47
2.7.1 端點 48
2.7.2 設計及實現(xiàn)審查 55
2.8 小結 55
第3章 數(shù)據(jù)建!56
3.1 數(shù)據(jù)庫的類型 56
3.1.1 關系數(shù)據(jù)庫 57
3.1.2 非關系數(shù)據(jù)庫 59
3.1.3 小型數(shù)據(jù)庫 62
3.2 數(shù)據(jù)庫事務 63
3.3 分布式關系數(shù)據(jù)庫 65
3.3.1 主庫/副本 65
3.3.2 分片 67
3.3.3 分片的優(yōu)勢和劣勢 71
3.4 數(shù)據(jù)庫模式設計 72
3.4.1 模式規(guī)范化 75
3.4.2 去規(guī)范化 77
3.5 數(shù)據(jù)索引 78
3.6 小結 81
第4章 數(shù)據(jù)層 82
4.1 模型層 82
4.1.1 DDD 83
4.1.2 使用ORM 84
4.1.3 工作單元模式及數(shù)據(jù)封裝 90
4.1.4 CQRS使用不同的讀寫
模型 93
4.2 數(shù)據(jù)庫遷移 96
4.2.1 向后兼容性 96
4.2.2 關系數(shù)據(jù)庫遷移 97
4.2.3 非關系數(shù)據(jù)庫遷移 101
4.3 處理遺留數(shù)據(jù)庫 102
4.3.1 檢測數(shù)據(jù)庫模式 103
4.3.2 同步現(xiàn)有模式至ORM 104
4.4 小結 105
第二部分 架構模式
第5章 十二要素App方法論 109
5.1 十二要素App簡介 109
5.2 CI 110
5.3 可擴展性 111
5.4 配置 113
5.5 十二要素 115
5.5.1 一次構建,多次運行 115
5.5.2 依賴項和配置 117
5.5.3 可擴展性 120
5.5.4 監(jiān)控和管理 122
5.6 容器化的十二要素App 125
5.7 小結 126
第6章 Web服務器架構 127
6.1 請求–響應架構 127
6.2 Web架構 129
6.3 Web服務器 130
6.3.1 由外部提供靜態(tài)內容 131
6.3.2 反向代理 133
6.3.3 日志 135
6.3.4 高級用法 136
6.4 uWSGI 136
6.4.1 WSGI應用程序 137
6.4.2 與Web服務器交互 138
6.4.3 進程 139
6.4.4 進程生命周期 140
6.5 Python Worker 143
6.5.1 Django MVT架構 143
6.5.2 將請求路由到視圖 144
6.5.3 視圖 146
6.5.4 中間件 150
6.5.5 Django REST框架 152
6.6 外部層 158
6.7 小結 158
第7章 事件驅動架構 160
7.1 發(fā)送事件 160
7.2 異步任務 161
7.3 任務細分 164
7.4 計劃任務 165
7.5 隊列機制 166
7.5.1 統(tǒng)一Worker代碼 169
7.5.2 云隊列和Worker 169
7.6 Celery 171
7.6.1 配置Celery 172
7.6.2 Celery Worker 172
7.6.3 觸發(fā)任務 175
7.6.4 聯(lián)調 175
7.6.5 計劃任務 178
7.6.6 Celery Flower 182
7.6.7 Flower的HTTP API 184
7.7 小結 185
第8章 高級事件驅動架構 187
8.1 流式事件 187
8.2 管道 190
8.2.1 準備 191
8.2.2 基礎任務 192
8.2.3 圖像任務 193
8.2.4 視頻任務 195
8.2.5 連接任務 196
8.2.6 運行任務 198
8.3 定義總線 200
8.4 更復雜的系統(tǒng) 201
8.5 測試事件驅動系統(tǒng) 204
8.6 小結 205
第9章 微服務與單體 207
9.1 單體架構 207
9.2 微服務架構 208
9.3 架構選擇 209
9.4 關鍵因素:團隊溝通 213
9.5 從單體遷移到微服務 216
9.5.1 遷移面臨的挑戰(zhàn) 216
9.5.2 四步遷移 218
9.6 服務容器化 224
9.6.1 構建并運行鏡像 226
9.6.2 構建并運行Web服務 228
9.7 容器編排與Kubernetes 236
9.8 小結 237
第三部分 實現(xiàn)
第10章 測試與TDD 241
10.1 代碼測試 2