Java 高並發核心編程 捲3(加強版):億級用戶 Web 應用架構與實戰

尼恩 、德魯、李鵬舉、尤里烏斯

  • Java 高並發核心編程 捲3(加強版):億級用戶 Web 應用架構與實戰-preview-1
  • Java 高並發核心編程 捲3(加強版):億級用戶 Web 應用架構與實戰-preview-2
  • Java 高並發核心編程 捲3(加強版):億級用戶 Web 應用架構與實戰-preview-3
Java 高並發核心編程 捲3(加強版):億級用戶 Web 應用架構與實戰-preview-1

買這商品的人也買了...

商品描述

本書從動態代理模式、Reactor模式、三大限流策略等知識入手,深入淺出地剖析Spring Cloud+Nginx系統架構的核心原理以及Web高並發開發技術。全書從基礎設計模式和基礎原理出發,理論與實戰相結合,系統、詳盡地介紹Spring Cloud + Nginx高並發核心編程。 本書共10章。前6章剖析Feign高並發RPC的底層原理,解析Hystrix高性能配置的核心選項,闡述Hystrix滑動窗口的核心原理;後4章介紹Nginx的核心原理及其配置,並結合秒殺場景實現Spring Cloud秒殺、Spring Cloud+Nginx Lua秒殺,為廣大Java開發者提供一個全面學習高並發開發的實戰案例。這些知識會為廣大Java工程師解決後台開發中遇到的高並發、高性能問題打下堅實的技術基礎。

目錄大綱

目    錄

第1章  億級用戶Web應用的架構與實操 1

1.1  高並發基本原理 1

1.1.1  響應時間 1

1.1.2  吞吐量 2

1.1.3  錯誤率 4

1.2  提升系統的並發能力 4

1.2.1  縱向擴展 5

1.2.2  橫向擴展 6

1.2.3  高並發架構中的分層策略 6

1.3  接入層橫向擴展高並發架構 7

1.3.1  硬負載均衡 7

1.3.2  軟負載均衡 8

1.3.3  LVS和Nginx的配合使用 10

1.3.4  DNS負載均衡 10

1.4  動靜分離與接入層的緩存架構 14

1.4.1  接入層網關緩存 14

1.4.2  CDN加速 15

1.4.3  接入層的緩存架構的原則 17

1.5  服務層的橫向擴展高並發架構 18

1.5.1  微服務網關的高並發橫向擴展 18

1.5.2  微服務Provider高並發橫向擴展 19

1.5.3  微服務Provider的自動伸縮 20

1.6  緩存層的高並發架構 24

1.6.1  旁路緩存模式 24

1.6.2  讀/寫穿透模式 26

1.6.3  異步回寫模式 28

1.6.4  三大緩存使用模式的比較 28

1.6.5  旁路緩存模式如何保證雙寫的數據一致性 29

1.6.6  本地緩存架構 39

1.6.7  多級、細粒度緩存架構 42

1.7  數據層的橫向擴展高並發架構 44

1.7.1  數據庫服務器的能力參考數據 44

1.7.2  結構化數據的高並發架構方案:分庫分表 45

1.7.3  結構化分庫分表:水平拆分與垂直拆分 46

1.7.4  億級庫表規模架構設計 47

1.7.5  百億級庫表架構設計 48

1.7.6  百億級數據的異構查詢 49

1.7.7  ES+HBase組合方案的數據查詢過程 50

1.8  億級用戶量場景下的流量預估 50

1.8.1  請求處理模型 50

1.8.2  舊系統的流量架構 52

1.8.3  新系統的流量架構 52

1.8.4  二八定律 52

1.8.5  通過二八定律進行流量預估 53

1.9  高並發架構 56

1.9.1  同步架構 56

1.9.2  異步架構 56

1.10  高可用架構 57

1.10.1  什麽是高可用 57

1.10.2  高可用的度量 58

1.10.3  高並發架構中的分層策略 58

1.10.4  分層規避單點瓶頸+自動故障轉移 58

1.10.5  其他的高可用策略 59

1.11  高性能架構 59

第2章  Spring Cloud+Nginx高並發核心編程的學習準備 61

2.1  Spring Cloud + Nginx架構的主要組件 61

2.2  Spring Cloud+Nginx核心知識的廣泛欠缺 63

2.3  Spring Cloud和Spring Boot的版本選擇 63

2.4  Spring Cloud微服務開發所涉及的中間件 65

2.5  Spring Cloud微服務開發和自驗證環境 66

2.5.1  開發和自驗證環境的系統選項和環境變量配置 66

