內容簡介
本書針對Go語言進行微服務開發做了全面細緻的介紹,書中內容包括四大部分。
第①部分為Go語言基礎(第1~7章),包括Go語言基礎語法、Go語言基本特性和Go語言實戰項目等內容。
第②部分為Go語言進階(第8~10章),主要介紹Go語言的並發編程進階、Go語言Web編程以及綜合實戰。
第③部分為微服務理論(第11~18章),包括微服務模式的理論基礎、微服務的進程間通信、微服務的分散式事務管理、領域驅動設計(DDD)、微服務測試、Docker及ES-CQRS策略。其中,微服務進程間通信重點介紹了gRPC,ES-CQRS策略部分給出了Go語言的實現。
第④部分為微服務實戰(第19~22章),這一部分通過實戰項目講解了微服務的生產環境、日誌和監控、持續部署等內容。
書中每一部分都提供了示例代碼或實戰項目,供讀者邊學習邊動手實踐,儘量做到讓有Go語言基礎的人儘快了解、掌握微服務模式。
圖書目錄
前言
第一部分 Go語言基礎
第1章 Go語言程式基礎 2
1.1 Hello,World! 2
1.2 變數、指針及賦值 5
1.2.1 變數和常量 5
1.2.2 指針 8
1.2.3 賦值 9
1.3 包及作用域 10
1.4 選擇和循環 12
1.5 垃圾回收 13
1.6 小結 15
第2章 基本數據類型 16
2.1 整型 17
2.1.1 整型取值範圍 17
2.1.2 運算符 18
2.2 浮點型 19
2.3 複數和布爾類型 21
2.4 格式化說明符 22
2.5 小結 22
第3章 字元串與複合數據類型 23
3.1 字元串和數組 23
3.1.1 字元串 24
3.1.2 數組 26
3.2 slice 27
3.2.1 結構定義 27
3.2.2 基本操作 28
3.2.3 append 30
3.2.4 copy 31
3.2.5 其他 32
3.3 map 33
3.3.1 定義 33
3.3.2 基本操作 33
3.4 struct 35
3.4.1 結構定義 36
3.4.2 基本操作 37
3.4.3 組合 38
3.5 JSON 40
3.6 小結 40
第4章 函式、方法、接口和反射 41
4.1 函式 41
4.1.1 函式的定義 41
4.1.2 閉包 42
4.1.3 作用域 43
4.1.4 多返回值及變長參數 45
4.1.5 defer關鍵字 46
4.2 方法 46
4.3 接口 50
4.4 反射 54
4.5 小結 57
第5章 並發編程 59
5.1 協程 59
5.1.1 核心概念 60
5.1.2 goroutine的基本使用 60
5.1.3 sync.WaitGroup 62
5.2 通道 64
5.2.1 channel寫入數據 64
5.2.2 channel接收數據 65
5.2.3 以channel作為函式參數 66
5.2.4 快取channel 67
5.2.5 select 70
5.2.6 逾時檢查 71
5.3 pipeline 74
5.4 小結 76
第6章 包和代碼測試 77
6.1 包及Go工具 77
6.1.1 包導入 78
6.1.2 Go工具 79
6.2 代碼最佳化 84
6.2.1 Go代碼的最佳化 84
6.2.2 性能分析 84
6.3 測試 90
6.3.1 功能測試函式 91
6.3.2 基準測試函式 93
6.3.3 示例函式 96
6.4 小結 98
第7章 綜合實戰案例 99
7.1 案例需求 99
7.2 通信協定 100
7.3 伺服器端 104
7.4 客戶端 109
7.5 小結 116
第二部分 Go語言進階
第8章 並發編程進階 118
8.1 競態與併發模式 118
8.1.1 數據競態 118
8.1.2 並發原理 123
8.2 sync包 126
8.2.1 sync.Mutex互斥鎖 126
8.2.2 sync.RWMutex多讀寫鎖 128
8.2.3 sync.Once 130
8.2.4 sync.Cond 131
8.2.5 sync.Pool 134
8.2.6 sync.Map 136
8.3 context包 138
8.3.1 套用場景 138
8.3.2 定義 139
8.3.3 繼承 141
8.3.4 示例 142
8.4 工作池 145
8.5 小結 151
第9章 Go Web編程 152
9.1 net/http包 152
9.1.1 Go Web工作的基本原理 152
9.1.2 http詳解 156
9.2 Web框架 162
9.2.1 選擇框架 162
9.2.2 httprouter框架 163
9.3 Web底層服務 165
9.3.1 Scoket簡介 165
9.3.2 TCP Socket 166
9.3.3 UDP Socket 169
9.3.4 WebSocket 171
9.4 中間件 174
9.4.1 基本用法 174
9.4.2 進階用法 176
9.5 資料庫訪問 179
9.5.1 database/sql接口 180
9.5.2 sqlx 182
9.6 小結 183
第10章 綜合案例 184
10.1 案例需求 184
10.2 項目代碼布局 186
10.3 配置和日誌 187
10.3.1 配置 188
10.3.2 日誌 190
10.4 模型 191
10.5 gin框架 193
10.6 小結 196
第三部分 微服務理論
第11章 微服務 198
11.1 微服務簡介 198
11.1.1 什麼是微服務 198
11.1.2 微服務的由來 198
11.1.3 微服務與微服務架構 199
11.2 系統架構的演進 199
11.2.1 單體架構 200
11.2.2 垂直架構 201
11.2.3 SOA 201
11.2.4 微服務架構 202
11.3 小結 205
第12章 微服務化策略 206
12.1 微服務架構風格 206
12.1.1 每個服務都擁有獨立的資料庫 206
12.1.2 基於API的模組化 207
12.2 微服務化進程中的重點問題 207
12.2.1 微服務的通信 207
12.2.2 事務管理的一致性 208
12.2.3 微服務數據查詢 208
12.2.4 微服務部署 208
12.2.5 微服務生產環境監控 209
12.2.6 微服務的自動化測試 209
12.3 微服務的拆分 209
12.3.1 拆分的指導原則 210
12.3.2 依據業務能力拆分 210
12.3.3 依據領域驅動設計拆分 211
12.3.4 服務API的定義 213
12.4 小結 214
第13章 微服務中的進程間通信 215
13.1 微服務中的進程間通信概述 215
13.1.1 互動模式 215
13.1.2 API定義 217
13.2 protobuf格式 217
13.2.1 protobuf簡介 217
13.2.2 protobuf的簡單使用 217
13.3 gRPC包 219
13.3.1 net/rpc包 219
13.3.2 gRPC簡介 221
13.3.3 Go語言實現gRPC調用 222
13.4 微服務發現:consul 224
13.5 小結 226
第14章 微服務中的分散式事務管理 227
14.1 微服務下的事務管理 227
14.1.1 面臨的難題 227
14.1.2 SRP的折衷 228
14.2 微服務中處理事務的幾種方式 229
14.2.1 避免跨微服務的事務 229
14.2.2 基於XA協定的兩階段提交協定 229
14.2.3 最終一致性和補償 231
14.3 Saga模式 234
14.3.1 Saga模式介紹 234
14.3.2 編排模式 235
14.3.3 編配模式 237
14.4 Saga模式的Go語言示例 238
14.4.1 Saga對象的Go語言實現 238
14.4.2 中央協調器的Go語言實現 239
14.5 小結 243
第15章 領域驅動設計的Go語言實現 244
15.1 聚合模式介紹 244
15.2 使用聚合模式 247
15.2.1 聚合擁有明確的邊界 247
15.2.2 聚合的規則 248
15.2.3 聚合顆粒度 250
15.2.4 使用聚合設計業務邏輯 250
15.3 領域事件 251
15.4 Go語言領域模型的模擬實現 252
15.4.1 聚合 253
15.4.2 實體和值對象 253
15.4.3 服務 255
15.5 小結 257
第16章 微服務中的測試 258
16.1 測試金字塔 258
16.2 單元測試 260
16.3 依賴注入和mock測試 263
16.4 行為驅動開發 266
16.5 使用Docker Compose測試 272
16.6 小結 275
第17章 微服務運行環境:Docker 276
17.1 Docker介紹 276
17.1.1 Docker引擎 276
17.1.2 守護進程 277
17.1.3 鏡像及容器 277
17.1.4 倉庫 278
17.1.5 數據卷 278
17.2 運行第一個Docker容器 279
17.2.1 Docker安裝 279
17.2.2 HelloWorld程式示例 279
17.2.3 運行複雜一點的容器 280
17.3 Docker數據持久化 282
17.3.1 數據卷 282
17.3.2 bind mount 284
17.4 Docker網路 285
17.4.1 橋接驅動及自定義bridge 285
17.4.2 Host模式、Overlay模式及None模式 288
17.5 小結 289
第18章 Go語言基於ES-CQRS的微服務實踐 290
18.1 理論介紹 290
18.1.1 事件溯源 290
18.1.2 命令查詢職責分離 291
18.2 ES-CQRS在Go語言中的實現示例 292
18.2.1 需求 293
18.2.2 分析與設計 293
18.2.3 核心實現 296
18.3 小結 299
第四部分 微服務實戰
第19章 生產環境的微服務安全 302
19.1 加密和簽名 302
19.1.1 對稱密鑰加密 302
19.1.2 公鑰密碼 303
19.1.3 X.509數字證書 303
19.1.4 TLS/SSL 304
19.2 外部安全 304
19.2.1 防火牆 304
19.2.2 頁面套用的防火牆 305
19.2.3 API網關 305
19.2.4 DDoS保護 306
19.3 套用安全 307
19.3.1 攻擊者如何繞過防火牆 308
19.3.2 輸入校驗 308
19.3.3 TLS 310
19.3.4 在rest中進行數據保護 313
19.3.5 JWT 314
19.3.6 大訊息的非對稱加密 315
19.4 運維安全 316
19.4.1 修補容器 316
19.4.2 軟體更新 317
19.4.3 修補應用程式代碼 317
19.4.4 日誌 317
19.5 小結 317
第20章 日誌和監控 318
20.1 日誌最佳實踐 319
20.2 指標 319
20.2.1 指標數據類型 320
20.2.2 命名約定 320
20.2.3 存儲和查詢 322
20.2.4 Grafana 323
20.3 日誌記錄 326
20.3.1 具有關聯ID的分散式跟蹤 326
20.3.2 ElasticSearch、Logstash和Kibana 327
20.3.3 Kibana 328
20.4 異常 330
20.5 小結 332
第21章 持續交付 333
21.1 持續交付簡介 333
21.1.1 手動部署 334
21.1.2 持續交付的好處 334
21.1.3 持續交付面面觀 335
21.1.4 持續交付的過程 337
21.2 容器編排的選項和基礎架構 338
21.3 Terraform 339
21.3.1 提供者 340
21.3.2 Terraform配置入口點 341
21.3.3 VPC模組 342
21.3.4 輸出變數 346
21.3.5 創建基礎架構 348
21.4 套用範例 348
21.4.1 持續部署的工作流程 349
21.4.2 構建 352
21.4.3 測試 353
21.4.4 基準測試 354
21.4.5 靜態代碼測試 354
21.4.6 集成測試 355
21.4.7 部署 356
21.4.8 冒煙測試 357
21.4.9 監控和預警 357
21.5 小結 359
第22章 使用Go kit框架構建微服務 360
22.1 創建服務 361
22.1.1 測試 361
22.1.2 Go語言中的構造函式 362
22.1.3 使用bcrypt進行Hash處理並驗證密碼 363
22.2 使用請求和回響對方法調用進行建模 364
22.2.1 Go kit中的端點 365
22.2.2 為服務方法設定終點 366
22.2.3 不同級別的錯誤 366
22.2.4 將端點包裝到服務實現中 367
22.3 使用Go kit實現一個HTTP伺服器 368
22.4 Go kit中的gRPC伺服器 368
22.5 創建伺服器命令 371
22.5.1 使用Go kit端點 373
22.5.2 運行HTTP伺服器 373
22.5.3 運行gRPC伺服器 373
22.5.4 防止main函式突然終止 374
22.5.5 通過HTTP使用服務 374
22.6 構建一個gRPC客戶端 375
22.6.1 使用服務的命令行工具 376
22.6.2 在CLI中解析參數 377
22.7 服務中間件的速率限制 378
22.7.1 Go kit中的中間件 378
22.7.2 速率限制 380
22.8 小結 380
附錄 Go語言中的關鍵字 381
作者簡介
劉金亮,研究生畢業於北京大學,現任用友集團架構師。曾經參與IBM、Accenture、Capgemini的軟體系統諮詢和開發項目,對複雜業務系統的架構和設計有豐富的經驗,著有《Odoo快速入門與實戰》。