本書完整介紹了Java軟件開發的整個生命周期,還結合大量的成功實踐經驗,介紹了每個階段可能會使用到的工具和技能。在基礎設施已經極大完善的今天,本書還與時俱進地介紹了如何在Docker、Kubernetes、Cloud、FaaS等新興環境下進行持續集成和持續交付。
Daniel Bryant 是Datawire 的獨立技術顧問和產品架構師。他專注于通過發現價值流、創建構建管道以及實施有效的測試策略,在組織內實施持續交付。Daniel 在技術上擅長DevOps 工具、云計算/ 容器平臺和微服務實現。他還是一名Java 社區領袖,為幾個開源項目做出過貢獻,也為InfoQ、O’Reilly 和Voxxed 撰寫文章,并且會定期出席OSCON、QCon 和JavaOne 等國際會議。Abraham Marin-Perez 是一名Java 和Scala 開發人員,在金融、出版和公共部門等行業擁有超過10 年的經驗。他還幫助管理倫敦Java 社區,并在Meet a Mentor London小組提供職業發展方面的建議。Abraham 喜歡與其他人分享他的經驗,因此經常會在JavaOne 或者Devoxx UK 等國際活動上發表演講,并在InfoQ 上發表Java 方面的新聞。他還是Real-World Maintainable Software (O’Reilly) 一書的作者。Abraham 目前居住在倫敦,喜歡在天氣好的時候外出徒步,或者天氣不好的時候在家烹飪。
張若飛,TGO會員,曾任易通貸CTO,宜人貸首席架構師,在雅虎北研、金山云、POLYCOM等知名公司擔任架構師。十余年互聯網研發及技術管理經驗,管理過超過百人的技術研發團隊,對搭建海量數據、大型分布式系統有豐富經驗,對互聯網金融領域有廣泛涉獵。著有十余本技術譯著,包括《云原生Java:Spring Boot、Spring Cloud與Cloud Foundry彈性系統設計》《面向可伸縮架構》《代碼不朽:編寫可維護軟件的十大則》《給大忙人看的JavaSE 8》《Grails權威指南》等書,總計300余萬字。
第 1 章 持續交付 :為什么需要持續交付,什么是持續交付....................1
入門知識 .......................................................................................................................1
賦能開發者 :為什么我們要持續交付 ..........................................................................2
快速反饋會減少上下文切換 .................................................................................2
自動化的、可重復的以及可靠的發布...................................................................2
定義“完成”的概念 .............................................................................................3
什么是構建管道 ............................................................................................................4
核心的構建管道階段 .............................................................................................4
容器技術的影響 ....................................................................................................7
對當前架構的影響 ................................................................................................8
總結 ..............................................................................................................................9
第 2 章 Java 開發的演化..............................................................10
現代 Java 應用程序的需求 .......................................................................................... 10
對業務增長速度和穩定性的要求 ........................................................................ 11
API 經濟的崛起 .................................................................................................. 11
云計算的機會和成本 ........................................................................................... 12
模塊化歸來 :擁抱更小的服務 ............................................................................ 12
對持續交付的影響 .............................................................................................. 13
Java 部署平臺的演化 .................................................................................................. 13
WAR 和 EAR :應用服務器統治的年代 .............................................................. 13
可執行的胖 JAR 文件 :十二要素風格應用的出現 ............................................. 14
容器鏡像 :不斷增加的可移植性(以及復雜性) ................................................ 15
函數即服務 :“無服務器”架構的出現 ............................................................... 16
平臺對持續交付的影響 ....................................................................................... 17
DevOps、SRE 和發布工程 ......................................................................................... 17
研發和運維.......................................................................................................... 18
站點可靠性工程 .................................................................................................. 19
發布工程 ............................................................................................................. 21
共享責任、指標和可觀察性 ............................................................................... 22
總結 ............................................................................................................................ 22
第 3 章 設計持續交付的架構..........................................................24
優秀架構的基礎 .......................................................................................................... 24
松耦合 ................................................................................................................. 25
高內聚 ................................................................................................................. 25
耦合、內聚和持續交付 ....................................................................................... 26
面向業務敏捷的架構 .................................................................................................. 27
不好的架構會限制業務的發展 ............................................................................ 27
復雜性和變更成本 .............................................................................................. 28
API 驅動的應用程序的最佳實踐 ................................................................................ 29
“自上而下”構建 API ......................................................................................... 29
良好的 API 有助于持續測試和集成 .................................................................... 29
部署平臺和架構 .......................................................................................................... 30
設計符合“十二要素”的云原生應用程序 ......................................................... 30
培養機械同理心 .................................................................................................. 33
面向失敗的設計和持續測試 ............................................................................... 33
越來越小的服務 .......................................................................................................... 34
交付單體應用程序的挑戰 ................................................................................... 34
微服務 :當 SOA 遇到領域驅動設計 .................................................................. 35
函數、lambda 表達式和納米服務(Nanoservices) ............................................. 36
架構 :“難以改變的東西” ........................................................................................... 37
總結 ............................................................................................................................ 38
第 4 章 Java 應用的部署平臺、基礎設施以及持續交付......................39
由平臺提供的功能性 .................................................................................................. 39
基本的開發流程 .......................................................................................................... 40
傳統的基礎設施平臺 .................................................................................................. 41
傳統的平臺組件 .................................................................................................. 41
傳統基礎設施平臺面臨的挑戰 ............................................................................ 41
傳統基礎設施的好處 ........................................................................................... 42
傳統基礎設施平臺上的 CI / CD .......................................................................... 42
云平臺 ......................................................................................................................... 43
深入云計算.......................................................................................................... 43
云計算面臨的挑戰 .............................................................................................. 45
云計算的好處 ...................................................................................................... 46
云計算中的持續交付 ........................................................................................... 47
平臺即服務 ................................................................................................................. 47
簡單了解 PaaS 的原理 ......................................................................................... 48
PaaS 平臺面臨的挑戰.......................................................................................... 48
PaaS 的好處 ........................................................................................................ 50
CI/CD 和 PaaS ..................................................................................................... 50
容器(Docker) ........................................................................................................... 50
容器平臺組件 ...................................................................................................... 51
容器面臨的挑戰 .................................................................................................. 52
容器的好處.......................................................................................................... 53
持續交付容器 ...................................................................................................... 53
Kubernetes .................................................................................................................. 53
Kubernetes 的核心概念 ....................................................................................... 54
Kubernetes 面臨的挑戰 ....................................................................................... 54
Kubernetes 的好處 ............................................................................................... 55
Kubernetes 的持續交付 ....................................................................................... 56
函數即服務 / 無服務器函數 ........................................................................................ 56
FaaS 的概念 ........................................................................................................ 57
FaaS 面臨的挑戰 ................................................................................................. 57
FaaS 的好處 ........................................................................................................ 58
CI/CD 和 FaaS ..................................................................................................... 59
使用基礎設施即代碼 .................................................................................................. 59
總結 ............................................................................................................................ 60
第 5 章 構建 Java 應用程序..........................................................61
分解構建過程 ............................................................................................................. 61
自動化構建過程 .......................................................................................................... 62
構建依賴 ............................................................................................................. 63
外部依賴 ............................................................................................................. 66
多模塊項目.......................................................................................................... 67
使用多代碼庫還是單代碼庫 ............................................................................... 67
插件 ..................................................................................................................... 68
發布和公開構件 .................................................................................................. 69
Java 構建工具概述 ...................................................................................................... 69
Ant ...................................................................................................................... 69
Maven .................................................................................................................. 72
Gradle .................................................................................................................. 77
Bazel、Pants 和 Buck .......................................................................................... 80
其他 JVM 構建工具 :SBT 和 Leiningen ............................................................. 82
Make ................................................................................................................... 82
如何選擇一個構建工具............................................................................................... 83
總結 ............................................................................................................................ 84
第 6 章 其他構建工具和技巧..........................................................86
Linux、Bash 和基本的 CLI 命令 ................................................................................ 86
用戶、權限和組 .................................................................................................. 86
使用文件系統 ...................................................................................................... 90
查看和編輯文本 .................................................................................................. 92
將所有東西連在一起 :重定向、管道和過濾器 .................................................. 93
搜索和操作文本 :grep、awk 和 sed ................................................................... 94
診斷工具 :top、ps、netstat 和 iostat .................................................................. 95
HTTP 調用和 JSON 操作 ............................................................................................ 96
curl ...................................................................................................................... 96
HTTPie .............................................................................................................. 100
jq ....................................................................................................................... 104
編寫基礎腳本 ........................................................................................................... 105
xargs .................................................................................................................. 105
管道和過濾器 .................................................................................................... 105
循環 ................................................................................................................... 106
條件 ................................................................................................................... 106
總結 .......................................................................................................................... 107
第 7 章 打包應用程序.................................................................108
構建一個 JAR 文件 :循序漸進 ................................................................................ 108
構建一個可執行的胖 JAR 文件 ................................................................................ 112
Maven Shade 插件 ............................................................................................. 113
構建 Spring Boot Uber JAR 文件 ...................................................................... 116
瘦 JAR 文件 — 為什么我們決定不使用胖 JAR ...................................................... 117
構建 WAR 文件 ......................................................................................................... 118
在云平臺上打包 ........................................................................................................ 120
將部署比作烹飪 :烘焙式部署還是煎炸式部署 ................................................ 120
構建 RPM 和 DEB OS 包 .................................................................................. 121
其他構建 OS 包的工具(支持 Windows) ......................................................... 124
使用 Packer 創建可在多個云平臺部署的機器鏡像 ........................................... 126
創建機器鏡像的其他工具 ................................................................................. 129
構建容器 ................................................................................................................... 129
創建 Docker 容器鏡像 ....................................................................................... 130
使用 fabric8 制作 Docker 鏡像 .......................................................................... 131
打包 FaaS Java 應用程序 .......................................................................................... 132
總結 .......................................................................................................................... 135
第 8 章 在本地環境中工作(就像在生產環境中一樣)........................136
本地開發面臨的挑戰 ................................................................................................ 136
mock、stub 和服務虛擬化 ........................................................................................ 137
模式 #1 :profile、mock 和 stub ........................................................................ 137
使用 Mockito 進行 mock ................................................................................... 138
模式 #2 :服務虛擬化和 API 仿真 .................................................................... 140
使用 Hoverfly 虛擬化服務 ................................................................................ 141
虛擬機 :Vagrant 和 Packer ....................................................................................... 145
安裝 Vagrant ...................................................................................................... 145
創建一個 Vagrantfile ......................................................................................... 145
模式 #3 :生產環境鏡像 .................................................................................... 148
容器 :Kubernetes、minikube 和 Telepresence ......................................................... 149
介紹 Docker Java Shop 示例程序 ...................................................................... 149
構建 Java 應用程序和容器鏡像 ........................................................................ 150
部署到 Kubernetes 平臺 .................................................................................... 152
簡單的冒煙測試 ................................................................................................ 155
構建剩余的應用程序 ......................................................................................... 155
在 Kubernetes 上部署整個 Java 應用程序 ......................................................... 155
查看部署的應用程序 ......................................................................................... 156
Telepresence :在本地遠程工作 ........................................................................ 157
模式 #4 :環境租賃 ........................................................................................... 160
FaaS :AWS Lamba 和 SAM Local ........................................................................... 160
安裝 SAM Local ................................................................................................ 161
AWS Lambda 腳手架......................................................................................... 161
測試 AWS Lambda 事件處理 ............................................................................ 165
SAM Local 冒煙測試 ........................................................................................ 168
FaaS: Azure Functions 和 VS Code ........................................................................... 170
安裝 Azure Functions Core Tools ...................................................................... 170
在本地構建和測試函數 ..................................................................................... 173
使用 VS Code 進行本地和遠程測試 ................................................................. 176
總結 .......................................................................................................................... 177
第 9 章 持續集成 :創建構建管道的第一步.....................................178
為什么要持續集成 .................................................................................................... 178
如何實施 CI .............................................................................................................. 179
中心化與分布式的版本控制系統 .............................................................................. 179
Git 入門..................................................................................................................... 180
核心的 Git CLI 命令 .......................................................................................... 181
Hub :一個 Git 和 GitHub 必備的工具 .............................................................. 183
有效地使用 DVCS .................................................................................................... 185
基于主干的開發 ................................................................................................ 185
基于功能分支的開發 ......................................................................................... 186
Gitflow .............................................................................................................. 186
沒有萬全之策 :如何選擇分支策略 .................................................................. 187
代碼審查 ................................................................................................................... 189
我們要尋找什么 ................................................................................................ 190
代碼審查自動化 :PMD、Checkstyle 和 FindBugs ........................................... 191
審查 pull request ................................................................................................ 196
自動化構建 ............................................................................................................... 197
Jenkins ............................................................................................................... 197
發動你的團隊 ........................................................................................................... 199
定期合并代碼 .................................................................................................... 199
“停下來”:管理失敗的構建 ............................................................................. 199
不要在測試上使用 @Ignore .............................................................................. 199
保持快速的構建過程 ......................................................................................... 200
平臺(基礎設施即代碼)的 CI ................................................................................ 200
總結 .......................................................................................................................... 201
第 10 章 通過管道進行部署和發布................................................202
介紹 Extended Java Shop 應用程序 .......................................................................... 202
分離部署和發布 ........................................................................................................ 204
部署應用程序 ........................................................................................................... 205
創建一個容器鏡像 ............................................................................................ 206
部署機制 ........................................................................................................... 209
一切都開始于(并且結束于)健康檢查 ........................................................... 218
部署策略 ........................................................................................................... 222
使用非托管的集群 ............................................................................................ 232
更改數據庫........................................................................................................ 236
發布功能 ................................................................................................................... 240
功能開關 ........................................................................................................... 240
語義版本控制 .................................................................................................... 243
API 的向后兼容性和版本 .................................................................................. 244
多階段升級........................................................................................................ 249
管理配置和敏感信息 ................................................................................................ 250
“打包式”配置 .................................................................................................. 250
外部配置 ........................................................................................................... 251
處理敏感信息 .................................................................................................... 252
總結 .......................................................................................................................... 253
第 11 章 功能性測試 :正確和接受度.............................................254
為什么要測試軟件 .................................................................................................... 254
測試什么?敏捷測試象限介紹 ................................................................................. 254
持續測試 ................................................................................................................... 256
構建正確的反饋循環 ......................................................................................... 256
無盡的海龜 ............................................................................................................... 257
人為交易 ................................................................................................................... 258
端到端測試 ............................................................................................................... 259
驗收測試 ................................................................................................................... 261
行為驅動開發 .................................................................................................... 261
stub 或者虛擬化第三方服務.............................................................................. 265
將所有這些整合在一起 ..................................................................................... 265
消費者驅動的合約 .................................................................................................... 265
RESTful API 合約 ............................................................................................. 267
消息合約 ........................................................................................................... 269
組件測試 ................................................................................................................... 271
嵌入式數據存儲 ................................................................................................ 271
內存消息隊列 .................................................................................................... 272
測試替代 ........................................................................................................... 273
創建內部資源或接口 ......................................................................................... 274
進程內和進程外 ................................................................................................ 275
集成測試 ................................................................................................................... 277
驗證外部交互 .................................................................................................... 278
測試容錯性........................................................................................................ 278
單元測試 ................................................................................................................... 279
交互型單元測試 ................................................................................................ 280
獨立型單元測試 ................................................................................................ 281
處理不可預知的測試 ................................................................................................ 282
數據 ................................................................................................................... 282
還未準備好的資源 ............................................................................................ 283
不確定性事件 .................................................................................................... 283
如果你什么都做不了 ......................................................................................... 284
自上而下的測試和自下而上的測試 .......................................................................... 284
自上而下的測試 ................................................................................................ 285
自下而上的測試 ................................................................................................ 286
將所有內容都融入構建管道 ..................................................................................... 287
多少測試才夠 ........................................................................................................... 288
總結 .......................................................................................................................... 289
第 12 章 系統質量屬性測試 :驗證非功能性需求. .............................291
為什么要測試非功能性需求 ..................................................................................... 291
代碼質量 ................................................................................................................... 292
架構質量 ................................................................................................................... 292
ArchUnit :架構方面的單元測試 ...................................................................... 292
使用 JDepend 生成設計質量指標 ...................................................................... 295
性能和壓力測試 ........................................................................................................ 297
使用 Apache Benchmark 進行基本的性能測試 ................................................. 298
使用 Gatling 進行壓力測試 ............................................................................... 299
安全、漏洞和威脅 .................................................................................................... 305
代碼級別的安全驗證 ......................................................................................... 306
依賴項驗證........................................................................................................ 311
與部署平臺相關的安全問題 ............................................................................. 315
后續步驟 :威脅建模 ......................................................................................... 318
混亂測試 ................................................................................................................... 321
在生產環境中制造混亂(引入猴子) ................................................................ 322
在預發布環境中造成混亂 ................................................................................. 324
需要多少非功能性測試才夠 ..................................................................................... 325
總結 .......................................................................................................................... 326
第 13 章 可觀察性 :監控、日志和跟蹤..........................................327
可觀察性和持續交付 ................................................................................................ 327
為什么要觀察應用程序 ..................................................................................... 327
我們希望監控 :應用程序、網絡和機器 ........................................................... 329
如何觀察 :監控、日志和跟蹤 .......................................................................... 330
報警 ................................................................................................................... 330
面向可觀察性的系統設計 ......................................................................................... 332
指標 .......................................................................................................................... 332
指標的類型........................................................................................................ 333
Dropwizard Metrics ........................................................................................... 333
Spring Boot Actuator ......................................................................................... 335
Micrometer ........................................................................................................ 336
使用指標的最佳實踐 ......................................................................................... 337
日志 .......................................................................................................................... 337
日志的形式........................................................................................................ 337
SLF4J ................................................................................................................ 339
Log4j 2 .............................................................................................................. 340
日志的最佳實踐 ................................................................................................ 341
請求跟蹤 ................................................................................................................... 342
trace、span 和 baggage ...................................................................................... 342
Java 跟蹤工具 :OpenZipkin、Spring Sleuth 和 OpenCensus ............................ 343
分布式跟蹤的推薦實踐 ..................................................................................... 344
異常跟蹤 ................................................................................................................... 344
Airbrake ............................................................................................................ 346
系統監控工具 ........................................................................................................... 347
collectd .............................................................................................................. 347
rsyslog ............................................................................................................... 347
Sensu ................................................................................................................. 348
收集和存儲 ............................................................................................................... 348
Prometheus ........................................................................................................ 349
Elastic-Logstash-Kibana .................................................................................... 349
可視化 ....................................................................................................................... 350
業務可視化........................................................................................................ 350
運維可視化........................................................................................................ 351
開發可視化........................................................................................................ 353
總結 .......................................................................................................................... 354
第 14 章 遷移到持續交付............................................................355
持續交付能力 ........................................................................................................... 355
選擇你要遷移的項目 ................................................................................................ 356
情景感知 ................................................................................................................... 357
Cynefin 框架和持續交付 ................................................................................... 358
所有模型都是錯誤的,有些是有用的............................................................... 359
開展持續交付 ........................................................................................................... 359
測量持續交付 ........................................................................................................... 360
從小處開始,嘗試、學習、分享,然后重復整個過程 ............................................ 362
增加推廣范圍 :領導變革 ......................................................................................... 363
其他的指導和提示 .................................................................................................... 365
不良實踐和常見的反模式 ................................................................................. 365
丑陋的架構 :改還是不改 ................................................................................. 365
總結 .......................................................................................................................... 367
第 15 章 持續交付和持續改進......................................................369
從現在開始 ............................................................................................................... 369
建立扎實的技術基礎 ................................................................................................ 369
持續交付價值(最重要的目標) ............................................................................... 370
增加軟件的共享責任 ................................................................................................ 371
促進快速反饋和實驗 ................................................................................................ 371
在組織中開展持續交付............................................................................................. 372
持續改進 ................................................................................................................... 372
總結 .......................................................................................................................... 373