2.5.2  使用Fiddler工具抓包和查看報文 67

2.6  crazy-Spring Cloud微服務開發腳手架 69

2.7  以秒殺作為Spring Cloud+Nginx的實戰案例 70

第3章  Spring Cloud入門實戰 72

3.1  Eureka服務註冊與發現 73

3.1.1  什麽是服務註冊與發現 73

3.1.2  Eureka Server註冊中心 74

3.1.3  微服務提供者Provider的創建和配置 79

3.1.4  微服務提供者的續約(心跳) 82

3.1.5  微服務提供者的健康狀態 84

3.1.6  Eureka自我保護模式與失效Provider的快速剔除 87

3.2  Config配置中心 90

3.2.1  config-server服務端組件 90

3.2.2  config-client客戶端組件 92

3.3  微服務的RPC遠程調用 93

3.3.1  RESTfull風格簡介 94

3.3.2  RestTemplate遠程調用 94

3.3.3  Feign遠程調用 96

3.4  Feign+Ribbon實現客戶端負載均衡 97

3.4.1  Spring Cloud Ribbon基礎 97

3.4.2  Spring Cloud Ribbon的負載均衡策略 100

3.4.3  Spring Cloud Ribbon的常用配置 101

3.5  Feign+Hystrix實現RPC調用保護 105

3.5.1  Spring Cloud Hystrix失敗回退 106

3.5.2  分佈式系統面臨的雪崩難題 109

3.5.3  Spring Cloud Hystrix熔斷器 111

第4章  Spring Cloud RPC遠程調用 核心原理 115

4.1  代理模式與RPC客戶端實現類 115

4.1.1  客戶端RPC遠程調用實現類的職責 115

4.1.2  簡單的RPC客戶端實現類 117

4.1.3  從基礎原理講起:代理模式與RPC客戶端實現類 120

4.1.4  使用動態代理模式實現RPC客戶端類 123

4.1.5  JDK動態代理機制的原理 126

4.2  模擬的Feign RPC動態代理實現 128

4.2.1  模擬Feign的MethodHandler方法處理器 129

4.2.2  模擬Feign的InvokeHandler調用處理器 131

4.2.3  模擬Feign動態代理RPC的執行流程 133

4.2.4  模擬動態代理RPC遠程調用的測試 134

4.2.5  Feign彈性RPC客戶端實現類 135

4.3  Feign彈性RPC客戶端的重要組件 136

4.3.1  演示用例說明 136

4.3.2  Feign的動態代理RPC客戶端實例 138

4.3.3  Feign的調用處理器InvocationHandler 139

4.3.4  Feign的方法處理器MethodHandler 141

4.3.5  Feign的客戶端組件 143

4.4  Feign的RPC動態代理實例的創建流程 146

4.4.1  Feign的整體運作流程 146

4.4.2  RPC動態代理容器實例的FactoryBean工廠類 147

4.4.3  Feign.Builder建造者容器實例 150

4.4.4  默認的RPC動態代理實例創建流程 152

4.4.5  Contract遠程調用協議規則類 155

4.5  Feigh遠程調用的執行流程 156

4.5.1  與FeignInvocationHandler相關的遠程調用執行流程 157

4.5.2  與HystrixInvocationHandler相關的遠程調用執行流程 158

4.5.3  Feign遠程調用的完整流程及其特性 160

4.6  HystrixFeign動態代理實例的創建流程 161

4.6.1  HystrixFeign.Builder建造者容器實例 162

4.6.2  配置HystrixFeign.Builder建造者容器實例 163

4.7  feign.Client客戶端容器實例 163

4.7.1  裝配LoadBalancerFeignClient負載均衡容器實例 164

4.7.2  包裝ApacheHttpClient實例的負載均衡客戶端裝配 165

4.7.3  包裝OkHttpClient實例的負載均衡客戶端實例 167

4.7.4  包裝Client.Default實例的負載均衡客戶端實例 168

第5章  RxJava響應式編程框架 169

5.1  從基礎原理講起:觀察者模式 169

5.1.1  觀察者模式的基礎原理 169

5.1.2  觀察者模式的經典實現 170

5.1.3  Rxjava中的觀察者模式 172

5.1.4  RxJava的不完整回調 174

5.1.5  RxJava函數式編程 176

5.1.6  RxJava的Operators操作符 177

5.2  創建型操作符 178

5.2.1  just操作符 178

5.2.2  from操作符 179

5.2.3  range操作符 180

5.2.4  interval操作符 180

