本書首先介紹軟件架構(gòu)的含義并給出簡單的設(shè)計(jì)示例,之后分為四個(gè)部分涵蓋軟件開發(fā)生命周期中的各個(gè)階段:討論構(gòu)成系統(tǒng)的每個(gè)組成單元的一般性原則及其核心內(nèi)容;重點(diǎn)介紹一些成功的架構(gòu)模式,包括它們的優(yōu)勢和局限性;闡述如何進(jìn)行軟件測試以及如何構(gòu)建和共享代碼;講解持續(xù)運(yùn)維,涵蓋日志、系統(tǒng)度量、性能分析、代碼調(diào)試和架構(gòu)調(diào)整等內(nèi)容。
開發(fā)規(guī)模和復(fù)雜性不斷增長的大型系統(tǒng)需要深刻理解軟件項(xiàng)目的實(shí)施過程。軟件開發(fā)人員、架構(gòu)師和技術(shù)管理團(tuán)隊(duì)遵循高級軟件設(shè)計(jì)模式(如微服務(wù)架構(gòu)、事件驅(qū)動(dòng)架構(gòu),以及領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)規(guī)定的策略模式),可以簡化開發(fā)過程。 本書涵蓋了這些成熟的架構(gòu)設(shè)計(jì)模式,并以前瞻性的方法幫助Python開發(fā)人員管理復(fù)雜應(yīng)用程序的開發(fā),令其從Python測試套件中獲取最大價(jià)值。 本書從系統(tǒng)設(shè)計(jì)的起始階段開始,讓你了解軟件開發(fā)的思路和項(xiàng)目中要考慮的重點(diǎn)問題。書中闡述了各種架構(gòu)模式,如微服務(wù)、Web服務(wù)和事件驅(qū)動(dòng)架構(gòu),以及如何選擇最適合你的項(xiàng)目的模式。然后,在建立相關(guān)概念的基礎(chǔ)上,討論如何進(jìn)行開發(fā)、調(diào)試和測試,以編寫高質(zhì)量的代碼,并為系統(tǒng)部署做好準(zhǔn)備。此外,本書還講解了當(dāng)系統(tǒng)部署到最終用戶之后如何實(shí)現(xiàn)持續(xù)運(yùn)維,因?yàn)檐浖_發(fā)的生命周期永無止境。 學(xué)完本書,你將形成“架構(gòu)思維”:一種不一樣的軟件設(shè)計(jì)方法,包括對運(yùn)行中的系統(tǒng)進(jìn)行調(diào)整。 通過學(xué)習(xí)本書,你將可以: ? 像架構(gòu)師一樣思考,分析軟件架構(gòu)模式。 ? 探索API設(shè)計(jì)、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)呈現(xiàn)方法。 ? 探究常見架構(gòu)模式的細(xì)微差別。 ? 利用微服務(wù)等架構(gòu)模式的組件并實(shí)現(xiàn)其互操作。 ? 采用測試驅(qū)動(dòng)開發(fā)模式執(zhí)行高質(zhì)量的代碼測試。 ? 將大塊可重用的代碼構(gòu)建為軟件包。 ? 保持系統(tǒng)向后兼容性并部署其迭代變更。
Preface前 言
軟件的發(fā)展意味著隨著時(shí)間的推移系統(tǒng)會(huì)變得越來越復(fù)雜,需要越來越多的開發(fā)人員協(xié)同工作。隨著軟件系統(tǒng)規(guī)模的增長,一個(gè)總體的架構(gòu)也隨之產(chǎn)生。如果沒有對系統(tǒng)架構(gòu)進(jìn)行很好的規(guī)劃,軟件系統(tǒng)將會(huì)變得非常混亂且難以維護(hù)。
軟件架構(gòu)所要解決的問題就是規(guī)劃和設(shè)計(jì)軟件系統(tǒng)的架構(gòu)。一個(gè)設(shè)計(jì)良好的架構(gòu)可以讓不同的團(tuán)隊(duì)相互交流,同時(shí)對各自的責(zé)任和目標(biāo)有清晰的認(rèn)識(shí)。
系統(tǒng)的架構(gòu)應(yīng)當(dāng)被設(shè)計(jì)成可以在最小的阻礙下進(jìn)行日常軟件開發(fā),而且允許增加功能,以及對系統(tǒng)進(jìn)行擴(kuò)展。一個(gè)處于運(yùn)行狀態(tài)的系統(tǒng),其架構(gòu)總是在變化,還可以對其進(jìn)行功能調(diào)整和擴(kuò)充,從而以一種審慎而平滑的方式重塑不同的軟件單元。
在本書中,我們將學(xué)習(xí)軟件架構(gòu)系統(tǒng)的各方面內(nèi)容,從頂層設(shè)計(jì)到用于支持高層功能的低層細(xì)節(jié)。本書內(nèi)容分為四個(gè)部分,涵蓋軟件開發(fā)生命周期中的各個(gè)階段:
編寫代碼之前首先進(jìn)行設(shè)計(jì);
采用經(jīng)驗(yàn)證的架構(gòu)模式;
用代碼實(shí)現(xiàn)設(shè)計(jì);
持續(xù)運(yùn)維以適應(yīng)變化,并確保系統(tǒng)按預(yù)期狀態(tài)運(yùn)行。
本書內(nèi)容將包含上述所有相關(guān)內(nèi)容的不同技術(shù)實(shí)現(xiàn)。
目標(biāo)讀者
本書是為那些想要擴(kuò)充其軟件架構(gòu)知識(shí)的開發(fā)人員準(zhǔn)備的,無論是經(jīng)驗(yàn)豐富的開發(fā)人員,還是想提高自身能力的軟件開發(fā)新手,都可以通過學(xué)習(xí)本書內(nèi)容,用更寬廣的視野來應(yīng)對更大規(guī)模的軟件系統(tǒng)開發(fā)。
本書使用Python編寫的代碼作為示例。雖然不要求讀者是Python開發(fā)專家,但需要具備一定的Python基礎(chǔ)知識(shí)。
本書內(nèi)容
第1章介紹什么是軟件架構(gòu)以及為什么它很有用,同時(shí)還提供一個(gè)設(shè)計(jì)示例。
第一部分涵蓋編寫軟件代碼之前的設(shè)計(jì)階段的相關(guān)內(nèi)容:
第2章展示設(shè)計(jì)可用API的基礎(chǔ)知識(shí),這些API可以方便地抽象出各種操作。
第3章講述存儲(chǔ)系統(tǒng)的特殊性以及如何為應(yīng)用程序設(shè)計(jì)合適的數(shù)據(jù)表示。
第4章討論處理存儲(chǔ)數(shù)據(jù)的代碼,以及如何使其滿足需求。
第二部分包含各種不同的架構(gòu)模式,這些模式重用了已被驗(yàn)證的軟件架構(gòu):
第5章展示“十二要素App”方法論在有效處理Web服務(wù)時(shí)的良好實(shí)踐,并將其應(yīng)用于不同場景。
第6章闡述Web服務(wù)器以及在實(shí)施和軟件設(shè)計(jì)過程中需要考慮的相關(guān)要素。
第7章描述另一種類型的異步系統(tǒng),它接收信息時(shí)不立即返回響應(yīng)。
第8章闡述更多異步系統(tǒng)的高級用法,以及一些不同的可創(chuàng)建的模式。
第9章介紹兩種針對復(fù)雜系統(tǒng)的架構(gòu),并闡述它們之間的區(qū)別。
第三部分是本書的代碼實(shí)現(xiàn)部分,介紹如何編寫代碼:
第10章闡述測試的基本原理以及如何在編碼過程中使用TDD(Test Driven Development,測試驅(qū)動(dòng)開發(fā))。
第11章討論創(chuàng)建可重復(fù)使用的代碼的過程,以及如何對其進(jìn)行分發(fā)。
第四部分是關(guān)于持續(xù)運(yùn)維的內(nèi)容,即系統(tǒng)正在運(yùn)行,并且需要在調(diào)整和修改的同時(shí)對其進(jìn)行監(jiān)控:
第12章闡述如何記錄運(yùn)行中的系統(tǒng)正在做什么。
第13章討論如何多方匯集數(shù)據(jù)以查看整個(gè)系統(tǒng)的狀況。
第14章闡述如何了解代碼的執(zhí)行情況以提高其性能。
第15章涵蓋深入挖掘代碼執(zhí)行的過程以發(fā)現(xiàn)并修復(fù)其中的錯(cuò)誤。
第16章描述如何在運(yùn)行的系統(tǒng)中有效地進(jìn)行架構(gòu)調(diào)整。
充分利用本書
本書的示例代碼使用Python語言,并假定讀者能夠自如地閱讀,但不需要專家級別的水平。
如果之前接觸過包含多種服務(wù)的復(fù)雜系統(tǒng),將有利于理解軟件架構(gòu)所帶來的各種挑戰(zhàn)。這對于有幾年或更多經(jīng)驗(yàn)的開發(fā)人員來說應(yīng)該很簡單。
熟悉Web服務(wù)和REST接口有助于更好地理解某些原理。
下載示例代碼文件
本書的代碼包托管在GitHub上,地址是https://github.com/PacktPublishing/Python-Architecture-Patterns。
下載彩色圖片
我們還提供了一個(gè)PDF文件,其中包含本書所用到的屏幕截圖、圖表的彩色圖片文件?
以從https://static.packt-cdn.com/downloads/9781801819992_ColorImages.pdf下載。
排版約定
本書中使用了以下排版約定。
CodeInText(代碼體):表示文本中的程序代碼、對象名、模塊名、文件夾名、文件名、文件擴(kuò)展名、路徑名、虛擬URL和用戶輸入等。下面是一個(gè)例子:“對于這個(gè)方法,我們需要導(dǎo)入requests(請求)模塊”。
示例代碼塊如下:
請注意,為簡潔起見,書中列出的代碼可能被編輯過。必要時(shí)可參考GitHub上的完整代碼。
本書中所有在命令行輸入或輸出的內(nèi)容均為如下形式(注意$符號(hào)):
本書中所有在Python解釋器中輸入的內(nèi)容均為如下形式(注意>>>符號(hào))。預(yù)期的程序輸出信息將出現(xiàn)在沒有>>>符號(hào)的地方:
要進(jìn)入Python解釋器,需運(yùn)行不帶參數(shù)的python3命令:
本書中所有在命令行輸入或輸出的內(nèi)容均為如下形式:
黑體字:表示一個(gè)新術(shù)語、一個(gè)重要的詞或在界面上看到的詞,比如,菜單或?qū)υ捒蛑械脑~。例如:“在Administration(管理)面板上選擇System info(系統(tǒng)信息)菜單”。
表示警告或重要說明。
表示提示或技巧。
詹姆·布爾塔(Jaime Buelta)是擁有20多年經(jīng)驗(yàn)的杰出程序員,其中10余年全職從事Python開發(fā)。在此期間,他接觸了很多不同的技術(shù),幫助航空航天、工業(yè)系統(tǒng)、在線視頻游戲服務(wù)、金融服務(wù)和教育工具等多個(gè)行業(yè)領(lǐng)域的客戶達(dá)成目標(biāo)。自2018年以來,Jaime一直在撰寫技術(shù)書籍,總結(jié)職業(yè)生涯中的經(jīng)驗(yàn)教訓(xùn),除本書外,他還著有Python Automation Cookbook和Hands On Docker for Microservices in Python。Jaime目前居住在愛爾蘭都柏林。
一本書的出版非一人之功。這離不開直接參與完善、改進(jìn)文稿的人員的辛苦付出,還有與Python基金會(huì)及其技術(shù)社區(qū)那些出色的技術(shù)人員進(jìn)行的大量溝通和交流,這些溝通和交流形成了書中的觀點(diǎn)。當(dāng)然,如果沒有我了不起的妻子Dana付出的愛和支持,本書也不可能完成。
Contents目 錄
譯者序
前言
關(guān)于作者
關(guān)于審校者
第1章 軟件架構(gòu)簡介 1
1.1 設(shè)計(jì)軟件系統(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è)計(jì)
第2章 API設(shè)計(jì) 13
2.1 抽象 14
2.1.1 使用合適的抽象 15
2.1.2 抽象失效 16
2.1.3 資源與操作抽象 17
2.2 RESTful接口 18
2.2.1 實(shí)用性定義 19
2.2.2 HTTP頭部及狀態(tài) 21
2.2.3 資源設(shè)計(jì) 24
2.2.4 資源與參數(shù) 25
2.2.5 分頁 26
2.2.6 RESTful API流程設(shè)計(jì) 27
2.2.7 使用Open API規(guī)范 29
2.3 認(rèn)證 32
2.3.1 HTML接口認(rèn)證 33
2.3.2 RESTful接口認(rèn)證 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 動(dòng)態(tài)頁面 44
2.6.3 單頁應(yīng)用程序 45
2.6.4 混合模式 46
2.7 API設(shè)計(jì)示例 47
2.7.1 端點(diǎn) 48
2.7.2 設(shè)計(jì)及實(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è)計(jì) 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 可擴(kuò)展性 111
5.4 配置 113
5.5 十二要素 115
5.5.1 一次構(gòu)建,多次運(yùn)行 115
5.5.2 依賴項(xiàng)和配置 117
5.5.3 可擴(kuò)展性 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 進(jìn)程 139
6.4.4 進(jìn)程生命周期 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ū)動(dòng)架構(gòu) 160
7.1 發(fā)送事件 160
7.2 異步任務(wù) 161
7.3 任務(wù)細(xì)分 164
7.4 計(jì)劃任務(wù) 165
7.5 隊(duì)列機(jī)制 166
7.5.1 統(tǒng)一Worker代碼 169
7.5.2 云隊(duì)列和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 計(jì)劃任務(wù) 178
7.6.6 Celery Flower 182
7.6.7 Flower的HTTP API 184
7.7 小結(jié) 185
第8章 高級事件驅(qū)動(dòng)架構(gòu) 187
8.1 流式事件 187
8.2 管道 190
8.2.1 準(zhǔn)備 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 運(yùn)行任務(wù) 198
8.3 定義總線 200
8.4 更復(fù)雜的系統(tǒng) 201
8.5 測試事件驅(qū)動(dòng)系統(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)鍵因素:團(tuán)隊(duì)溝通 213
9.5 從單體遷移到微服務(wù) 216
9.5.1 遷移面臨的挑戰(zhàn) 216
9.5.2 四步遷移 218
9.6 服務(wù)容器化 224
9.6.1 構(gòu)建并運(yùn)行鏡像 226
9.6.2 構(gòu)建并運(yùn)行Web服務(wù) 228
9.7 容器編排與Kubernetes 236
9.8 小結(jié) 237
第三部分 實(shí)現(xiàn)
第10章 測試與TDD 241
10.1 代碼測試 2