微服務(wù)既有同步實現(xiàn),亦有異步實現(xiàn)。異步微服務(wù)架構(gòu)以事件驅(qū)動,不受特定的API限制,系統(tǒng)的耦合度低,可擴(kuò)展性強(qiáng)。本書教你從頭開始構(gòu)建完整的事件驅(qū)動型微服務(wù)架構(gòu),根據(jù)實際的業(yè)務(wù)需求調(diào)整、擴(kuò)展微服務(wù),更好地實踐持續(xù)交付,并以新的視角思考如何充分利用實時數(shù)據(jù)的價值。
1.本書從頭開始,為讀者講解如何構(gòu)建完整的事件驅(qū)動型微服務(wù)架構(gòu),站在初學(xué)的角度進(jìn)行了細(xì)致的講解。
2.本書為構(gòu)建事件驅(qū)動型微服務(wù)提供了實用框架,讓技術(shù)選型更靈活,應(yīng)對不斷變化的業(yè)務(wù)需求,實現(xiàn)持續(xù)交付。
3.本書適合軟件架構(gòu)師、系統(tǒng)設(shè)計師、數(shù)據(jù)工程師等相關(guān)從業(yè)者進(jìn)行系統(tǒng)的學(xué)習(xí),主要講解了以下內(nèi)容:
●如何利用事件驅(qū)動架構(gòu)更好地實現(xiàn)商業(yè)價值
●微服務(wù)在事件驅(qū)動架構(gòu)設(shè)計中的角色
●確保團(tuán)隊取得成功的架構(gòu)模式
●開發(fā)強(qiáng)大的事件驅(qū)動型微服務(wù)所需的應(yīng)用模式
●落地微服務(wù)生態(tài)系統(tǒng)所需的組件和工具
亞當(dāng)·貝勒馬爾(Adam Bellemare),Confluent公司微服務(wù)架構(gòu)師,精通大數(shù)據(jù)技術(shù),曾受邀在Kafka峰會上做有關(guān)事件驅(qū)動型微服務(wù)的主題演講。 【譯者簡介】 溫正東,華南理工大學(xué)計算機(jī)碩士,曾任華為公司信息技術(shù)工程師,現(xiàn)任富途證券網(wǎng)絡(luò)增長研發(fā)總監(jiān),另譯有《Web安全開發(fā)指南》。
前言 xv
第 1 章 為什么用事件驅(qū)動型微服務(wù) 1
1.1 什么是事件驅(qū)動型微服務(wù) 2
1.2 領(lǐng)域驅(qū)動設(shè)計和界限上下文 3
1.2.1 運(yùn)用領(lǐng)域模型和界限上下文 4
1.2.2 保持界限上下文與業(yè)務(wù)需求一致 4
1.3 溝通結(jié)構(gòu) 5
1.3.1 業(yè)務(wù)溝通結(jié)構(gòu) 5
1.3.2 實現(xiàn)溝通結(jié)構(gòu) 6
1.3.3 數(shù)據(jù)溝通結(jié)構(gòu) 7
1.3.4 康威定律和溝通結(jié)構(gòu) 7
1.4 傳統(tǒng)計算中的溝通結(jié)構(gòu) 8
1.4.1 選項1:創(chuàng)建一個新服務(wù) 8
1.4.2 選項2:將它加入現(xiàn)有服務(wù)中 9
1.4.3 兩種選項的利弊 9
1.4.4 團(tuán)隊場景(續(xù)) 10
1.4.5 沖突的壓力 10
1.5 事件驅(qū)動的溝通結(jié)構(gòu) 11
1.5.1 事件是通信的基礎(chǔ) 11
1.5.2 事件流提供了單一事實來源 11
1.5.3 消費(fèi)者執(zhí)行自己的建模和查詢 11
1.5.4 整個組織的數(shù)據(jù)溝通得到改善 12
1.5.5 高可訪問的數(shù)據(jù)利于業(yè)務(wù)變更 12
1.6 異步的事件驅(qū)動型微服務(wù) 12
1.7 同步式微服務(wù) 14
1.7.1 同步式微服務(wù)的缺點(diǎn) 14
1.7.2 同步式微服務(wù)的優(yōu)點(diǎn) 15
1.8 小結(jié) 16
第 2 章 事件驅(qū)動型微服務(wù)基礎(chǔ) 17
2.1 構(gòu)建拓?fù)洹?7
2.1.1 微服務(wù)拓?fù)洹?7
2.1.2 業(yè)務(wù)拓?fù)洹?8
2.2 事件內(nèi)容 19
2.3 事件的結(jié)構(gòu) 19
2.3.1 無鍵事件 19
2.3.2 實體事件 20
2.3.3 鍵控事件 20
2.4 物化來自實體事件的狀態(tài) 20
2.5 事件數(shù)據(jù)的定義和schema 22
2.6 微服務(wù)單一寫原則 22
2.7 用事件代理賦能微服務(wù) 23
2.7.1 事件存儲和服務(wù) 23
2.7.2 需要考慮的其他因素 24
2.8 事件代理與消息代理 25
2.8.1 從不可變?nèi)罩局邢M(fèi) 26
2.8.2 提供單一事實來源 27
2.9 大規(guī)模管理微服務(wù) 28
2.9.1 將微服務(wù)放到容器內(nèi) 28
2.9.2 將微服務(wù)放到虛擬機(jī)內(nèi) 28
2.9.3 管理容器和虛擬機(jī) 28
2.10 繳納微服務(wù)稅 29
2.11 小結(jié) 30
第 3 章 通信和數(shù)據(jù)契約 31
3.1 事件驅(qū)動數(shù)據(jù)契約 31
3.1.1 使用顯式schema作為契約 32
3.1.2 schema定義的注釋 32
3.1.3 全能的schema演化 33
3.1.4 有代碼生成器支持 33
3.1.5 破壞性的schema變更 34
3.2 選擇事件格式 36
3.3 設(shè)計事件 36
3.3.1 只講述事實 36
3.3.2 每個流都使用單一事件定義 37
3.3.3 使用窄的數(shù)據(jù)類型 37
3.3.4 保持事件的單一用途 37
3.3.5 小化事件 40
3.3.6 讓潛在的消費(fèi)者參與事件設(shè)計 40
3.3.7 避免將事件作為信號量或信號 41
3.4 小結(jié) 41
第 4 章 將事件驅(qū)動架構(gòu)與現(xiàn)有系統(tǒng)集成 42
4.1 什么是數(shù)據(jù)解放 43
4.1.1 數(shù)據(jù)解放的折中方案 43
4.1.2 將被解放的數(shù)據(jù)轉(zhuǎn)化成事件 45
4.2 數(shù)據(jù)解放模式 45
4.3 數(shù)據(jù)解放框架 46
4.4 通過查詢實施數(shù)據(jù)解放 46
4.4.1 批量加載 47
4.4.2 增量時間戳加載 47
4.4.3 自增ID 加載 47
4.4.4 自定義查詢 47
4.4.5 增量更新 47
4.4.6 基于查詢更新的優(yōu)點(diǎn) 48
4.4.7 基于查詢更新的缺點(diǎn) 48
4.5 使用變更數(shù)據(jù)捕獲日志解放數(shù)據(jù) 49
4.5.1 使用數(shù)據(jù)存儲日志的優(yōu)點(diǎn) 50
4.5.2 使用數(shù)據(jù)庫日志的缺點(diǎn) 50
4.6 使用發(fā)件箱表解放數(shù)據(jù) 51
4.6.1 性能考慮 52
4.6.2 隔離內(nèi)部數(shù)據(jù)模型 52
4.6.3 確保schema兼容性 53
4.6.4 使用觸發(fā)器捕獲變更數(shù)據(jù) 56
4.7 對處于捕獲的數(shù)據(jù)集做數(shù)據(jù)定義變更 59
4.7.1 為查詢和CDC日志模式處理事后數(shù)據(jù)定義變更 60
4.7.2 為變更數(shù)據(jù)表捕獲模式處理數(shù)據(jù)定義變更 60
4.8 將事件數(shù)據(jù)落地到數(shù)據(jù)存儲 60
4.9 數(shù)據(jù)落地和獲取對業(yè)務(wù)的影響 60
4.10 小結(jié) 62
第 5 章 事件驅(qū)動處理基礎(chǔ) 63
5.1 構(gòu)建無狀態(tài)拓?fù)洹?4
5.1.1 轉(zhuǎn)換 64
5.1.2 分流與合流 65
5.2 對事件流再分區(qū) 65
5.3 對事件流協(xié)同分區(qū) 66
5.4 給消費(fèi)者實例分配分區(qū) 67
5.4.1 使用分區(qū)分配器分配分區(qū) 68
5.4.2 分配協(xié)同分區(qū) 68
5.4.3 分區(qū)分配策略 68
5.5 從無狀態(tài)處理實例故障中恢復(fù) 70
5.6 小結(jié) 70
第 6 章 具有確定性的流處理 71
6.1 事件驅(qū)動工作流的確定性 72
6.2 時間戳 72
6.2.1 同步分布式時間戳 73
6.2.2 處理帶時間戳的事件 74
6.3 事件調(diào)度和確定性處理 75
6.3.1 自定義事件調(diào)度器 75
6.3.2 基于事件時間、處理時間和攝取時間進(jìn)行處理 75
6.3.3 消費(fèi)者提取時間戳 76
6.3.4 對外部系統(tǒng)的請求?C響應(yīng)調(diào)用 76
6.4 水位 76
6.5 流時間 78
6.6 亂序事件和遲到事件 80
6.6.1 使用水位和流時間的遲到事件 81
6.6.2 亂序事件的原因和影響 81
6.6.3 時間敏感的函數(shù)和窗口化 83
6.7 處理遲到事件 85
6.8 再處理與近實時處理 86
6.9 間歇性故障和遲到事件 86
6.10 生產(chǎn)者/事件代理的連接性問題 87
6.11 小結(jié)與延展閱讀 88
第 7 章 有狀態(tài)的流 89
7.1 狀態(tài)存儲與從事件流中物化狀態(tài) 89
7.2 記錄狀態(tài)到變更日志事件流 90
7.3 將狀態(tài)物化至內(nèi)部狀態(tài)存儲 91
7.3.1 物化全局狀態(tài) 92
7.3.2 使用內(nèi)部狀態(tài)的優(yōu)點(diǎn) 92
7.3.3 使用內(nèi)部狀態(tài)的缺點(diǎn) 93
7.3.4 內(nèi)部狀態(tài)的伸縮和恢復(fù) 93
7.4 將狀態(tài)物化至外部狀態(tài)存儲 96
7.4.1 外部狀態(tài)的優(yōu)點(diǎn) 97
7.4.2 外部狀態(tài)的缺點(diǎn) 97
7.4.3 外部狀態(tài)存儲的伸縮和恢復(fù) 98
7.5 重建與遷移狀態(tài)存儲 99
7.5.1 重建 99
7.5.2 遷移 100
7.6 事務(wù)與有效一次處理 100
7.6.1 示例:庫存計算服務(wù) 101
7.6.2 使用客戶端?C代理事務(wù)的有效一次處理 102
7.6.3 沒有客戶端?C代理事務(wù)的有效一次處理 103
7.7 小結(jié) 107
第 8 章 用微服務(wù)構(gòu)建工作流 108
8.1 編排模式 109
8.1.1 一個簡單的事件驅(qū)動編排示例 109
8.1.2 創(chuàng)建和修改編排的工作流 110
8.1.3 監(jiān)控編排的工作流 110
8.2 編制模式 111
8.2.1 一個簡單的事件驅(qū)動編制模式例子 112
8.2.2 一個簡單的直接調(diào)用的編制模式例子 113
8.2.3 對比事件驅(qū)動編制模式和直接調(diào)用的編制模式 114
8.2.4 創(chuàng)建和修改編制工作流 114
8.2.5 監(jiān)控編制工作流 115
8.3 分布式事務(wù) 115
8.3.1 編排型事務(wù):saga模式 115
8.3.2 編制型事務(wù) 117
8.4 補(bǔ)償工作流 119
8.5 小結(jié) 119
第 9 章 使用函數(shù)即服務(wù)的微服務(wù) 120
9.1 設(shè)計基于函數(shù)的微服務(wù)解決方案 120
9.1.1 確保界限上下文的嚴(yán)格的成員關(guān)系 120
9.1.2 只在完成處理之后提交偏移量 121
9.1.3 少即是多 121
9.2 選擇FaaS供應(yīng)商 122
9.3 在函數(shù)之外構(gòu)建微服務(wù) 122
9.4 冷啟動和熱啟動 123
9.5 用觸發(fā)器啟動函數(shù) 124
9.5.1 基于新事件觸發(fā):事件流監(jiān)聽器 124
9.5.2 基于消費(fèi)者組的滯后度觸發(fā) 125
9.5.3 按調(diào)度表觸發(fā) 126
9.5.4 使用網(wǎng)絡(luò)鉤子觸發(fā) 126
9.5.5 觸發(fā)資源事件 127
9.6 用函數(shù)執(zhí)行業(yè)務(wù)工作 127
9.7 維持狀態(tài) 127
9.8 調(diào)用其他函數(shù)的函數(shù) 128
9.8.1 事件驅(qū)動通信模式 128
9.8.2 直接調(diào)用模式 129
9.9 終止和關(guān)閉 131
9.10 調(diào)整函數(shù) 132
9.10.1 分配足夠的資源 132
9.10.2 批量事件處理的參數(shù) 132
9.11 FaaS的伸縮方案 132
9.12 小結(jié) 133
第 10 章 基礎(chǔ)的生產(chǎn)者和消費(fèi)者微服務(wù) 134
10.1 BPC的適用場合 134
10.1.1 集成現(xiàn)有遺留系統(tǒng) 135
10.1.2 不依賴于事件順序的有狀態(tài)的業(yè)務(wù)邏輯 136
10.1.3 當(dāng)數(shù)據(jù)層完成大部分工作時 137
10.1.4 處理層和數(shù)據(jù)層獨(dú)立伸縮 137
10.2 具有外部流處理的混合BPC應(yīng)用程序 138
10.3 小結(jié) 140
第 11 章 使用重量級框架的微服務(wù) 141
11.1 重量級框架的簡單歷史 142
11.2 重量級框架的內(nèi)部運(yùn)作 142
11.3 優(yōu)點(diǎn)和局限性 144
11.4 集群搭建方案和執(zhí)行模式 145
11.4.1 使用托管服務(wù) 146
11.4.2 構(gòu)建自己的完整集群 146
11.4.3 使用CMS集成來創(chuàng)建集群 146
11.5 應(yīng)用程序提交模式 148
11.5.1 驅(qū)動器模式 148
11.5.2 集群模式 148
11.6 處理狀態(tài)和使用檢查點(diǎn) 148
11.7 伸縮應(yīng)用程序和處理事件流分區(qū) 149
11.7.1 伸縮運(yùn)行中的應(yīng)用程序 150
11.7.2 通過重啟伸縮應(yīng)用程序 153
11.7.3 自動伸縮應(yīng)用程序 153
11.8 從故障中恢復(fù) 153
11.9 考慮多租戶問題 153
11.10 語言和語法 154
11.11 選擇一個框架 154
11.12 示例:點(diǎn)擊和觀看的會話窗口 155
11.13 小結(jié) 157
第 12 章 使用輕量級框架的微服務(wù) 158
12.1 優(yōu)點(diǎn)和局限性 158
12.2 輕量級處理 159
12.3 處理狀態(tài)和使用變更日志 159
12.4 伸縮和故障恢復(fù) 160
12.4.1 事件洗牌 160
12.4.2 狀態(tài)分配 161
12.4.3 狀態(tài)復(fù)制和熱副本 161
12.5 選擇一個輕量級框架 161
12.5.1 Apache Kafka Streams 162
12.5.2 Apache Samza:嵌入模式 162
12.6 語言和語法 162
12.7 流?C表?C表聯(lián)結(jié):增強(qiáng)模式 163
12.8 小結(jié) 166
第 13 章 集成事件驅(qū)動型和請求?C響應(yīng)型微服務(wù) 167
13.1 處理外部事件 167
13.1.1 自動生成的事件 168
13.1.2 由響應(yīng)生成的事件 168
13.2 處理自動生成的分析事件 168
13.3 集成第三方請求?C響應(yīng)API 170
13.4 處理并提供有狀態(tài)的數(shù)據(jù) 171
13.4.1 實時請求內(nèi)部狀態(tài)存儲 172
13.4.2 實時請求外部狀態(tài)存儲 175
13.5 在事件驅(qū)動的工作流中處理請求 177
13.6 請求?C響應(yīng)應(yīng)用程序中的微前端 183
13.7 微前端的優(yōu)點(diǎn) 184
13.7.1 基于組合的微服務(wù) 184
13.7.2 容易與業(yè)務(wù)需求對齊 185
13.8 微前端的缺點(diǎn) 185
13.8.1 可能不一致的UI元素和樣式 185
13.8.2 不同的微前端性能 185
13.8.3 示例:體驗搜索與評論應(yīng)用程序 186
13.9 小結(jié) 188
第 14 章 支持性工具 190
14.1 微服務(wù)?C團(tuán)隊分配系統(tǒng) 190
14.2 事件流的創(chuàng)建和修改 191
14.3 事件流元數(shù)據(jù)標(biāo)記 191
14.4 限額 192
14.5 schema注冊表 192
14.6 schema創(chuàng)建和修改通知 193
14.7 偏移量管理 193
14.8 事件流的權(quán)限和訪問控制列表 194
14.9 狀態(tài)管理和應(yīng)用程序重置 195
14.10 消費(fèi)者偏移量滯后度監(jiān)控 196
14.11 流水線型的微服務(wù)創(chuàng)建流程 196
14.12 容器管理控制 197
14.13 集群創(chuàng)建和管理 197
14.13.1 事件代理的程序化創(chuàng)建 197
14.13.2 計算資源的程序化創(chuàng)建 198
14.13.3 跨集群事件數(shù)據(jù)復(fù)制 198
14.13.4 工具的程序化創(chuàng)建 198
14.14 依賴跟蹤和拓?fù)淇梢暬?99
14.15 小結(jié) 202
第 15 章 測試事件驅(qū)動型微服務(wù) 203
15.1 通用測試原則 203
15.2 單元測試拓?fù)浜瘮?shù) 203
15.2.1 無狀態(tài)的函數(shù) 204
15.2.2 有狀態(tài)的函數(shù) 204
15.3 測試拓?fù)洹?05
15.4 測試schema演化和兼容性 205
15.5 事件驅(qū)動型微服務(wù)的集成測試 206
15.6 本地集成測試 206
15.6.1 在測試代碼的運(yùn)行時內(nèi)創(chuàng)建臨時環(huán)境 208
15.6.2 在測試代碼外部創(chuàng)建臨時環(huán)境 209
15.6.3 使用mocking和模擬器方法集成托管服務(wù) 209
15.6.4 集成沒有本地支持的遠(yuǎn)程服務(wù) 210
15.7 完全遠(yuǎn)程集成測試 211
15.7.1 程序化創(chuàng)建臨時集成測試環(huán)境 211
15.7.2 使用共享環(huán)境進(jìn)行測試 213
15.7.3 使用生產(chǎn)環(huán)境進(jìn)行測試 214
15.8 選擇你的完全遠(yuǎn)程集成測試策略 214
15.9 小結(jié) 215
第 16 章 部署事件驅(qū)動型微服務(wù) 216
16.1 微服務(wù)部署的原則 216
16.2 微服務(wù)部署的架構(gòu)組件 217
16.2.1 持續(xù)集成系統(tǒng)、持續(xù)交付系統(tǒng)和持續(xù)部署系統(tǒng) 217
16.2.2 CMS和商業(yè)硬件 218
16.3 基本的全站式部署模式 218
16.4 滾動更新模式 220
16.5 破壞性的schema變更模式 220
16.5.1 通過兩個事件流達(dá)到終遷移 222
16.5.2 同步遷移到新事件流 222
16.6 藍(lán)綠部署模式 223
16.7 小結(jié) 224
第 17 章 結(jié)論 225
17.1 通信層 225
17.2 業(yè)務(wù)領(lǐng)域和界限上下文 226
17.3 可共享的工具和基礎(chǔ)設(shè)施 226
17.4 結(jié)構(gòu)化事件 226
17.5 數(shù)據(jù)解放和單一事實來源 227
17.6 微服務(wù) 227
17.7 微服務(wù)實現(xiàn)方案 228
17.8 測試 228
17.9 部署 229
17.10 結(jié)語 229
關(guān)于作者 230
關(guān)于封面 230