5.2.5  defer延遲創建操作符 181

5.3  過濾型操作符 182

5.3.1  filter操作符 182

5.3.2  distinct操作符 183

5.4  轉換型操作符 183

5.4.1  map操作符 183

5.4.2  flatMap操作符 184

5.4.3  scan操作符 186

5.5  聚合操作符 187

5.5.1  count操作符 187

5.5.2  reduce操作符 188

5.6  其他操作符 189

5.6.1  take操作符 190

5.6.2  window操作符 190

5.7  RxJava的Scheduler調度器 193

5.8  背壓 195

5.8.1  什麽是背壓問題 195

5.8.2  背壓問題的幾種應對模式 197

第6章  Hystrix RPC保護的原理 200

6.1  RPC保護的目標 200

6.2  HystrixCommand簡介 201

6.2.1  HystrixCommand的使用 201

6.2.2  HystrixCommand的配置內容和方式 203

6.3  HystrixCommand命令執行的方法 205

6.3.1  execute()方法 205

6.3.2  queue()方法 206

6.3.3  observe()方法 208

6.3.4  toObservable()方法 209

6.3.5  HystrixCommand的執行方法之間的關系 210

6.4  RPC保護之艙壁模式 212

6.4.1  什麽是艙壁模式 212

6.4.2  Hystrix線程池隔離 214

6.4.3  Hystrix線程池隔離配置 217

6.4.4  Hystrix信號量隔離 219

6.5  RPC保護之熔斷器模式 222

6.5.1  熔斷器狀態變化的演示實例 223

6.5.2  熔斷器和滑動窗口的配置屬性 226

6.5.3  Hystrix命令的執行流程 230

6.6  RPC監控之滑動窗口實現原理 231

6.6.1  Hystrix健康統計滑動窗口模擬實現 232

6.6.2  Hystrix滑動窗口核心實現原理 236

第7章  微服務網關與用戶身份識別 240

7.1  Zuul的基礎使用 241

7.2  創建Zuul網關服務 241

7.2.1  Zuul路由規則配置 242

7.2.2  過濾敏感請求頭部 244

7.2.3  路徑前綴的處理 244

7.3  Zuul過濾器 245

7.3.1  Zuul網關的過濾器類型 245

7.3.2  實戰:用戶的黑名單過濾 247

7.4  Spring Security原理和實戰 250

7.4.1  Spring Security核心組件 250

7.4.2  Spring Security的請求認證處理流程 253

7.4.3  基於數據源的認證流程 258

7.5  JWT+Spring Security進行網關安全認證 263

7.5.1  JWT安全令牌規範詳解 263

7.5.2  JWT+Spring Security認證處理流程 267

7.5.3  Zuul網關與UAA微服務的配合 272

7.5.4  使用Zuul過濾器添加代理請求的用戶標識 276

7.6  微服務提供者之間的會話共享關系 277

7.6.1  分佈式會話的起源和實現方案 278

7.6.2  Spring Session的核心組件和存儲細節 279

7.6.3  Spring Session的使用和定製 280

7.6.4  通過用戶身份標識查找session id 282

7.6.5  查找或創建分佈式會話 283

7.6.6  加載高速訪問數據到分佈式會話 285

第8章  Nginx/OpenResty詳解 287

8.1  Nginx簡介 287

8.1.1  正向代理與反向代理 288

8.1.2  Nginx的啟動與停止 289

8.1.3  Nginx的啟動命令和參數詳解 289

8.1.4  Linux下Openresty的啟動、停止腳本 290

8.1.5  Windows下Openresty的啟動、停止腳本 291

8.2  Nginx的核心原理 293

8.2.1  Reactor反應器模型 293

8.2.2  Nginx的兩類進程 294

8.2.3  Nginx的模塊化設計 295

8.2.4  Nginx配置文件上下文結構 296

8.2.5  Nginx的請求處理流程 298

8.2.6  HTTP請求處理的11個階段 299

8.3  Nginx的基礎配置 303

8.3.1  events事件驅動配置 303

8.3.2  虛擬主機配置 304

8.3.3  錯誤頁面配置 306

8.3.4  長連接相關配置 307

8.3.5  訪問日誌配置 307

8.3.6  Nginx核心模塊內置變量 308

8.4  location路由規則配置詳解 310

8.4.1  location語法詳解 310

8.4.2  常用的location路由配置 313

8.5  Nginx的rewrite模塊指令 314

8.5.1  set指令 314

8.5.2  rewrite指令 315

8.5.3  if條件指令 317

8.5.4  add_header指令 319

