《微服務實戰(zhàn)》主要介紹如何開發(fā)和維護基于微服務的應用。本書源自作者從日常開發(fā)中得到的積累和感悟,其中給出的案例覆蓋從微服務設計到部署的各個階段,能夠帶給你真實的沉浸式體驗。通過閱讀本書,你不僅能夠了解用微服務搭建高效的持續(xù)交付流水線的方法,還能夠運用Kubernetes、Docker 以及Google Container Engine 進一步探索書中的示例。
·本書涵蓋微服務設計到部署的各個階段,貫穿全書的真實案例,實戰(zhàn)性較強。
·本書作者技術背景深厚,均在英國著名身份識別與認證公司Onfido擔任技術方向的負責人。該公司用機器學習主要從事圖像識別、面部識別等技術的開發(fā)。
·源自作者日常開發(fā)中得到的積累和感悟,帶給你真實的沉浸式體驗。
·示例代碼基于Python語言,可在異步社區(qū)輕松下載。
摩根·布魯斯 (Morgan Bruce)和保羅·A. 佩雷拉 (Paulo A. Pereira)都是經(jīng)驗豐富的開發(fā)團隊領導者,他們的主要工作是運用本書中介紹的技術將微服務應用到生產(chǎn)環(huán)境中。
第 一部分 概述
第 1章 微服務的設計與運行 3
1.1 什么是微服務應用 4
1.1.1 通過分解來實現(xiàn)擴展 6
1.1.2 核心原則 7
1.1.3 誰在使用微服務 9
1.1.4 為什么微服務是一個明智的選擇 10
1.2 微服務的挑戰(zhàn) 12
1.2.1 設計挑戰(zhàn) 13
1.2.2 運維挑戰(zhàn) 15
1.3 微服務開發(fā)生命周期 16
1.3.1 微服務設計 17
1.3.2 微服務部署 18
1.3.3 服務監(jiān)控 21
1.4 有責任感和運維意識的工程師文化 22
1.5 小結 23
第 2章 SimpleBank公司的微服務 24
2.1 SimpleBank公司的業(yè)務范圍 24
2.2 微服務是否是正確的選擇 25
2.2.1 金融軟件的風險和惰性 26
2.2.2 減少阻力和持續(xù)交付價值 27
2.3 開發(fā)新功能 27
2.3.1 通過領域建模識別微服務 28
2.3.2 服務協(xié)作 30
2.3.3 服務編排 32
2.4 向外界開放服務 34
2.5 將功能發(fā)布到生產(chǎn)環(huán)境中 35
2.5.1 高質量的自動化部署 37
2.5.2 可恢復性 37
2.5.3 透明性 38
2.6 大規(guī)模微服務開發(fā) 39
2.6.1 技術分歧 40
2.6.2 孤立 40
2.7 接下來的內容 41
2.8 小結 41
第二部分 設計
第3章 微服務應用的架構 45
3.1 整體架構 45
3.1.1 從單體應用到微服務 46
3.1.2 架構師的角色 47
3.1.3 架構準則 47
3.1.4 微服務應用的4層架構 48
3.2 微服務平臺 49
3.3 服務層 51
3.3.1 功能 51
3.3.2 聚合與多元服務 52
3.3.3 關鍵路徑和非關鍵路徑 53
3.4 通信 54
3.4.1 何時使用同步消息 54
3.4.2 何時使用異步消息 55
3.4.3 異步通信模式 55
3.4.4 服務定位 57
3.5 服務邊界 58
3.5.1 API網(wǎng)關 60
3.5.2 服務于前端的后端 61
3.5.3 消費者驅動網(wǎng)關 62
3.6 客戶端 63
3.6.1 前端單體 63
3.6.2 微前端 64
3.7 小結 65
第4章 新功能設計 66
4.1 SimpleBank的新功能 67
4.2 按業(yè)務能力劃分 68
4.2.1 能力和領域建!69
4.2.2 創(chuàng)建投資策略 70
4.2.3 內嵌型上下文和服務 75
4.2.4 挑戰(zhàn)和不足 76
4.3 按用例劃分 77
4.3.1 按投資策略下單 77
4.3.2 動作和存儲 82
4.3.3 編配與編排 83
4.4 按易變性劃分 84
4.5 按技術能力劃分 85
4.5.1 發(fā)送通知 85
4.5.2 何時使用技術能力 86
4.6 處理不確定性 87
4.6.1 從粗粒度服務開始 88
4.6.2 準備進一步分解 88
4.6.3 下線和遷移 89
4.7 組織中的服務所有權 91
4.8 小結 92
第5章 微服務的事務與查詢 93
5.1 分布式應用的事務一致性 94
5.2 基于事件的通信 96
5.3 Saga 98
5.3.1 編排型Saga 100
5.3.2 編配型Saga 102
5.3.3 交織型Saga 104
5.3.4 一致性模式 105
5.3.5 事件溯源 106
5.4 分布式世界中的查詢操作 107
5.4.1 保存數(shù)據(jù)副本 108
5.4.2 查詢和命令分離 110
5.4.3 CQRS挑戰(zhàn) 112
5.4.4 分析和報表 114
5.5 延伸閱讀 114
5.6 小結 114
第6章 設計高可靠服務 116
6.1 可靠性定義 117
6.2 哪些會出錯 119
6.2.1 故障源 119
6.2.2 連鎖故障 122
6.3 設計可靠的通信方案 125
6.3.1 重試 126
6.3.2 后備方案 128
6.3.3 超時 130
6.3.4 斷路器 132
6.3.5 異步通信 134
6.4 最大限度地提高服務可靠性 135
6.4.1 負載均衡與服務健康 135
6.4.2 限流 136
6.4.3 驗證可靠性和容錯性 137
6.5 默認安全 140
6.5.1 框架 140
6.5.2 服務網(wǎng)格 141
6.6 小結 142
第7章 構建可復用的微服務框架 143
7.1 微服務底座 144
7.2 微服務底座的目的 146
7.2.1 降低風險 147
7.2.2 快速啟動 147
7.3 設計服務底座 148
7.3.1 服務發(fā)現(xiàn) 149
7.3.2 可觀測性 153
7.3.3 平衡和限流 159
7.4 探索使用底座實現(xiàn)的特性 161
7.5 差異性是否是微服務的承諾 163
7.6 小結 164
第三部分 部署
第8章 微服務部署 167
8.1 部署的重要性 167
8.2 微服務生產(chǎn)環(huán)境 169
8.2.1 微服務生產(chǎn)環(huán)境的特點 169
8.2.2 自動化和速度 170
8.3 部署服務的快捷方式 171
8.3.1 服務啟動 171
8.3.2 配置虛擬機 172
8.3.3 運行多個服務實例 173
8.3.4 添加負載均衡器 175
8.3.5 開發(fā)者學到了什么 177
8.4 構建服務工件 178
8.4.1 工件的組成 179
8.4.2 不可變性 179
8.4.3 服務工件的類型 180
8.4.4 配置 184
8.5 服務與主機關系模型 185
8.5.1 單服務主機 185
8.5.2 單主機多靜態(tài)服務 185
8.5.3 單主機多調度化服務 186
8.6 不停機部署服務 187
8.7 小結 190
第9章 基于容器和調度器的部署 191
9.1 服務容器化 192
9.1.1 鏡像使用 192
9.1.2 構建鏡像 194
9.1.3 運行容器 197
9.1.4 鏡像存儲 199
9.2 集群部署 200
9.2.1 pod的設計與運行 201
9.2.2 負載均衡 204
9.2.3 快速揭秘 205
9.2.4 健康檢查 208
9.2.5 部署新版本服務 210
9.2.6 回滾 215
9.2.7 連接多個服務 215
9.3 小結 216
第 10章 構建微服務交付流水線 217
10.1 讓部署變得平淡 217
10.2 使用Jenkins構建流水線 219
10.2.1 構建流水線配置 220
10.2.2 構建鏡像 223
10.2.3 運行測試 224
10.2.4 發(fā)布工件 226
10.2.5 部署至預發(fā)布環(huán)境 227
10.2.6 預發(fā)布環(huán)境 230
10.2.7 部署生產(chǎn)環(huán)境 230
10.3 構建可復用的流水線步驟 233
10.4 降低部署影響以及實現(xiàn)功能發(fā)布的
技術 235
10.4.1 暗發(fā)布 235
10.4.2 功能標記 236
10.5 小結 237
第四部分 可觀測性和所有權
第 11章 構建監(jiān)控系統(tǒng) 241
11.1 穩(wěn)固的監(jiān)控技術!241
11.1.1 良好的分層監(jiān)控 243
11.1.2 黃金標志 244
11.1.3 度量指標的類型 244
11.1.4 實踐建議 245
11.2 利用Prometheus和Grafana監(jiān)控
SimpleBank 246
11.2.1 配置度量指標收集基礎
設施 247
11.2.2 收集基礎設施度量
指標——RabbitMQ 253
11.2.3 監(jiān)控下單功能 255
11.2.4 告警設置 257
11.3 生成合理的可執(zhí)行的告警 261
11.3.1 系統(tǒng)出錯時哪些人需要
知悉 261
11.3.2 癥狀,而非原因 262
11.4 監(jiān)測整個應用 262
11.5 小結 264
第 12章 使用日志和鏈路追蹤了解系統(tǒng)
行為 265
12.1 了解服務間的行為 265
12.2 生成一致的、結構化的、人類可讀的
日志 268
12.2.1 日志中的有用信息 268
12.2.2 結構化和可讀性 269
12.3 為SimpleBank配置日志基礎設施 271
12.3.1 基于ELK和Fluentd的解決
方案 272
12.3.2 配置日志解決方案 274
12.3.3 配置應收集哪些日志 276
12.3.4 大海撈針 279
12.3.5 記錄合適的信息 281
12.4 服務間的跟蹤交互 281
12.4.1 請求關聯(lián):trace和span 282
12.4.2 在服務內配置鏈路追蹤 283
12.5 鏈路追蹤可視化 287
12.6 小結 291
第 13章 微服務團隊建設 292
13.1 建設高效團隊 292
13.1.1 康威定律 294
13.1.2 高效團隊原則 294
13.2 團隊模型 296
13.2.1 按職能分組 296
13.2.2 跨職能分組 298
13.2.3 設置團隊邊界 299
13.2.4 基礎設施、平臺和產(chǎn)品 300
13.2.5 誰負責值班 302
13.2.6 知識共享 303
13.3 微服務團隊的實踐建議 304
13.3.1 微服務變更的驅動力 305
13.3.2 架構的角色 305
13.3.3 同質性與技術靈活性 307
13.3.4 開源模型 307
13.3.5 設計評審 308
13.3.6 動態(tài)文檔 309
13.3.7 回答應用的問題 310
13.4 延伸閱讀 311
13.5 小結 311
附錄A 在Minikube上安裝Jenkins 312