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