8.5.5  指令的執行順序 320

8.6  反向代理與負載均衡配置 321

8.6.1  演示環境說明 321

8.6.2  proxy_pass反向代理指令 322

8.6.3  proxy_set_header指令 323

8.6.4  upstream上游服務器組 324

8.6.5  upstream的上游服務器配置 326

8.6.6  upstream的負載分配方式 327

第9章  Nginx Lua編程 329

9.1  Nginx Lua編程主要的應用場景 329

9.2  Nginx Lua編程簡介 329

9.2.1  ngx_lua簡介 330

9.2.2  Nginx Lua項目的創建 330

9.2.3  Lua項目的工程結構 331

9.2.4  Lua項目的啟動 331

9.3  Lua開發基礎 332

9.3.1  Lua模塊的定義和使用 333

9.3.2  Lua模塊的使用 333

9.3.3  Lua的數據類型 334

9.3.4  Lua的字符串 337

9.3.5  Lua中的數組容器 338

9.3.6  Lua的控制結構 340

9.3.7  Lua的函數定義 342

9.3.8  Lua的面向對象編程 344

9.4  Nginx Lua編程基礎 345

9.4.1  Nginx Lua的執行原理 345

9.4.2  Nginx Lua的配置指令 346

9.4.3  Nginx Lua的常用配置指令 347

9.4.4  Nginx Lua的內置常量和變量 350

9.5  Nginx Lua編程實例 352

9.5.1  Lua腳本獲取URL中的參數 352

9.5.2  Nginx Lua的內置方法 353

9.5.3  通過ngx.header設置HTTP響應頭 355

9.5.4  Lua訪問Nginx變量 358

9.5.5  Lua訪問請求上下文變量 359

9.6  重定向與內部子請求 360

9.6.1  Nginx Lua內部重定向 360

9.6.2  Nginx Lua外部重定向 362

9.6.3  ngx.location.capture子請求 364

9.6.4  ngx.location.capture_multi並發子請求 367

9.7  Nginx Lua操作Redis 369

9.7.1  Redis的CRUD基本操作 369

9.7.2  實戰:封裝一個操作Redis的基礎類 371

9.7.3  在Lua中使用Redis連接池 373

9.8  Nginx Lua編程實戰案例 375

9.8.1  Nginx+Redis進行分佈式訪問統計 375

9.8.2  Nginx+Redis+Java容器實現高並發訪問 376

9.8.3  Nginx+Redis實現黑名單攔截 380

9.8.4  使用Nginx Lua共享內存 382

第10章  限流原理與實戰 384

10.1  使用Redis實現簡單限流策略 384

10.1.1  3種限流策略:計數器、漏桶、令牌桶 384

10.1.2  計數器限流原理和Java參考實現 385

10.1.3  漏桶算法限流原理和Java參考實現 387

10.1.4  令牌桶限流原理和Java參考實現 389

10.2  分佈式計數器限流 391

10.2.1  Nginx Lua分佈式計數器限流 391

10.2.2  Redis Lua分佈式計數器限流 394

10.3  Nginx漏桶限流詳解 397

10.4  實戰:分佈式令牌桶限流 399

10.4.1  分佈式令牌桶限流Lua腳本 399

10.4.2  Java分佈式令牌桶限流 401

10.4.3  Java分佈式令牌桶限流的自驗證 404

第11章  Spring Cloud Nginx秒殺實戰 406

11.1  秒殺業務特定和技術難點 406

11.1.1  秒殺系統的業務功能 406

11.1.2  秒殺系統面臨的技術難題 407

11.2  秒殺系統的系統架構 408

11.2.1  秒殺的分層架構 408

11.2.2  秒殺的限流架構 410

11.2.3  秒殺的分佈式鎖架構 411

11.2.4  秒殺的削峰架構 412

11.3  秒殺業務的參考實現 413

11.3.1  秒殺的功能模塊和接口設計 413

11.3.2  數據表和PO實體類設計 416

11.3.3  使用分佈式ID生成器 418

11.3.4  秒殺的controller層設計 420

11.3.5  service層邏輯:獲取秒殺令牌 421

11.3.6  service層邏輯:執行秒殺下單 424

11.3.7  秒殺的Lua腳本設計 427

11.3.8  BusinessException業務異常定義 429

11.4  Zuul內部網關實現秒殺限流 431

11.5  Nginx高性能秒殺和限流 435

11.5.1  Lua腳本:獲取秒殺令牌 436

11.5.2  Lua腳本:執行令牌桶限流 438