全書共分為6章,分別是命令列應用、HTTP應用、RPC應用、Web Socket 應用、進程內緩存和 Go語言中的大殺器,其中前5章是Go語言開發中最常見的專案類型。
本書對專案開發、細節分析、運行時分析等核心內容進行了較為深入的剖析,提供了相對完整的項目實踐經驗。在專案反覆運算過程中,難免會遇到問題,因此
本書針對Go語言的大殺器(分析工具)及常見問題進行了全面講解,幫助讀者對各類問題進行排查。本書適合有一定Go語言基礎的讀者以及相關開發人員閱讀。
作者介紹
陳劍煜(網名:煎魚)
微信公眾號 “腦子進煎魚了” 的作者,“Go夜讀” SIG小組成員,對Go語言有一定的興趣和經驗。在社區連載過一系列 Go 語言相關的技術文章,其中“跟煎魚學Go”系列廣受歡迎。
徐新華(網名:polaris)
Go語言中文網站長,目前在北京一家創業公司擔任CTO。2011年北京大學碩士畢業,先後在開心網、奇虎360工作。一直從事服務端相關工作,有著豐富的經驗。在Go1.0正式發佈時開始接觸Go語言,並將其用於工作中,。8年來一直致力於推廣Go語言在國內的發展,致力構建國內Go語言中文社區。
微信公眾號 “腦子進煎魚了” 的作者,“Go夜讀” SIG小組成員,對Go語言有一定的興趣和經驗。在社區連載過一系列 Go 語言相關的技術文章,其中“跟煎魚學Go”系列廣受歡迎。
徐新華(網名:polaris)
Go語言中文網站長,目前在北京一家創業公司擔任CTO。2011年北京大學碩士畢業,先後在開心網、奇虎360工作。一直從事服務端相關工作,有著豐富的經驗。在Go1.0正式發佈時開始接觸Go語言,並將其用於工作中,。8年來一直致力於推廣Go語言在國內的發展,致力構建國內Go語言中文社區。
目錄
第1章 命令列應用:打造屬於自己的工具集 1
1.1 工具之旅 1
1.1.1 標準庫flag 1
1.1.2 初始化項目 1
1.1.3 示例 2
1.1.4 分析 4
1.1.5 定義參數類型 7
1.1.6 小結 8
1.2 單詞格式轉換 8
1.2.1 安裝Cobra 8
1.2.2 初始化cmd和word子命令 8
1.2.3 單詞轉換 9
1.2.4 word子命令 11
1.2.5 驗證 12
1.2.6 小結 13
1.3 便捷的時間工具 13
1.3.1 獲取時間 14
1.3.2 推算時間 14
1.3.3 初始化子命令 15
1.3.4 驗證 17
1.3.5 時區問題 17
1.3.6 參考時間的格式 20
1.3.7 小結 20
1.4 SQL語句到結構體的轉換 20
1.4.1 需要轉換的資料結構 21
1.4.2 生成結構體 21
1.4.3 表到結構體的轉換 24
1.4.4 初始化子命令 28
1.4.5 驗證 30
1.4.6 小結 31
第2章 HTTP應用:寫一個完整的博客後端 32
2.1 博客之旅 32
2.1.1 gin 32
2.1.2 初始化項目 32
2.1.3 安裝gin 32
2.1.4 快速啟動 33
2.1.5 驗證 34
2.1.6 源碼分析 34
2.1.7 小結 38
2.2 專案設計 39
2.2.1 目錄結構 39
2.2.2 資料庫 40
2.2.3 創建model 42
2.2.4 路由 43
2.2.5 處理常式 44
2.2.6 啟動接入 45
2.2.7 驗證 46
2.2.8 小結 46
2.3 公共組件 46
2.3.1 錯誤碼標準化 47
2.3.2 配置管理 50
2.3.3 資料庫連接 55
2.3.4 日誌寫入 56
2.3.5 回應處理 62
2.3.6 小結 65
2.4 介面文檔 65
2.4.1 Swagger簡介 65
2.4.2 OpenAPI和Swagger 66
2.4.3 安裝 Swagger 66
2.4.4 寫入注解 66
2.4.5 生成 68
2.4.6 路由 68
2.4.7 查看介面文檔 69
2.4.8 源碼分析 70
2.4.9 存在的問題 72
2.4.10 小結 73
2.5 介面校驗 73
2.5.1 validator介紹 73
2.5.2 業務介面校驗 74
2.5.3 國際化處理 75
2.5.4 二次封裝 77
2.5.5 驗證 78
2.5.6 小結 79
2.6 模組開發:標籤管理 80
2.6.1 新建model方法 80
2.6.2 處理model回檔 81
2.6.3 新建dao方法 84
2.6.4 新建service方法 85
2.6.5 新增業務錯誤碼 86
2.6.6 新增路由方法 87
2.6.7 驗證介面 89
2.6.8 發現問題 89
2.6.9 解決問題 90
2.6.10 小結 91
2.7 模組開發:文章管理 91
2.7.1 新建model方法 91
2.7.2 新建dao方法 95
2.7.3 新建service方法 98
2.7.4 新增業務錯誤碼 100
2.7.5 新增路由方法 101
2.7.6 驗證介面 103
2.7.7 發現問題 103
2.7.8 解決問題 104
2.8 上傳圖片和檔服務 105
2.8.1 新增配置 105
2.8.2 上傳文件 105
2.8.3 新建service方法 109
2.8.4 新增業務錯誤碼 109
2.8.5 新增路由方法 110
2.8.6 驗證介面 111
2.8.7 檔服務 111
2.8.8 源碼分析 111
2.8.9 小結 112
2.9 API存取控制 112
2.9.1 JWT簡介 113
2.9.2 JWT的使用場景 115
2.9.3 安裝JWT 115
2.9.4 配置JWT 115
2.9.5 處理JWT權杖 116
2.9.6 獲取JWT權杖 118
2.9.7 處理應用中介軟體 121
2.9.8 小結 123
2.10 常見應用中介軟體 123
2.10.1 訪問日誌記錄 124
2.10.2 異常捕獲處理 125
2.10.3 服務資訊存儲 130
2.10.4 介面限流控制 131
2.10.5 統一超時控制 134
2.10.6 註冊中介軟體 136
2.11 鏈路追蹤 137
2.11.1 OpenTracing規範 137
2.11.2 Jaeger的使用 138
2.11.3 在應用中注入追蹤 139
2.11.4 驗證跟蹤情況 141
2.11.5 實現日誌追蹤 142
2.11.6 實現SQL追蹤 145
2.11.7 小結 146
2.12 應用配置問題 147
2.12.1 配置讀取 147
2.12.2 配置熱更新 151
2.12.3 小結 153
2.13 編譯器應用 153
2.13.1 編譯簡介 154
2.13.2 交叉編譯 158
2.13.3 編譯緩存 158
2.13.4 編譯檔大小 159
3.13.5 編譯資訊寫入 160
2.13.6 小結 162
2.14 優雅重啟和停止 163
2.14.1 遇到的問題 163
2.14.2 解決方案 164
2.14.3 常用的快速鍵 164
2.14.4 實現優雅重啟和停止 165
2.14.5 小結 166
2.15 思考 167
2.15.1 總結 167
2.15.2 作業 167
第3章 RPC應用:啟動你的RPC服務 169
3.1 gRPC和Protobuf 169
3.1.1 gRPC簡介 169
3.1.2 Protobuf簡介 170
3.1.3 gRPC的優點和缺點 172
3.1.4 小結 174
3.2 Protobuf的使用 174
3.2.1 安裝Protobuf 174
3.2.2 初始化Demo項目 175
3.2.3 編譯和生成proto檔 176
3.2.4 更多的資料類型支持 178
3.2.5 小結 180
3.3 gRPC的使用 180
3.3.1 安裝gRPC 180
3.3.2 gRPC的調用方式 180
3.3.3 Unary和Streaming RPC 187
3.3.4 用戶端與服務端是如何交互的 188
3.3.5 小結 193
3.4 運行一個gRPC服務 194
3.4.1 初始化項目 194
3.4.2 編譯和生成proto檔 194
3.4.3 編寫gRPC方法 196
3.4.4 編寫開機檔案 198
3.4.5 調試gRPC介面 198
3.4.6 gRPC的錯誤處理 199
3.4.7 源碼分析 204
3.5 gRPC服務間的內調 205
3.5.1 進行gRPC調用 206
3.5.2 grpc.Dial做了什麼 206
3.6 提供HTTP介面 209
3.6.1 支援其他協定 209
3.6.2 另起埠監聽HTTP 209
3.6.3 在同埠監聽HTTP 211
3.6.4 同埠同方法提供雙流量支援 213
3.6.5 其他方案 221
3.7 介面文檔 221
3.7.1 安裝和下載 221
3.7.2 靜態資源轉換 221
3.7.3 Swagger UI的處理和訪問 222
3.7.4 Swagger描述檔的生成和讀取 223
3.7.5 查看介面文檔 224
3.7.6 小結 224
3.8 gRPC攔截器 225
3.8.1 攔截器的類型 225
3.8.2 用戶端和服務端攔截器 225
3.8.3 實現一個攔截器 226
3.8.4 實現多個攔截器 227
3.8.5 “用”多個攔截器 228
3.8.6 常用服務端攔截器 230
3.8.7 常用用戶端攔截器 232
3.8.8 演示 235
3.9 metadata和RPC自訂認證 237
3.9.1 metadata介紹 237
3.9.2 metadata是如何傳遞的 239
3.9.3 對RPC方法做自訂認證 240
3.9.4 小結 242
3.10 鏈路追蹤 242
3.10.1 注入追蹤資訊 243
3.10.2 初始化Jaeger 243
3.10.3 metadata的讀取和設置 244
3.10.4 服務端 245
3.10.5 用戶端 246
3.10.6 實現HTTP追蹤 247
3.10.7 驗證 248
3.10.8 小結 249
3.11 gRPC服務註冊和發現 249
3.11.1 服務註冊和發現 250
3.11.2 gRPC負載均衡策略 251
3.11.3 實現服務註冊和發現 254
3.11.4 其他方案 257
3.12 實現自訂的protoc外掛程式 257
3.12.1 外掛程式的內部邏輯 258
3.12.2 generator.Plugin介面 259
3.12.3 FileDescriptor屬性 259
3.12.4 實現一個簡單的自訂外掛程式 262
3.12.5 實現定制化的gRPC自訂外掛程式 265
3.12.6 小結 272
3.13 對gRPC介面進行版本管理 272
3.13.1 介面變更 273
3.13.2 可相容性修改 273
3.13.3 破壞性修改 273
3.13.4 設計gRPC介面 273
3.13.5 版本號管理 274
3.14 常見問題討論 274
3.14.1 Q&A 274
3.14.2 小結 276
第4章 WebSocket應用:聊天室 277
4.1 基於 TCP 的聊天室 277
4.1.1 代碼實現 277
4.1.2 簡單用戶端 281
4.1.3 演示 281
4.1.4 改進 282
4.1.5 小結 283
4.2 認識 WebSocket 283
4.2.1 WebSocket簡介 283
4.2.2 WebSocket 的優點 284
4.2.3 選擇一個合適的庫 285
4.2.4 nhooyr.io/websocket的介紹和使用 287
4.2.5 抓包分析協議 289
4.2.6 小結 292
4.3 聊天室需求分析和設計 293
4.3.1 聊天室的主要需求 293
4.3.2 技術選擇 294
4.3.3 總體設計思路和流程 294
4.4 專案結構組織和基礎代碼框架 295
4.4.1 專案結構組織 295
4.4.2 基礎代碼框架 297
4.5 核心流程 299
4.5.1 前端關鍵代碼 299
4.5.2 後端流程關鍵代碼 303
4.5.3 小結 310
4.6 廣播器 311
4.6.1 單例模式 311
4.6.2 廣播器的實現 316
4.7 非核心功能 325
4.7.1 @ 提醒功能 325
4.7.2 敏感詞處理 328
4.7.3 離線消息處理 332
4.7.4 小結 341
4.8 關鍵性能分析和優化 341
4.8.1 測試工具 341
4.8.2 性能測試 344
4.8.3 小結 350
4.9 Nginx部署 350
4.10 總結 351
第5章 進程內緩存 352
5.1 緩存簡介 352
5.2 緩存淘汰演算法 353
5.2.1 初始化項目 353
5.2.2 緩存介面 353
5.2.3 FIFO演算法 354
5.2.4 LFU演算法 360
5.2.5 LRU演算法 366
5.3 進程內緩存 368
5.3.1 支援併發讀寫 368
5.3.2 緩存庫主體結構TourCache 369
5.3.3 測試 371
5.4 緩存的性能和優化思路 373
5.4.1 基準測試 373
5.4.2 優化方案 376
5.4.3 小結 378
5.5 高性能緩存庫――BigCache 378
5.5.1 簡單使用 378
5.5.2 優化技巧 380
5.5.3 小結 386
5.6 進程內緩存的優化版 386
5.6.1 分片技術的應用 386
5.6.2 測試 390
5.6.3 GC耗時驗證 391
5.6.4 小結 393
第6章 Go語言中的大殺器 394
6.1 Go大殺器之性能剖析PProf(上) 394
6.1.1 PProf簡介 394
6.1.2 PProf的使用 395
6.1.3 通過測試用例做剖析 405
6.1.4 通過Lookup寫入檔做剖析 407
6.1.5 為什麼要初始化net/http/pprof 409
6.1.6 小結 409
6.2 Go大殺器之性能剖析PProf(下) 409
6.2.1 場景 410
6.2.2 措施 410
6.2.3 排查 410
6.2.4 發現根源、解決問題 413
6.2.5 小結 414
6.3 Go大殺器之跟蹤剖析trace 414
6.3.1 trace簡介 415
6.3.2 實戰演練 420
6.3.3 小結 422
6.4 用GODEBUG看調度跟蹤 422
6.4.1 GODEBUG基礎知識 423
6.4.2 GODEBUG 424
6.4.3 小結 429
6.5 用GODEBUG看GC 429
6.5.1 GC基礎知識 429
6.5.2 GODEBUG 430
6.5.3 案例 432
6.5.4 涉及術語 433
6.5.5 小結 433
6.6 Go進程診斷工具gops 433
6.6.1 gops的基本使用 433
6.6.2 常規命令 434
6.6.3 源碼分析 437
6.6.4 需要注意的一點 439
6.6.5 小結 439
6.7 公開和發佈度量指標 439
6.7.1 expvar標準庫 439
6.7.2 Prometheus技術棧 444
6.7.3 小結 446
6.8 逃逸分析 447
6.8.1 思考 447
6.8.2 堆和棧 447
6.8.3 逃逸分析簡介 447
6.8.4 需要逃逸分析的原因 448
6.8.5 逃逸分析判斷 448
6.8.6 逃逸案例 448
6.6.7 小結 452
附錄A Go modules的入門和使用 453
附錄B goroutine與panic、recover的小問題 469
附錄C Go在容器運行時要注意的細節 477
附錄D 讓Go“恐慌”的十種方法 479
1.1 工具之旅 1
1.1.1 標準庫flag 1
1.1.2 初始化項目 1
1.1.3 示例 2
1.1.4 分析 4
1.1.5 定義參數類型 7
1.1.6 小結 8
1.2 單詞格式轉換 8
1.2.1 安裝Cobra 8
1.2.2 初始化cmd和word子命令 8
1.2.3 單詞轉換 9
1.2.4 word子命令 11
1.2.5 驗證 12
1.2.6 小結 13
1.3 便捷的時間工具 13
1.3.1 獲取時間 14
1.3.2 推算時間 14
1.3.3 初始化子命令 15
1.3.4 驗證 17
1.3.5 時區問題 17
1.3.6 參考時間的格式 20
1.3.7 小結 20
1.4 SQL語句到結構體的轉換 20
1.4.1 需要轉換的資料結構 21
1.4.2 生成結構體 21
1.4.3 表到結構體的轉換 24
1.4.4 初始化子命令 28
1.4.5 驗證 30
1.4.6 小結 31
第2章 HTTP應用:寫一個完整的博客後端 32
2.1 博客之旅 32
2.1.1 gin 32
2.1.2 初始化項目 32
2.1.3 安裝gin 32
2.1.4 快速啟動 33
2.1.5 驗證 34
2.1.6 源碼分析 34
2.1.7 小結 38
2.2 專案設計 39
2.2.1 目錄結構 39
2.2.2 資料庫 40
2.2.3 創建model 42
2.2.4 路由 43
2.2.5 處理常式 44
2.2.6 啟動接入 45
2.2.7 驗證 46
2.2.8 小結 46
2.3 公共組件 46
2.3.1 錯誤碼標準化 47
2.3.2 配置管理 50
2.3.3 資料庫連接 55
2.3.4 日誌寫入 56
2.3.5 回應處理 62
2.3.6 小結 65
2.4 介面文檔 65
2.4.1 Swagger簡介 65
2.4.2 OpenAPI和Swagger 66
2.4.3 安裝 Swagger 66
2.4.4 寫入注解 66
2.4.5 生成 68
2.4.6 路由 68
2.4.7 查看介面文檔 69
2.4.8 源碼分析 70
2.4.9 存在的問題 72
2.4.10 小結 73
2.5 介面校驗 73
2.5.1 validator介紹 73
2.5.2 業務介面校驗 74
2.5.3 國際化處理 75
2.5.4 二次封裝 77
2.5.5 驗證 78
2.5.6 小結 79
2.6 模組開發:標籤管理 80
2.6.1 新建model方法 80
2.6.2 處理model回檔 81
2.6.3 新建dao方法 84
2.6.4 新建service方法 85
2.6.5 新增業務錯誤碼 86
2.6.6 新增路由方法 87
2.6.7 驗證介面 89
2.6.8 發現問題 89
2.6.9 解決問題 90
2.6.10 小結 91
2.7 模組開發:文章管理 91
2.7.1 新建model方法 91
2.7.2 新建dao方法 95
2.7.3 新建service方法 98
2.7.4 新增業務錯誤碼 100
2.7.5 新增路由方法 101
2.7.6 驗證介面 103
2.7.7 發現問題 103
2.7.8 解決問題 104
2.8 上傳圖片和檔服務 105
2.8.1 新增配置 105
2.8.2 上傳文件 105
2.8.3 新建service方法 109
2.8.4 新增業務錯誤碼 109
2.8.5 新增路由方法 110
2.8.6 驗證介面 111
2.8.7 檔服務 111
2.8.8 源碼分析 111
2.8.9 小結 112
2.9 API存取控制 112
2.9.1 JWT簡介 113
2.9.2 JWT的使用場景 115
2.9.3 安裝JWT 115
2.9.4 配置JWT 115
2.9.5 處理JWT權杖 116
2.9.6 獲取JWT權杖 118
2.9.7 處理應用中介軟體 121
2.9.8 小結 123
2.10 常見應用中介軟體 123
2.10.1 訪問日誌記錄 124
2.10.2 異常捕獲處理 125
2.10.3 服務資訊存儲 130
2.10.4 介面限流控制 131
2.10.5 統一超時控制 134
2.10.6 註冊中介軟體 136
2.11 鏈路追蹤 137
2.11.1 OpenTracing規範 137
2.11.2 Jaeger的使用 138
2.11.3 在應用中注入追蹤 139
2.11.4 驗證跟蹤情況 141
2.11.5 實現日誌追蹤 142
2.11.6 實現SQL追蹤 145
2.11.7 小結 146
2.12 應用配置問題 147
2.12.1 配置讀取 147
2.12.2 配置熱更新 151
2.12.3 小結 153
2.13 編譯器應用 153
2.13.1 編譯簡介 154
2.13.2 交叉編譯 158
2.13.3 編譯緩存 158
2.13.4 編譯檔大小 159
3.13.5 編譯資訊寫入 160
2.13.6 小結 162
2.14 優雅重啟和停止 163
2.14.1 遇到的問題 163
2.14.2 解決方案 164
2.14.3 常用的快速鍵 164
2.14.4 實現優雅重啟和停止 165
2.14.5 小結 166
2.15 思考 167
2.15.1 總結 167
2.15.2 作業 167
第3章 RPC應用:啟動你的RPC服務 169
3.1 gRPC和Protobuf 169
3.1.1 gRPC簡介 169
3.1.2 Protobuf簡介 170
3.1.3 gRPC的優點和缺點 172
3.1.4 小結 174
3.2 Protobuf的使用 174
3.2.1 安裝Protobuf 174
3.2.2 初始化Demo項目 175
3.2.3 編譯和生成proto檔 176
3.2.4 更多的資料類型支持 178
3.2.5 小結 180
3.3 gRPC的使用 180
3.3.1 安裝gRPC 180
3.3.2 gRPC的調用方式 180
3.3.3 Unary和Streaming RPC 187
3.3.4 用戶端與服務端是如何交互的 188
3.3.5 小結 193
3.4 運行一個gRPC服務 194
3.4.1 初始化項目 194
3.4.2 編譯和生成proto檔 194
3.4.3 編寫gRPC方法 196
3.4.4 編寫開機檔案 198
3.4.5 調試gRPC介面 198
3.4.6 gRPC的錯誤處理 199
3.4.7 源碼分析 204
3.5 gRPC服務間的內調 205
3.5.1 進行gRPC調用 206
3.5.2 grpc.Dial做了什麼 206
3.6 提供HTTP介面 209
3.6.1 支援其他協定 209
3.6.2 另起埠監聽HTTP 209
3.6.3 在同埠監聽HTTP 211
3.6.4 同埠同方法提供雙流量支援 213
3.6.5 其他方案 221
3.7 介面文檔 221
3.7.1 安裝和下載 221
3.7.2 靜態資源轉換 221
3.7.3 Swagger UI的處理和訪問 222
3.7.4 Swagger描述檔的生成和讀取 223
3.7.5 查看介面文檔 224
3.7.6 小結 224
3.8 gRPC攔截器 225
3.8.1 攔截器的類型 225
3.8.2 用戶端和服務端攔截器 225
3.8.3 實現一個攔截器 226
3.8.4 實現多個攔截器 227
3.8.5 “用”多個攔截器 228
3.8.6 常用服務端攔截器 230
3.8.7 常用用戶端攔截器 232
3.8.8 演示 235
3.9 metadata和RPC自訂認證 237
3.9.1 metadata介紹 237
3.9.2 metadata是如何傳遞的 239
3.9.3 對RPC方法做自訂認證 240
3.9.4 小結 242
3.10 鏈路追蹤 242
3.10.1 注入追蹤資訊 243
3.10.2 初始化Jaeger 243
3.10.3 metadata的讀取和設置 244
3.10.4 服務端 245
3.10.5 用戶端 246
3.10.6 實現HTTP追蹤 247
3.10.7 驗證 248
3.10.8 小結 249
3.11 gRPC服務註冊和發現 249
3.11.1 服務註冊和發現 250
3.11.2 gRPC負載均衡策略 251
3.11.3 實現服務註冊和發現 254
3.11.4 其他方案 257
3.12 實現自訂的protoc外掛程式 257
3.12.1 外掛程式的內部邏輯 258
3.12.2 generator.Plugin介面 259
3.12.3 FileDescriptor屬性 259
3.12.4 實現一個簡單的自訂外掛程式 262
3.12.5 實現定制化的gRPC自訂外掛程式 265
3.12.6 小結 272
3.13 對gRPC介面進行版本管理 272
3.13.1 介面變更 273
3.13.2 可相容性修改 273
3.13.3 破壞性修改 273
3.13.4 設計gRPC介面 273
3.13.5 版本號管理 274
3.14 常見問題討論 274
3.14.1 Q&A 274
3.14.2 小結 276
第4章 WebSocket應用:聊天室 277
4.1 基於 TCP 的聊天室 277
4.1.1 代碼實現 277
4.1.2 簡單用戶端 281
4.1.3 演示 281
4.1.4 改進 282
4.1.5 小結 283
4.2 認識 WebSocket 283
4.2.1 WebSocket簡介 283
4.2.2 WebSocket 的優點 284
4.2.3 選擇一個合適的庫 285
4.2.4 nhooyr.io/websocket的介紹和使用 287
4.2.5 抓包分析協議 289
4.2.6 小結 292
4.3 聊天室需求分析和設計 293
4.3.1 聊天室的主要需求 293
4.3.2 技術選擇 294
4.3.3 總體設計思路和流程 294
4.4 專案結構組織和基礎代碼框架 295
4.4.1 專案結構組織 295
4.4.2 基礎代碼框架 297
4.5 核心流程 299
4.5.1 前端關鍵代碼 299
4.5.2 後端流程關鍵代碼 303
4.5.3 小結 310
4.6 廣播器 311
4.6.1 單例模式 311
4.6.2 廣播器的實現 316
4.7 非核心功能 325
4.7.1 @ 提醒功能 325
4.7.2 敏感詞處理 328
4.7.3 離線消息處理 332
4.7.4 小結 341
4.8 關鍵性能分析和優化 341
4.8.1 測試工具 341
4.8.2 性能測試 344
4.8.3 小結 350
4.9 Nginx部署 350
4.10 總結 351
第5章 進程內緩存 352
5.1 緩存簡介 352
5.2 緩存淘汰演算法 353
5.2.1 初始化項目 353
5.2.2 緩存介面 353
5.2.3 FIFO演算法 354
5.2.4 LFU演算法 360
5.2.5 LRU演算法 366
5.3 進程內緩存 368
5.3.1 支援併發讀寫 368
5.3.2 緩存庫主體結構TourCache 369
5.3.3 測試 371
5.4 緩存的性能和優化思路 373
5.4.1 基準測試 373
5.4.2 優化方案 376
5.4.3 小結 378
5.5 高性能緩存庫――BigCache 378
5.5.1 簡單使用 378
5.5.2 優化技巧 380
5.5.3 小結 386
5.6 進程內緩存的優化版 386
5.6.1 分片技術的應用 386
5.6.2 測試 390
5.6.3 GC耗時驗證 391
5.6.4 小結 393
第6章 Go語言中的大殺器 394
6.1 Go大殺器之性能剖析PProf(上) 394
6.1.1 PProf簡介 394
6.1.2 PProf的使用 395
6.1.3 通過測試用例做剖析 405
6.1.4 通過Lookup寫入檔做剖析 407
6.1.5 為什麼要初始化net/http/pprof 409
6.1.6 小結 409
6.2 Go大殺器之性能剖析PProf(下) 409
6.2.1 場景 410
6.2.2 措施 410
6.2.3 排查 410
6.2.4 發現根源、解決問題 413
6.2.5 小結 414
6.3 Go大殺器之跟蹤剖析trace 414
6.3.1 trace簡介 415
6.3.2 實戰演練 420
6.3.3 小結 422
6.4 用GODEBUG看調度跟蹤 422
6.4.1 GODEBUG基礎知識 423
6.4.2 GODEBUG 424
6.4.3 小結 429
6.5 用GODEBUG看GC 429
6.5.1 GC基礎知識 429
6.5.2 GODEBUG 430
6.5.3 案例 432
6.5.4 涉及術語 433
6.5.5 小結 433
6.6 Go進程診斷工具gops 433
6.6.1 gops的基本使用 433
6.6.2 常規命令 434
6.6.3 源碼分析 437
6.6.4 需要注意的一點 439
6.6.5 小結 439
6.7 公開和發佈度量指標 439
6.7.1 expvar標準庫 439
6.7.2 Prometheus技術棧 444
6.7.3 小結 446
6.8 逃逸分析 447
6.8.1 思考 447
6.8.2 堆和棧 447
6.8.3 逃逸分析簡介 447
6.8.4 需要逃逸分析的原因 448
6.8.5 逃逸分析判斷 448
6.8.6 逃逸案例 448
6.6.7 小結 452
附錄A Go modules的入門和使用 453
附錄B goroutine與panic、recover的小問題 469
附錄C Go在容器運行時要注意的細節 477
附錄D 讓Go“恐慌”的十種方法 479
網路書店
類別
折扣
價格
-
新書$648