●第Ⅰ部分 基於Vert.x的異步編程基本原理
第1章 Vert.x、異步編程和反應式繫統 3
1.1 分布式和網絡化是常態 3
1.2 我們不是在孤島上生活 4
1.3 網絡上沒有免費的午餐 5
1.4 簡潔的阻塞式API 5
1.5 阻塞式API浪費了資源,增加了成本 7
1.6 基於非阻塞I/O的異步編程 9
1.7 事件驅動的多路復用:事件循環 12
1.8 什麼是反應式繫統 15
1.9 反應式還有哪些含義 16
1.10 什麼是Vert.x 17
1.11 你的第一個Vert.x應用 程序 18
1.11.1 準備項目 18
1.11.2 VertxEcho類 19
1.11.3 回調函數的角色 21
1.11.4 它是反應式的嗎 22
1.12 Vert.x的替代品 23
1.13 本章小結 25
第2章 Verticle:Vert.x的基本 27
2.1 編寫一個Verticle 27
2.1.1 準備項目 28
2.1.2 實現Verticle類 29
2.1.3 運行並初次觀察 30
2.2 關於Verticle的更多細節 32
2.2.1 阻塞與事件循環 32
2.2.2 生命周期事件的異步通知 33
2.2.3 部署Verticle 35
2.2.4 傳遞配置參數 38
2.3 當代碼需要阻塞時 39
2.3.1 Worker Verticle 39
2.3.2 executeBlocking方法 40
2.4 Verticle中到底有什麼 42
2.4.1 Verticle及其環境 42
2.4.2 關於Verticle Context的更多細節 43
2.4.3 橋接Vert.x線程和非Vert.x線程 45
2.5 本章小結 46
第3章 事件總線:Vert.x應用程序的骨干 47
3.1 什麼是事件總線 47
3.1.1 事件總線是不是另一種消息代理 48
3.1.2 “點對點”模式 49
3.1.3 “請求-應答”模式 49
3.1.4 “發布-訂閱”模式 50
3.2 事件總線的示例 51
3.2.1 溫度傳感器Verticle 52
3.2.2 監聽器Verticle 53
3.2.3 傳感器數據Verticle 54
3.2.4 HTTP服務器Verticle 54
3.2.5 啟動應用程序 58
3.3 集群化和分布式的事件總線 59
3.3.1 Vert.x中的集群 59
3.3.2 從事件總線到分布式事件總線 60
3.4 本章小結 63
第4章 異步數據和事件流 65
4.1 統一的流模型 65
4.2 什麼是背壓 68
4.3 開發一個音樂流點唱機 70
4.3.1 功能與用法 71
4.3.2 HTTP處理:宏觀視圖 73
4.3.3 點唱機Verticle的基礎 73
4.3.4 傳入的HTTP連接 75
4.3.5 盡可能高效地下載 76
4.3.6 讀取MP3文件,但不能太快 77
4.4 解析簡單的流 81
4.5 解析復雜的流 83
4.6 關於流獲取模式的簡短說明 86
4.7 本章小結 88
第5章 回調以外的異步編程模型 89
5.1 構建異步操作:一個邊緣服務的示例 89
5.1.1 應用場景 90
5.1.2 溫度傳感器Verticle 91
5.1.3 快照服務Verticle 92
5.2 回調 93
5.2.1 實現 93
5.2.2 運行 95
5.2.3 “回調地獄”不是根本問題 96
5.3 Future和Promise 98
5.3.1 Vert.x中的Future和Promise 98
5.3.2 Vert.x 4中基於Future的API 100
5.3.3 與CompletionStage API的互操作 100
5.3.4 使用Vert.x Future特性實現的Collector Service 102
5.4 反應式擴展 103
5.4.1 RxJava的簡要說明 104
5.4.2 RxJava與Vert.x 107
5.4.3 用RxJava實現的CollectorService 108
5.5 Kotlin協程 111
5.5.1 什麼是協程 111
5.5.2 Vert.x與Kotlin的協程 112
5.5.3 使用協程實現邊緣服務 113
5.6 究竟應該用哪一種模型 115
5.7 本章小結 116
第6章 不隻是事件總線 117
6.1 用服務API重新實現溫度傳感器 117
6.2 RPC的回歸 118
6.3 定義服務接口 119
6.4 服務的實現 121
6.5 啟用Proxy代碼自動生成 122
6.6 部署事件總線服務 122
6.7 回調之外的服務代理 123
6.8 Vert.x中的測試 125
6.8.1 在Vert.x中使用JUnit 5 125
6.8.2 測試DataVerticle 126
6.8.3 運行測試 129
6.9 本章小結 129
第Ⅱ部分 用Vert.x開發反應式服務
第7章 設計一個反應式應用程序 133
7.1 反應式應用程序的必要條件 133
7.2 “一萬步挑戰” 134
7.3 一個應用程序,多個服務 137
7.4 服務規範 139
7.4.1 用戶資料服務 139
7.4.2 數據收集服務 140
7.4.3 用戶活動服務 141
7.4.4 對外接口服務 143
7.4.5 用戶Web應用程序 144
7.4.6 事件統計服務 145
7.4.7 賀信服務 146
7.4.8 公告牌Web應用程序 146
7.5 運行應用程序 147
7.6 本章小結 149
第8章 Web技術棧 151
8.1 實現對外接口服務 152
8.1.1 路由HTTP請求 152
8.1.2 發起HTTP請求 154
8.2 用JWT令牌進行訪問控制 156
8.2.1 使用JWT令牌 156
8.2.2 JWT令牌中有什麼 158
8.2.3 用Vert.x處理JWT令牌 159
8.2.4 用Vert.x簽發JWT令牌 161
8.3 跨域資源共享(CORS) 162
8.3.1 問題在哪裡 162
8.3.2 在Vert.x中支持CORS 164
8.4 一個現代化的Web前端 165
8.4.1 Vue.js 165
8.4.2 Vue.js應用程序結構及構建集成 166
8.4.3 後端集成的效果演示 168
8.4.4 在Vert.x中服務靜態內容 170
8.5 編寫集成測試 171
8.6 本章小結 175
第9章 Vert.x中的消息機制與事件流 177
9.1 用Vert.x實現基於事件驅動的服務 177
9.1.1 Vert.x為我們提供了什麼 178
9.1.2 我們會用到的中間件和服務 179
9.1.3 AMQP和Message Broker簡介 179
9.1.4 Kafka簡介 180
9.2 通過HTTP和AMQP可靠地接收消息 181
9.2.1 從AMQP接收數據 181
9.2.2 將AMQP消息轉換成Kafka記錄 183
9.2.3 從HTTP接收數據 185
9.3 發送賀信 186
9.3.1 監聽每日步數變化 187
9.3.2 發送郵件 188
9.4 集成測試 190
9.4.1 測試收取功能 190
9.4.2 測試賀信功能 193
9.5 本章小結 196
第10章 用數據庫進行持久化狀態管理 197
10.1 數據庫與Vert.x 197
10.1.1 Eclipse Vert.x支持的數據庫客戶端 198
10.1.2 數據對像映射並非必需 199
10.2 使用MongoDB的用戶資料服務 200
10.2.1 數據模型 200
10.2.2 用戶資料API Verticle及其初始化 201
10.2.3 校驗用戶輸入 202
10.2.4 在MongoDB中添加用戶 203
10.2.5 用戶的認證 206
10.2.6 獲取用戶數據 207
10.2.7 更新用戶數據 208
10.3 使用 tgreSQL的用戶活動服務 209
10.3.1 服務的數據模型 209
10.3.2 打開一個連接池 210
10.3.3 設備更新事件的生命周期 210
10.3.4 插入新記錄 211
10.3.5 生成設備的每日運動更新 213
10.3.6 用戶活動服務的查詢接口 214
10.4 集成測試 215
10.4.1 測試用戶資料服務 215
10.4.2 測試用戶活動服務接口 218
10.4.3 測試用戶活動服務的事件處理 219
10.5 本章小結 222
第11章 端到端的實時反應式事件處理 223
11.1 使用Kafka和RxJava實現高級的流式數據處理 223
11.1.1 生成用戶當天步數更新 224
11.1.2 計算數據收集服務的吞吐量 226
11.1.3 計算各城市的數據趨勢 227
11.2 實時的反應式Web應用 程序 229
11.2.1 將Kafka消息轉發至Vert.x事件總線 230
11.2.2 橋接事件總線和Web應用程序 231
11.2.3 Web應用程序基於Kafka消息的實時更新 233
11.3 流與狀態 235
11.3.1 數據更新流 235
11.3.2 排名數據的水合階段 235
11.3.3 根據消息流周期性地更新排名 237
11.4 本章小結 240
第12章 通過負載測試和混沌測試提升繫統響應能力 241
12.1 初始實驗:繫統的性能 好嗎 242
12.1.1 負載測試前的一些考量 242
12.1.2 用Locust模擬用戶 243
12.1.3 用Hey進行負載測試 246
12.2 混沌測試 250
12.2.1 測試方案 250
12.2.2 用Pumba進行混沌測試 251
12.2.3 繫統尚不具備回彈性 253
12.3 從“可擴展性”到“可擴展性+回彈性” 254
……