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