內容提要
《分散式服務架構:原理、設計與實戰》全面介紹了分散式服務架構的原理與設計,並結合作者在實施微服務架構過程中的實踐經驗,總結了保障線上服務健康、可靠的最佳方案,是一本架構級、實戰型的重量級著作。
《分散式服務架構:原理、設計與實戰》以分散式服務架構的設計與實現為主線,由淺入深地介紹了分散式服務架構的方方面面,主要包括理論和實踐兩部分。理論上,首先介紹了服務架構的背景,以及從服務化架構到微服務架構的演化;然後提出了保證分散式服務系統架構一致性的方案和模式,並介紹了網際網路架構評審的方法論;最後給出了一個簡要的非功能質量的技術評審提綱。實踐上,首先提供了一個網際網路項目的性能和容量評估的真實案例,介紹了壓測的方案設計和最佳實踐,這些技術能夠全面保證大規模、高並發項目的一致性、可用性和高並發性;然後講解了大規模服務的日誌系統的原理、設計與實踐,包括ELK等框架的特點和使用方式等,並介紹了當前流行的APM系統的設計與實現,主要包括調用鏈和業務鏈的跟蹤與恢復,涵蓋了線上應急和技術攻關的流程及重點,也結合服務化系統線上應急過程進行分析並總結了其中需要用到的Java虛擬機、Linux和定製化腳本等命令,這些命令都是每個開發人員都會用到的解決線上問題的利器;最後,闡述了系統服務的容器化過程,並詳細介紹了敏捷開發流程和實現自動化的常用工具等,讓讀者既能學到架構設計的基礎理論,也能結合書中的原理、設計與方法論來解決大規模、高並發網際網路項目中的現實問題。
無論是對於軟體工程師、測試工程師、運維工程師、軟體架構師、技術經理、技術總監,還是對於資深IT人士來說,《分散式服務架構:原理、設計與實戰》都有很強的借鑑性和參考價值。
目錄
第1章 分散式微服務架構設計原理 1
1.1 從傳統單體架構到服務化架構 2
1.1.1 JEE架構 2
1.1.2 SSH架構 5
1.1.3 服務化架構 8
1.2 從服務化到微服務 11
1.2.1 微服務架構的產生 12
1.2.2 微服務架構與傳統單體架構的對比 13
1.2.3 微服務架構與SOA服務化的對比 15
1.3 微服務架構的核心要點和實現原理 16
1.3.1 微服務架構中職能團隊的劃分 16
1.3.2 微服務的去中心化治理 18
1.3.3 微服務的互動模式 18
1.3.4 微服務的分解和組合模式 22
1.3.5 微服務的容錯模式 35
1.3.6 微服務的粒度 41
1.4 Java平台微服務架構的項目組織形式 42
1.4.1 微服務項目的依賴關係 42
1.4.2 微服務項目的層級結構 43
1.4.3 微服務項目的持續發布 45
1.5 服務化管理和治理框架的技術選型 45
1.5.1 RPC 46
1.5.2 服務化 47
1.5.3 微服務 49
1.6 本章小結 52
第2章 徹底解決分散式系統一致性的問題 54
2.1 什麼是一致性 55
2.2 一致性問題 56
2.3 解決一致性問題的模式和思路 57
2.3.1 酸鹼平衡理論 58
2.3.2 分散式一致性協定 61
2.3.3 保證最終一致性的模式 67
2.4 逾時處理模式 75
2.4.1 微服務的互動模式 76
2.4.2 同步與異步的抉擇 77
2.4.3 互動模式下逾時問題的解決方案 78
2.4.4 逾時補償的原則 85
2.5 遷移開關的設計 87
2.6 本章小結 88
第3章 服務化系統容量評估和性能保障 89
3.1 架構設計與非功能質量 90
3.2 全面的非功能質量需求 91
3.2.1 非功能質量需求的概述 91
3.2.2 非功能質量需求的具體指標 92
3.3 典型的技術評審提綱 97
3.3.1 現狀 97
3.3.2 需求 98
3.3.3 方案描述 98
3.3.4 方案對比 99
3.3.5 風險評估 100
3.3.6 工作量評估 100
3.4 性能和容量評估經典案例 100
3.4.1 背景 100
3.4.2 目標數據量級 101
3.4.3 量級評估標準 101
3.4.4 方案 102
3.4.5 小結 107
3.5 性能評估參考標準 108
3.5.1 常用的套用層性能指標參考標準 108
3.5.2 常用的系統層性能指標參考標準 109
3.6 性能測試方案的設計和最佳實踐 112
3.6.1 明確壓測目標 112
3.6.2 壓測場景設計和壓測方案制定 114
3.6.3 準備壓測環境 121
3.6.4 壓測的執行 122
3.6.5 問題修復和系統最佳化 123
3.7 有用的壓測工具 123
3.7.1 ab 123
3.7.2 jmeter 125
3.7.3 mysqlslap 125
3.7.4 sysbench 129
3.7.5 dd 134
3.7.6 LoadRunner 135
3.7.7 hprof 136
3.8 本章小結 138
第4章 大數據日誌系統的構建 140
4.1 開源日誌框架的原理分析與套用實踐 142
4.1.1 JDK Logger 142
4.1.2 Apache Commons Logging 143
4.1.3 Apache Log4j 147
4.1.4 Slf4j 156
4.1.5 Logback 160
4.1.6 Apache Log4j 2 164
4.2 日誌系統的最佳化和最佳實踐 168
4.2.1 開發人員的日誌意識 168
4.2.2 日誌級別的設定 168
4.2.3 日誌的數量和大小 169
4.2.4 切割方式 170
4.2.5 日誌格式的配置 170
4.2.6 一行日誌導致的線上事故 177
4.3 大數據日誌系統的原理與設計 178
4.3.1 通用架構和設計 179
4.3.2 日誌採集器 180
4.3.3 日誌緩衝佇列 186
4.3.4 日誌解析器 187
4.3.5 日誌存儲和搜尋 187
4.3.6 日誌展示系統 188
4.3.7 監控和報警 188
4.3.8 日誌系統的容量和性能評估 188
4.4 ELK系統的構建與使用 190
4.4.1 Elasticsearch 191
4.4.2 Logstash 193
4.4.3 Kibana 196
4.5 本章小結 198
第5章 基於調用鏈的服務治理系統的設計與實現 199
5.1 APM系統簡介 200
5.1.1 優秀的開源APM系統 200
5.1.2 國內商業APM產品的介紹 202
5.2 調用鏈跟蹤的原理 203
5.2.1 分散式系統的遠程調用過程 204
5.2.2 TraceID 207
5.2.3 SpanID 208
5.2.4 業務鏈 210
5.3 調用鏈跟蹤系統的設計與實現 211
5.3.1 整體架構 211
5.3.2 TraceID和SpanID在服務間的傳遞 213
5.3.3 採集器的設計與實現 217
5.3.4 處理器的設計與實現 222
5.3.5 調用鏈系統的展示 225
5.4 本章小結 226
第6章 Java服務的線上應急和技術攻關 227
6.1 海恩法則和墨菲定律 227
6.2 線上應急的目標、原則和方法 229
6.2.1 應急目標 229
6.2.2 應急原則 229
6.2.3 線上應急的方法和流程 230
6.3 技術攻關的方法論 233
6.4 環境搭建和示例服務啟動 236
6.5 高效的服務化治理腳本 240
6.5.1 show-busiest-java-threads 240
6.5.2 find-in-jar 243
6.5.3 grep-in-jar 244
6.5.4 jar-conflict-detect 245
6.5.5 http-spy 247
6.5.6 show-mysql-qps 248
6.5.7 小結 249
6.6 JVM提供的監控命令 249
6.6.1 jad 249
6.6.2 btrace 250
6.6.3 jmap 252
6.6.4 jstat 255
6.6.5 jstack 256
6.6.6 jinfo 258
6.6.7 其他命令 258
6.6.8 小結 259
6.7 重要的Linux基礎命令 260
6.7.1 必不可少的基礎命令和工具 260
6.7.2 查看活動進程的命令 268
6.7.3 窺探記憶體的命令 270
6.7.4 針對CPU使用情況的監控命令 272
6.7.5 監控磁碟I/O的命令 273
6.7.6 查看網路信息和網路監控命令 275
6.7.7 Linux系統的高級工具 287
6.7.8 /proc檔案系統 288
6.7.9 摘要命令 288
6.7.10 小結 290
6.8 現實中的應急和攻關案例 291
6.8.1 一次OOM事故的分析和定位 291
6.8.2 一次CPU 100%的線上事故排查 301
6.9 本章小結 304
第7章 服務的容器化過程 306
7.1 容器vs虛擬機 306
7.1.1 什麼是虛擬機 306
7.1.2 什麼是容器 306
7.1.3 容器和虛擬機的區別 307
7.1.4 容器主要解決的問題 307
7.1.5 Docker的優勢 310
7.2 Docker實戰 311
7.2.1 Docker的架構 311
7.2.2 Docker的安裝 315
7.2.3 Docker初體驗 319
7.2.4 Docker後台服務的管理 322
7.2.5 Docker的客戶端命令 328
7.2.6 Docker Compose編排工具的使用 372
7.3 容器化項目 379
7.3.1 傳統的套用部署 380
7.3.2 將應用程式部署在虛擬機上 380
7.3.3 容器化部署套用 381
7.3.4 Docker實現的套用容器化示例 382
7.4 本章小結 384
第8章 敏捷開發2.0的自動化工具 385
8.1 什麼是敏捷開發2.0 385
8.1.1 常用的4種開發模式 385
8.1.2 什麼是DevOps 390
8.1.3 敏捷開發2.0解決的問題 392
8.2 敏捷開發的自動化流程 393
8.2.1 持續集成 393
8.2.2 持續交付和持續部署 397
8.3 敏捷開發的常用自動化工具 400
8.3.1 分散式版本控制工具Git 400
8.3.2 持續集成和持續交付工具Jenkins 410
8.3.3 基礎平台管理工具SaltStack 418
8.3.4 Docker容器化工具 421
8.4 本章小結 422