本書全面介紹了微服務(wù)的建模、集成、測(cè)試、部署和監(jiān)控,通過(guò)一個(gè)虛構(gòu)的公司講解了如何建立微服務(wù)架構(gòu)。主要內(nèi)容包括認(rèn)識(shí)微服務(wù)在保證系統(tǒng)設(shè)計(jì)與組織目標(biāo)統(tǒng)一上的重要性,學(xué)會(huì)把服務(wù)集成到已有系統(tǒng)中,采用遞增手段拆分單塊大型應(yīng)用,通過(guò)持續(xù)集成部署微服務(wù),等等。
過(guò)去十年中,分布式系統(tǒng)的粒度變得越來(lái)越細(xì),包含大量代碼的單塊應(yīng)用逐漸轉(zhuǎn)變?yōu)樽园奈⒎⻊?wù)。但開發(fā)微服務(wù)系統(tǒng)也有一些讓人頭疼的問(wèn)題。本書通過(guò)大量的例子,全面討論了系統(tǒng)架構(gòu)師和管理員在構(gòu)建、管理和演化微服務(wù)架構(gòu)時(shí)必須考慮的問(wèn)題,并給出了實(shí)用的建議。 本書不但詳細(xì)地闡述了微服務(wù)的基本概念,而且還深入探究了如何對(duì)自治服務(wù)進(jìn)行建模、集成、測(cè)試、部署及監(jiān)控。書中虛構(gòu)了某個(gè)領(lǐng)域的一家公司,來(lái)幫助讀者學(xué)習(xí)微服務(wù)架構(gòu)是如何影響一個(gè)領(lǐng)域的。 了解微服務(wù)如何將系統(tǒng)設(shè)計(jì)與組織目標(biāo)相匹配 掌握將一個(gè)服務(wù)和現(xiàn)有系統(tǒng)進(jìn)行集成的不同方式 使用增量式的做法拆分單塊代碼庫(kù) 通過(guò)持續(xù)集成部署各個(gè)微服務(wù) 審視對(duì)分布式系統(tǒng)進(jìn)行測(cè)試和監(jiān)控的復(fù)雜性 管理“用戶-服務(wù)”和“服務(wù)-服務(wù)”兩種模式下的安全性 理解微服務(wù)架構(gòu)在規(guī);矫嫠媾R的問(wèn)題
Sam Newman是ThoughtWorks公司的技術(shù)專家、ThoughtWorks內(nèi)部系統(tǒng)架構(gòu)師,同時(shí)還為全球的客戶提供咨詢服務(wù)。他在開發(fā)和IT運(yùn)維方面與全球多個(gè)領(lǐng)域的公司有過(guò)合作。
前言 xiv
第1 章 微服務(wù) 1
1.1 什么是微服務(wù) 2
1.1.1 很小,專注于做好一件事 2
1.1.2 自治性 3
1.2 主要好處 3
1.2.1 技術(shù)異構(gòu)性 3
1.2.2 彈性 4
1.2.3 擴(kuò)展 5
1.2.4 簡(jiǎn)化部署 5
1.2.5 與組織結(jié)構(gòu)相匹配 6
1.2.6 可組合性 6
1.2.7 對(duì)可替代性的優(yōu)化 6
1.3 面向服務(wù)的架構(gòu) 7
1.4 其他分解技術(shù) 7
1.4.1 共享庫(kù) 8
1.4.2 模塊 8
1.5 沒(méi)有銀彈 9
1.6 小結(jié) 10
第2 章 演化式架構(gòu)師 11
2.1 不準(zhǔn)確的比較 11
2.2 架構(gòu)師的演化視角 12
2.3 分區(qū) 14
2.4 一個(gè)原則性的方法 15
2.4.1 戰(zhàn)略目標(biāo) 15
2.4.2 原則 15
2.4.3 實(shí)踐 16
2.4.4 將原則和實(shí)踐相結(jié)合 16
2.4.5 真實(shí)世界的例子 16
2.5 要求的標(biāo)準(zhǔn) 17
2.5.1 監(jiān)控 18
2.5.2 接口 18
2.5.3 架構(gòu)安全性 18
2.6 代碼治理 18
2.6.1 范例 19
2.6.2 裁剪服務(wù)代碼模板 19
2.7 技術(shù)債務(wù) 20
2.8 例外管理 21
2.9 集中治理和領(lǐng)導(dǎo) 21
2.10 建設(shè)團(tuán)隊(duì) 22
2.11 小結(jié) 23
第3 章 如何建模服務(wù) 24
3.1 MusicCorp 簡(jiǎn)介 24
3.2 什么樣的服務(wù)是好服務(wù) 25
3.2.1 松耦合 25
3.2.2 高內(nèi)聚 25
3.3 限界上下文 26
3.3.1 共享的隱藏模型 26
3.3.2 模塊和服務(wù) 27
3.3.3 過(guò)早劃分 28
3.4 業(yè)務(wù)功能 28
3.5 逐步劃分上下文 29
3.6 關(guān)于業(yè)務(wù)概念的溝通 30
3.7 技術(shù)邊界 30
3.8 小結(jié) 31
第4 章 集成 32
4.1 尋找理想的集成技術(shù) 32
4.1.1 避免破壞性修改 32
4.1.2 保證API 的技術(shù)無(wú)關(guān)性 32
4.1.3 使你的服務(wù)易于消費(fèi)方使用 33
4.1.4 隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié) 33
4.2 為用戶創(chuàng)建接口 33
4.3 共享數(shù)據(jù)庫(kù) 33
4.4 同步與異步 35
4.5 編排與協(xié)同 35
4.6 遠(yuǎn)程過(guò)程調(diào)用 38
4.6.1 技術(shù)的耦合 38
4.6.2 本地調(diào)用和遠(yuǎn)程調(diào)用并不相同 39
4.6.3 脆弱性 39
4.6.4 RPC 很糟糕嗎 40
4.7 REST 41
4.7.1 REST 和HTTP 41
4.7.2 超媒體作為程序狀態(tài)的引擎 42
4.7.3 JSON、XML 還是其他 44
4.7.4 留心過(guò)多的約定 44
4.7.5 基于HTTP 的REST 的缺點(diǎn) 45
4.8 實(shí)現(xiàn)基于事件的異步協(xié)作方式 46
4.8.1 技術(shù)選擇 46
4.8.2 異步架構(gòu)的復(fù)雜性 47
4.9 服務(wù)即狀態(tài)機(jī) 48
4.10 響應(yīng)式擴(kuò)展 48
4.11 微服務(wù)世界中的DRY 和代碼重用的危險(xiǎn) 49
4.12 按引用訪問(wèn) 50
4.13 版本管理 51
4.13.1 盡可能推遲 51
4.13.2 及早發(fā)現(xiàn)破壞性修改 52
4.13.3 使用語(yǔ)義化的版本管理 53
4.13.4 不同的接口共存 53
4.13.5 同時(shí)使用多個(gè)版本的服務(wù) 54
4.14 用戶界面 55
4.14.1 走向數(shù)字化 56
4.14.2 約束 56
4.14.3 API 組合 57
4.14.4 UI 片段的組合 57
4.14.5 為前端服務(wù)的后端 59
4.14.6 一種混合方式 60
4.15 與第三方軟件集成 61
4.15.1 缺乏控制 61
4.15.2 定制化 62
4.15.3 意大利面式的集成 62
4.15.4 在自己可控的平臺(tái)進(jìn)行定制化 62
4.15.5 絞殺者模式 64
4.16 小結(jié) 65
第5 章 分解單塊系統(tǒng) 66
5.1 關(guān)鍵是接縫 66
5.2 分解MusicCorp 67
5.3 分解單塊系統(tǒng)的原因 68
5.3.1 改變的速度 68
5.3.2 團(tuán)隊(duì)結(jié)構(gòu) 68
5.3.3 安全 68
5.3.4 技術(shù) 68
5.4 雜亂的依賴 69
5.5 數(shù)據(jù)庫(kù) 69
5.6 找到問(wèn)題的關(guān)鍵 69
5.7 例子:打破外鍵關(guān)系 70
5.8 例子:共享靜態(tài)數(shù)據(jù) 71
5.9 例子:共享數(shù)據(jù) 72
5.10 例子:共享表 73
5.11 重構(gòu)數(shù)據(jù)庫(kù) 74
5.12 事務(wù)邊界 75
5.12.1 再試一次 76
5.12.2 終止整個(gè)操作 77
5.12.3 分布式事務(wù) 77
5.12.4 應(yīng)該怎么辦呢 78
5.13 報(bào)告 78
5.14 報(bào)告數(shù)據(jù)庫(kù) 78
5.15 通過(guò)服務(wù)調(diào)用來(lái)獲取數(shù)據(jù) 80
5.16 數(shù)據(jù)導(dǎo)出 81
5.17 事件數(shù)據(jù)導(dǎo)出 82
5.18 數(shù)據(jù)導(dǎo)出的備份 83
5.19 走向?qū)崟r(shí) 84
5.20 修改的代價(jià) 84
5.21 理解根本原因 84
5.22 小結(jié) 85
第6 章 部署 86
6.1 持續(xù)集成簡(jiǎn)介 86
6.2 把持續(xù)集成映射到微服務(wù) 87
6.3 構(gòu)建流水線和持續(xù)交付 90
6.4 平臺(tái)特定的構(gòu)建物 91
6.5 操作系統(tǒng)構(gòu)建物 92
6.6 定制化鏡像 93
6.6.1 將鏡像作為構(gòu)建物 94
6.6.2 不可變服務(wù)器 95
6.7 環(huán)境 95
6.8 服務(wù)配置 96
6.9 服務(wù)與主機(jī)之間的映射 97
6.9.1 單主機(jī)多服務(wù) 97
6.9.2 應(yīng)用程序容器 99
6.9.3 每個(gè)主機(jī)一個(gè)服務(wù) 100
6.9.4 平臺(tái)即服務(wù) 101
6.10 自動(dòng)化 101
6.11 從物理機(jī)到虛擬機(jī) 102
6.11.1 傳統(tǒng)的虛擬化技術(shù) 103
6.11.2 Vagrant 104
6.11.3 Linux 容器 104
6.11.4 Docker 106
6.12 一個(gè)部署接口 107
6.13 小結(jié) 109
第7 章 測(cè)試 110
7.1 測(cè)試類型 110
7.2 測(cè)試范圍 111
7.2.1 單元測(cè)試 112
7.2.2 服務(wù)測(cè)試 113
7.2.3 端到端測(cè)試 114
7.2.4 權(quán)衡 114
7.2.5 比例 115
7.3 實(shí)現(xiàn)服務(wù)測(cè)試 115
7.3.1 mock 還是打樁 115
7.3.2 智能的打樁服務(wù) 116
7.4 微妙的端到端測(cè)試 117
7.5 端到端測(cè)試的缺點(diǎn) 118
7.6 脆弱的測(cè)試 118
7.6.1 誰(shuí)來(lái)寫這些測(cè)試 119
7.6.2 測(cè)試多長(zhǎng)時(shí)間 119
7.6.3 大量的堆積 120
7.6.4 元版本 120
7.7 測(cè)試場(chǎng)景,而不是故事 121
7.8 拯救消費(fèi)者驅(qū)動(dòng)的測(cè)試 121
7.8.1 Pact 123
7.8.2 關(guān)于溝通 124
7.9 還應(yīng)該使用端到端測(cè)試嗎 124
7.10 部署后再測(cè)試 125
7.10.1 區(qū)分部署和上線 125
7.10.2 金絲雀發(fā)布 126
7.10.3 平均修復(fù)時(shí)間勝過(guò)平均故障間隔時(shí)間 127
7.11 跨功能的測(cè)試 128
7.12 小結(jié) 129
第8 章 監(jiān)控 131
8.1 單一服務(wù),單一服務(wù)器 132
8.2 單一服務(wù),多個(gè)服務(wù)器 132
8.3 多個(gè)服務(wù),多個(gè)服務(wù)器 133
8.4 日志,日志,更多的日志 134
8.5 多個(gè)服務(wù)的指標(biāo)跟蹤 135
8.6 服務(wù)指標(biāo) 135
8.7 綜合監(jiān)控 136
8.8 關(guān)聯(lián)標(biāo)識(shí) 137
8.9 級(jí)聯(lián) 139
8.10 標(biāo)準(zhǔn)化 139
8.11 考慮受眾 140
8.12 未來(lái) 140
8.13 小結(jié) 141
第9 章 安全 143
9.1 身份驗(yàn)證和授權(quán) 143
9.1.1 常見的單點(diǎn)登錄實(shí)現(xiàn) 144
9.1.2 單點(diǎn)登錄網(wǎng)關(guān) 145
9.1.3 細(xì)粒度的授權(quán) 146
9.2 服務(wù)間的身份驗(yàn)證和授權(quán) 146
9.2.1 在邊界內(nèi)允許一切 146
9.2.2 HTTP(S) 基本身份驗(yàn)證 147
9.2.3 使用SAML 或OpenID Connect 148
9.2.4 客戶端證書 148
9.2.5 HTTP 之上的HMAC 149
9.2.6 API 密鑰 149
9.2.7 代理問(wèn)題 150
9.3 靜態(tài)數(shù)據(jù)的安全 152
9.3.1 使用眾所周知的加密算法 152
9.3.2 一切皆與密鑰相關(guān) 153
9.3.3 選擇你的目標(biāo) 153
9.3.4 按需解密 153
9.3.5 加密備份 153
9.4 深度防御 154
9.4.1 防火墻 154
9.4.2 日志 154
9.4.3 入侵檢測(cè)(和預(yù)防)系統(tǒng) 154
9.4.4 網(wǎng)絡(luò)隔離 155
9.4.5 操作系統(tǒng) 155
9.5 一個(gè)示例 156
9.6 保持節(jié)儉 158
9.7 人的因素 158
9.8 黃金法則 158
9.9 內(nèi)建安全 159
9.10 外部驗(yàn)證 159
9.11 小結(jié) 159
第10 章 康威定律和系統(tǒng)設(shè)計(jì) 161
10.1 證據(jù) 161
10.1.1 松耦合組織和緊耦合組織 162
10.1.2 Windows Vista 162
10.2 Netflix 和Amazon 162
10.3 我們可以做什么 163
10.4 適應(yīng)溝通途徑 163
10.5 服務(wù)所有權(quán) 164
10.6 共享服務(wù)的原因 164
10.6.1 難以分割 164
10.6.2 特性團(tuán)隊(duì) 164
10.6.3 交付瓶頸 165
10.7 內(nèi)部開源 166
10.7.1 守護(hù)者的角色 166
10.7.2 成熟 166
10.7.3 工具 167
10.8 限界上下文和團(tuán)隊(duì)結(jié)構(gòu) 167
10.9 孤兒服務(wù) 167
10.10 案例研究:RealEstate.com.a(chǎn)u 168
10.11 反向的康威定律 169
10.12 人 170
10.13 小結(jié) 170
第11 章 規(guī);⒎⻊(wù) 171
11.1 故障無(wú)處不在 171
11.2 多少是太多 172
11.3 功能降級(jí) 173
11.4 架構(gòu)性安全措施 174
11.5 反脆弱的組織 175
11.5.1 超時(shí) 176
11.5.2 斷路器 176
11.5.3 艙壁 178
11.5.4 隔離 179
11.6 冪等 179
11.7 擴(kuò)展 180
11.7.1 更強(qiáng)大的主機(jī) 181
11.7.2 拆分負(fù)載 181
11.7.3 分散風(fēng)險(xiǎn) 181
11.7.4 負(fù)載均衡 182
11.7.5 基于worker 的系統(tǒng) 184
11.7.6 重新設(shè)計(jì) 184
11.8 擴(kuò)展數(shù)據(jù)庫(kù) 185
11.8.1 服務(wù)的可用性和數(shù)據(jù)的持久性 185
11.8.2 擴(kuò)展讀取 185
11.8.2 擴(kuò)展寫操作 186
11.8.4 共享數(shù)據(jù)庫(kù)基礎(chǔ)設(shè)施 187
11.8.5 CQRS 187
11.9 緩存 188
11.9.1 客戶端、 代理和服務(wù)器端緩存 188
11.9.2 HTTP 緩存 189
11.9.3 為寫使用緩存 190
11.9.4 為彈性使用緩存 190
11.9.5 隱藏源服務(wù) 191
11.9.6 保持簡(jiǎn)單 191
11.9.7 緩存中毒:一個(gè)警示 192
11.10 自動(dòng)伸縮 192
11.11 CAP 定理 193
11.11.1 犧牲一致性 194
11.11.2 犧牲可用性 195
11.11.3 犧牲分區(qū)容忍性 195
11.11.4 AP 還是CP 196
11.11.5 這不是全部或全不 196
11.11.6 真實(shí)世界 197
11.12 服務(wù)發(fā)現(xiàn) 197
11.13 動(dòng)態(tài)服務(wù)注冊(cè) 199
11.13.1 Zookeeper 199
11.13.2 Consul 200
11.13.4 構(gòu)造你自己的系統(tǒng) 201
11.13.5 別忘了人 201
11.14 文檔服務(wù) 201
11.14.1 Swagger 202
11.14.2 HAL 和HAL 瀏覽器 202
11.15 自描述系統(tǒng) 203
11.16 小結(jié) 203
第12 章 總結(jié) 204
12.1 微服務(wù)的原則 204
12.1.1 圍繞業(yè)務(wù)概念建模 205
12.1.2 接受自動(dòng)化文化 205
12.1.3 隱藏內(nèi)部實(shí)現(xiàn)細(xì)節(jié) 205
12.1.4 讓一切都去中心化 206
12.1.5 可獨(dú)立部署 206
12.1.6 隔離失敗 206
12.1.7 高度可觀察 207
12.2 什么時(shí)候你不應(yīng)該使用微服務(wù) 207
12.3 臨別贈(zèng)言 208
關(guān)于作者 209
關(guān)于封面 209