本書是按照程序設計與架構的順序編寫的,共13章。第1章介紹學習高性能Java應了解的核心知識,為前置內容。第2章和第3章講解在編寫代碼之前,如何高效地為MySQL填充億級數據,並對MySQL進行基準測試,以便在之後編程時有所比較。第4章講解在編寫代碼的過程中如何優化代碼,使代碼更高效。第5章和第6章講解在寫好代碼之後如何測試並優化場景響應速度。第7章和第8章講解在程序上線執行一段時間之後如何對MySQL進行主從復制、分庫分表。第9章講解如何通過Prometheus和Grafana監控MySQL節點。第10章和第11章講解如何通過堆內緩存、堆外緩存(MapDB)和磁盤緩存解決MySQL數據庫性能不佳的問題。第12章講解如何使用分布式鎖Redisson解決實際應用中常見的數據一致性問題。第13章簡要介紹Java中的常見架構與工具。本書不僅適合Java初學者、剛入行的編程人員,也適合對高性能、高並發感興趣的程序員。
張方興,多年從事Java編程工作,參與多個項目研發,曾編著《微服務分布式基礎架構與實戰――基於Spring Boot+Spring Cloud》一書。
市面上介紹各種Java框架的書很多,如Spring Boot、Spring Cloud等,這類書會讓你的技術“量”增長,但很少有人會教給你如何提升技術的“質”,網絡上也很少有體系化、結構化的提升技術的“質”的教材。這本書從架構的角度,講解在架構各個階段很多讀者會遇到的問題,以及相關原理解析,讀者可以舉一反三,從更高的角度看到自己遇到的問題,提升技術的“質”。
前言
為什麼寫這本書
市面上講Java 框架的書很多,包括Sping Boot、Spring Cloud、Kafka 等,但這些書通常只會讓
你技術的“量”增長,而“質”仍處於SSM 的階段。而且互聯網上並沒有體系化、結構化的提升技
術的“質”的教材,於是我行動了起來,將我所學的架構思想與實現方式都放入本書中,將提升技
術的“質”的方式分享給大家。
本書特色
本書先系統總結出在程序設計過程中各個階段會出現的問題,然後通過對問題的分析找出解決
方案,最後通過實戰鞏固學習成果。
通過閱讀本書,讀者不僅可以從架構的角度全方位地了解在Java 編程過程中各階段會出現的典
型問題,從底層了解問題出現的原因,還可以跟著書中的解決方案和相關實戰章節實現學習的閉環。
除此之外,本書還可以幫助讀者養成在編寫代碼的過程中對代碼進行測試的習慣,時刻觀察CPU與內存,從而更加深入地了解系統,掌控自己編寫的代碼。本書內容會對普通程序員晉升中間件研發工程師、架構工程師、遊戲服務器主程等有所幫助。
本書內容安排
本書是按照程序設計與架構的順序編寫的,具體如下。
1.在編寫代碼之前,應先創建表結構,然後填充億級數據,做基準測試,即在還沒開始編寫代
碼的時候了解當前設計的數據格式和表結構的性能基準是怎樣的,以便在之後編程時有所比較,並且可以在此時優化設計的數據格式、表結構、MySQL 配置等內容。具體內容見第2 章和第3章。
2.在編寫代碼的過程中,程序中通常會有許多函數和接口,此時需要對函數和接口進行單元測
試,以便了解函數或接口的性能,並與函數基準或數據庫基準的數據進行對比,知道差異大概有多少。當差異過大時,需要進行優化。除此之外,當函數的多種寫法語義結果相同時,也可對比出哪種性能更好。具體內容見第4 章。
3.在寫好代碼之後,需要對場景進行性能測試,例如購買商品場景、登錄場景、支付場景等。
之前在單元測試時,通常使用一個接口一項測試或一個函數一項測試的方式,但在場景中很可能會調用多個接口,例如,在登錄場景中有賬號和密碼驗證接口、用戶數據接口、歷史數據接口、短信提醒接口、信息推送接口等,此時需要對整體的場景進行測試。每個場景都有多個接口,並且很可能附帶接口執行順序、if-else 判斷(true 與false 須執行不同函數)、for/while 循環(若調用失敗則重新進行調用)等內容,此時JMH 已無法滿足場景類性能測試的需要,需要通過JMeter 對場景進行性能測試。具體內容見第5 章。
4.在場景性能測試過程中,許多場景下的響應速度可能不如人意,此時既可以通過增加緩存提
升MySQL 執行效率的方式,也可以通過優化SQL 的方式,對場景性能測試的函數與接口進行優化,以縮短響應時間。具體內容見第6 章。
5.在程序上線並執行一段時間之後,隨著用戶量的逐漸增多,單臺MySQL 服務器開始無法承
受所有的壓力,為了承載更大的數據庫並發,防止單臺MySQL 服務器出現宕機且無法正常提供服務等問題,導致整體應用程序崩潰,需要使用MySQL 集群。具體內容見第7 章。
6.隨著數據庫存儲的內容越來越多,通過MySQL 主從復制也無法存儲更多的數據,此時就需
要切割表,把一張過大的表切割後分別存儲在不同的MySQL 數據庫中,這樣就可以存儲更多的內容。承載更多的用戶。具體內容見第8 章。
7.在對MySQL 進行主從復制、分庫分表等之後,MySQL 的節點數變得越來越多,此時可以使
用性能監控的方式查看MySQL 的實際使用情況。當MySQL 節點發生宕機、無法響應、CPU 內存過載、連接數突然過多等問題時,性能監控可及時將消息推送給相關管理人員,即可省時省力、掌控全局。具體內容見第9 章。
8.當數據庫臃腫、性能不佳時,需要通過多層緩存的方式,在不同層級上設置緩存,減少數據
庫的連接次數與查詢次數。具體內容見第10 章和第11 章。
9.通常來說,秒殺系統在活動期間都需要極高的性能,為了防止超買或超賣,此時需要使用分
布式鎖解決數據的一致性問題。具體內容見第12 章。
10.針對不同的場景需要用不同的架構,如高並發架構、負載均衡架構等。具體內容見第13 章。
本書讀者物件
本書不僅適合Java 初學者、剛入行的編程人員,也適合對高性能、高並發感興趣的程序員。
致謝
感謝我的領導楊儀,你給了我許多計算機思想和思路上的指導。
張方興
第1 章 高性能Java 核心知識概述 1
1.1 高性能 1
1.2 高並發 2
1.3 高可用 2
1.4 算法、GC 與診斷工具 . 3
1.4.1 算法 . 3
1.4.2 GC . 4
1.4.3 jvmtop 4
1.4.4 jstat 5
1.4.5 Arthas 6
1.5 分離術 8
1.6 基準測試 . 8
1.6.1 基準測試的概念 . 8
1.6.2 基準測試的實際用途 . 9
1.6.3 基準測試與一般性能測試的區別 . 9
1.7 性能測試 . 9
1.7.1 性能測試的目的 . 9
1.7.2 性能測試著重觀察的指標 . 9
1.7.3 性能測試存在的誤區 . 10
1.7.4 性能測試應涵蓋的內容 . 11
1.8 業務測試 . 12
1.9 單元測試 . 12
1.9.1 等價類劃分 . 13
1.9.2 邊界值分析 . 14
1.9.3 錯誤推測法 . 15
1.10 數據庫概述 . 15
1.10.1 數據庫分類 . 16
1.10.2 數據庫測試的具體內容 . 21
1.11 緩存的核心知識 . 22
1.11.1 緩存的命中率 . 23
1.11.2 緩存回收方式 . 23
1.11.3 緩存回收策略 . 23
1.11.4 緩存的設計模式 . 23
1.11.5 緩存測試應涵蓋的內容 . 24
1.11.6 實戰:秒殺系統設計方案 24
1.12 總結――業務、性能、編程、架構相輔相成 25
第2 章 為MySQL 填充億級數據 27
2.1 問題描述 . 27
2.2 問題分析與解決方案 . 27
2.3 為MySQL 填充億級數據實戰 28
2.3.1 INSERT INTO SELECT 方案 . 28
2.3.2 存儲過程方案 . 32
2.3.3 Loadfile 方案 . 33
2.3.4 第三方解決方案 . 34
2.4 最終結果 . 35
第3 章 MySQL 基準測試:sysbench 與mysqlslap 36
3.1 問題描述 . 36
3.2 問題分析與解決方案 . 36
3.2.1 解決方案:sysbench . 37
3.2.2 sysbench 的命令與參數 38
3.2.3 解決方案:mysqlslap . 40
3.2.4 mysqlslap 的命令與參數 41
3.3 sysbench 實戰 42
3.3.1 使用sysbench 壓測CPU、內存和磁盤I/O 42
3.3.2 初次使用sysbench 壓測MySQL . 46
3.3.3 深度使用sysbench 壓測MySQL . 49
3.4 mysqlslap 實戰 51
3.5 其他基準壓測工具 . 56
第4 章 代碼單元的性能測試與優化 57
4.1 問題描述 . 57
4.2 問題分析與解決方案 . 57
4.3 JMH 實戰 58
4.3.1 測試JMH 基準性能 . 58
4.3.2 測試i++基準性能 . 60
4.3.3 用JMH 執行多個函數的結果 62
第5 章 Web 性能測試解決方案:JMeter 67
5.1 問題描述 . 67
5.2 問題分析與解決方案 . 67
5.3 JMeter 的特點 . 68
5.4 深入理解JMeter . 68
5.4.1 JMeter 中的部分配置元件 . 68
5.4.2 JMeter 參數化的實現方式 . 69
5.4.3 JMeter 函數 . 70
5.4.4 通過JMeter 讀取外部文件 72
5.4.5 通過JMeter 提取上一個接口返回值 . 73
5.5 JMeter 實戰 . 74
5.5.1 初次使用JMeter 測試REST 接口 . 74
5.5.2 錄制性能測試腳本 . 80
第6 章 SQL 優化與索引優化 83
6.1 問題描述 . 83
6.2 問題分析與解決方案 . 83
6.3 SQL 執行計劃 . 84
6.4 SQL 優化與索引優化實戰 . 91
6.4.1 SQL 索引優化 . 91
6.4.2 分頁查詢優化 . 95
6.4.3 慢SQL 日志分析工具mysqldumpslow . 96
第7 章 MySQL 主從復制 101
7.1 問題描述 . 101
7.2 問題分析與解決方案 . 101
7.3 MySQL 主從復制原理 . 101
7.4 深入理解MySQL 中的二進制日志. 103
7.4.1 查看MySQL 二進制日志狀態 103
7.4.2 log_bin 和sql_log_bin 的區別 104
7.4.3 開啟二進制日志 . 104
7.4.4 查看二進制日志文件的名稱、大小和狀態 108
7.4.5 刪除某個日志之前的所有二進制日志文件 109
7.4.6 刪除某個時間點以前的二進制日志文件 110
7.4.7 刪除所有的二進制日志文件 . 111
7.4.8 查看二進制日志文件內容 . 111
7.4.9 通過二進制日志文件恢復MySQL . 116
7.5 MySQL 主從復制實戰 . 117
7.5.1 構建MySQL 主從復制架構 117
7.5.2 使用Spring Boot 整合MySQL 主從復制架構 . 126
第8 章 MySQL 分庫分表:MyCAT . 129
8.1 問題描述 . 129
8.2 問題分析與解決方案 . 129
8.3 MyCAT 實戰 . 130
8.3.1 構建MyCAT 一主多從架構 130
8.3.2 構建MyCAT 雙主多從環境 140
8.3.3 MyCAT 分庫――垂直拆分 142
8.3.4 MyCAT 分表――水平拆分 144
8.3.5 構建HAProxy + MyCAT + MySQL 高可用架構 146
第9 章 MySQL 性能監控解決方案:Prometheus+Grafana 152
9.1 問題描述 . 152
9.2 問題分析與解決方案 . 152
9.3 Prometheus 概述與適用場景 152
9.4 時序數據庫概述與適用場景 . 153
9.5 Grafana 概述與適用場景 154
9.6 構建Prometheus + Grafana 監控實戰 154
第10 章 堆內緩存解決方案:Java 堆內緩存與Guava Cache 171
10.1 問題描述 . 171
10.2 問題分析與解決方案 . 171
10.3 Java 堆內緩存 . 172
10.3.1 Java 堆內緩存原理 . 172
10.3.2 Java 堆內緩存中的常見算法及實戰 173
10.4 Guava Cache 實戰 . 190
10.4.1 創建Google 的容器工廠 190
10.4.2 屏蔽NULL 值 . 191
10.4.3 管理字符串 . 192
10.4.4 操作Google 的Multiset 容器 . 192
10.4.5 操作Google 的Multimap 容器 193
10.4.6 操作Google 的BiMap 容器 . 194
10.4.7 操作Google 的Table 容器 . 194
10.4.8 操作Google 的classToInstanceMap 容器 196
10.4.9 操作Google 的RangeSet 容器 . 196
10.4.10 操作Google 的RangeMap 容器. 198
10.4.11 操作Google 的Guava Cache 198
第11 章 堆外緩存與磁盤緩存解決方案:MapDB 203
11.1 問題描述 . 203
11.2 問題分析與解決方案 . 203
11.2.1 堆外緩存 . 203
11.2.2 MapDB 204
11.2.3 實戰:初次使用MapDB 205
11.3 MapDB 的構造原理 206
11.4 MapDB 的使用方法 208
11.5 MapDB 實戰 210
11.5.1 MapDB 的序列化 210
11.5.2 MapDB 的事務 211
11.5.3 MapDB 的監聽器與多級緩存 212
第12 章 基於Redis 的分布式鎖解決方案:Redisson . 214
12.1 分布式鎖與Redisson 原理 . 214
12.2 單機版超買或超賣問題描述及解決方案 216
12.3 分布式版超買或超賣問題描述及解決方案 218
12.4 多線程死鎖問題描述及解決方案 . 219
12.5 Redisson 實戰 223
12.5.1 Redisson 的可重入鎖 223
12.5.2 Redisson 的公平鎖 223
12.5.3 Redisson 的聯鎖 225
12.5.4 Redisson 的紅鎖 226
12.5.5 Redisson 的讀寫鎖 227
12.5.6 Redisson 的信號量 229
12.5.7 Redisson 的分布式閉鎖 230
第13 章 Java 中的常見架構與工具 . 233
13.1 自動化測試架構 . 233
13.2 自動化持續集成部署架構 . 233
13.3 高並發架構 . 234
13.4 響應式編程架構 . 236
13.5 負載均衡架構 . 238
13.6 監控工具與監控架構 . 239
13.7 其他工具與架構 . 241
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。