《Go語言高並發與微服務實戰》是2020年中國鐵道出版社出版的圖書,作者是朱榮鑫、黃迪璇、張天。
基本介紹
- 中文名:Go語言高並發與微服務實戰
- 作者:朱榮鑫、黃迪璇、張天
- 出版社:中國鐵道出版社
- ISBN:9787113266622
內容簡介,圖書目錄,
內容簡介
近年來雲原生技術發展迅猛,幫助開發者在雲上快速和頻繁地構建、發布和部署套用,以提高開發效率和快速定位故障。 微服務作為開展雲原生技術落地的核心,它將複雜的單體套用按照業務劃分並進行有效地拆分,每個微服務都可以進行獨立部署和開發,大大提升了套用開發效率。Go語言作為新生代的編譯型程式語言,具備語法簡單、高並發性能良好和編譯速度快等特點,是微服務架構落地實踐的絕妙利器。
圖書目錄
第一篇 雲原生與微服務
雲原生與微服務分別是什麼,它們之間有什麼關係呢?本部分圍繞雲原生與微服務的概 念展開介紹,我們透過雲計算的歷史和系統架構的演進,具體了解這兩個概念的意義及其背 後的技術發展。
第 1 章 雲原生架構
1.1 雲計算的歷史 1
1.1.1 雲計算的基礎:虛擬化技術 1
1.1.2 基於虛擬機的雲計算 3
1.1.3 容器的橫空出世和容器編排大戰 5
1.1.4 雲計算演進總結 6
1.2 雲原生是什麼 7
1.2.1 雲原生出現的背景 7
1.2.2 雲原生的定義 8
1.2.3 雲原生與 12 因素 9
1.3 雲原生的基礎架構 11
1.3.1 微服務 11
1.3.2 容器 12
1.3.3 服務格線 13
1.3.4 DevOps 14
1.4 小結 15
第 2 章 微服務概述
2.1 系統架構的演進 16
2.1.1 單體架構 16
2.1.2 垂直分層架構 17
2.1.3 SOA 面向服務架構 17
2.1.4 微服務架構 19
2.1.5 雲原生架構 21
2.2 常見的微服務框架 22
2.2.1 Java 中的 Spring Cloud 與 Dubbo 框架 22
2.2.2 Go 語言中的 Go Kit 與 Go Micro 框架 24
2.3 微服務設計的六大原則 27
1.高內聚,低耦合 27
2.高度自治 27
3.以業務為中心 28
4.彈性設計 28
5.日誌與監控 28
6.自動化 28
2.4 領域驅動設計 28
2.4.1 設計微服務的困境 28
2.4.2 解困之法:領域驅動設計(DDD) 29
2.4.3 DDD 的套用領域 30
2.4.4 DDD 領域劃分 31
2.4.5 微服務架構中的團隊組織和管理 33
2.5 小結 34
第二篇 Go 語法基礎與特性功能
在正式進入微服務組件的學習之前,我們要鞏固一下 Go 語言的基礎,包括容器、原生 數據類型、函式與接口、結構體和方法等常用的語法基礎;其次是 Go 語言的特性功能:反 射與並發模型,介紹 Go 語言協程、通道、多路復用和同步的具體實踐;最後是 Golang Web 的相關介紹,一起構建一個完整的 Go Web 伺服器。
第 3 章 Go 語言基礎
3.1 Go 語言介紹 35
3.2 環境安裝 36
3.2.1 Go 開發包安裝 36
3.2.2 第一個 Go 語言程式 38
3.2.3 編譯工具 40
3.3 基本語法 41
3.3.1 變數的聲明與初始化 41
3.3.2 原生數據類型 43
【實例 3-1】分別以 byte 和 rune 的方式遍歷字元串 44
3.3.3 指針 45
【實例 3-2】使用 flag 從命令行中讀取參數 47
3.3.4 常量與類型別名 48
3.3.5 分支與循環控制 49
3.4 Go 中常用的容器 50
3.4.1 數組 50
3.4.2 切片 51
【實例 3-3】切片的動態擴容 53
3.4.3 列表與字典 54
3.4.4 容器遍歷 57
【實例 3-4】對給出的數組 nums、切片 slis 和字典 tmpMap 分別進行遍歷 57
3.5 函式與接口 58
3.5.1 函式聲明和參數傳遞 58
3.5.2 匿名函式和閉包 59
【實例 3-5】使用回調函式處理字元串 59
【實例 3-6】用閉包的特性實現一個簡單的計數器 60
3.5.3 接口聲明和嵌套 61
3.5.4 函式體實現接口 62
3.6 結構體和方法 62
3.6.1 結構體的定義 63
3.6.2 結構體的實例化和初始化 63
3.6.3 方法與接收器 64
【實例 3-7】為 Person 結構體添加修改姓名和輸出個人信息兩個方法 65
3.6.4 結構體實現接口 66
【實例 3-8】使用一個結構體同時實現 Cat 和 Dog 接口 66
3.6.5 內嵌和組合 67
【實例 3-9】內嵌不同結構體表現不同行為 68
3.7 小結 69
第 4 章 進階——Go 語言高級特性
4.1 依賴管理 70
4.1.1 包管理 70
4.1.2 GOPATH 72
4.1.3 Go Modules 73
4.2 反射基礎 73
4.2.1 reflect.Type 類型對象 74
4.2.2 類型對象 reflect.StructField 和 reflect.Method 76
4.2.3 reflect.Value 反射值對象 78
【實例 4-1】使用反射調用接口方法 80
4.3 並發模型 82
4.3.1 並發與並行 82
4.3.2 CSP 並發模型 82
4.3.3 常見的執行緒模型 83
4.3.4 MPG 執行緒模型概述 85
4.4 並發實踐 87
4.4.1 協程 goroutine 87
4.4.2 通道 channel 89
【實例 4-2】協程使用 channel 傳送和接收數據 90
【實例 4-3】使用帶緩衝區的 channel 91
【實例 4-4】使用 switch 從多個 channel 中讀取數據 92
4.4.3 sync 同步包 94
【實例 4-5】使用 sync.Mutex 控制多 goroutine 串列執行 94
【實例 4-6】sync.RWMutex 允許多讀和單寫 95
【實例 4-7】sync.WaitGroup 阻塞主 goroutine 直到其他 goroutine 執行結束 97
【實例 4-8】使用 sync.Map 並發添加數據 98
4.5 小結 99
第 5 章 構建 Go Web 伺服器
5.1 Web 的工作原理 100
5.1.1 HTTP 協定詳解 100
5.1.2 訪問 Web 站點的過程 103
5.2 使用 Go 語言構建伺服器 104
【實例 5-1】快速搭建一個 Go Web 伺服器 104
5.3 接收和處理請求 105
5.3.1 Web 工作的幾個概念 106
5.3.2 處理器處理請求 107
5.3.3 解析請求體 109
【實例 5-2】Go Web 請求體解析 109
5.3.4 返迴響應體 111
【實例 5-3】返迴響應體實踐 112
5.4 實踐案例:Golang Web 框架 Gin 實踐 113
5.5 服務端數據存儲 116
5.5.1 記憶體存儲 116
【實例 5-4】服務端基於記憶體的存儲方式實踐 116
5.5.2 database/sql 接口 118
5.5.3 關係資料庫存儲(MySQL) 118
【實例 5-5】服務端基於 MySQL 的存儲方式實踐 119
5.5.4 Nosql 資料庫存儲(MongoDB) 120
【實例 5-6】服務端基於 MongoDB 的存儲方式實踐 121
5.6 Golang ORM 框架 beego 實踐 122
5.7 小結 125
第三篇 微服務核心組件
本部分是全書的核心,介紹微服務中各個核心組件的原理和實踐套用,包括分散式配置 中心、服務註冊與發現、微服務網關、微服務的容錯、微服務中的通信與負載均衡、統一認 證與授權、微服務中的鏈路追蹤。通過組件原理的介紹、組件的選型對比以及組件的實踐應 用,吃透每一個微服務組件。
第 6 章 服務註冊與發現
6.1 服務註冊與發現的基本原理 126
6.1.1 服務註冊與發現中心的職責 126
6.1.2 服務實例註冊服務信息 127
6.1.3 CAP 原理 127
6.2 常用的服務註冊與發現框架 128
6.2.1 基於 Raft 算法的開箱即用服務發現組件 Consul 128
6.2.2 基於 HTTP 協定的分散式 key/Value 存儲組件 Etcd 130
6.2.3 重量級一致性服務組件 Zookeeper 131
6.2.4 服務註冊與發現組件的對比與選型 132
6.3 Consul 安裝和接口定義 133
6.3.1 Consul 的安裝與啟動 133
6.3.2 Go-kit 項目結構 134
6.3.3 服務註冊與發現接口 135
6.3.4 項目的總體結構 135
6.4 實踐案例:直接使用 HTTP 的方式和 Consul 互動 140
6.4.1 服務註冊與健康檢查 142
6.4.2 服務註銷 144
6.4.3 服務發現 146
6.5 實踐案例:藉助 Go-kit 服務註冊與發現包和 Consul 互動 147
6.5.1 服務註冊與健康檢查 148
6.5.2 服務註銷 149
6.5.3 服務發現 150
6.5.4 服務實例信息快取 150
6.5.5 MyDiscoverClient 和 KitDiscoverClient 的比較 153
6.6 實踐案例:基於服務註冊與發現的 string-service 153
6.6.1 項目結構 153
6.6.2 各層構建 154
6.7 小結 162
第 7 章 遠程過程調用 RPC
7.1 RPC 機制和實現過程 164
7.1.1 RPC 機制 164
7.1.2 傳遞參數 167
7.1.3 通信協定制定 168
7.1.4 出錯和逾時處理 170
7.1.5 通用 RPC 接口 171
7.2 簡易的 Go 語言原生 RPC 172
7.2.1 實踐案例:Go 語言 RPC 過程調用實踐 172
7.2.2 服務端註冊實現原理分析 175
7.2.3 服務端處理 RPC 請求原理分析 178
7.2.4 客戶端傳送 RPC 請求原理分析 182
7.2.5 資源重用 187
7.3 高性能的 gRPC 188
7.3.1 gRPC 的安裝 189
7.3.2 實踐案例:gRPC 過程調用實踐 190
7.3.3 流式編程 193
【實例 7-1】gRPC 流式請求 193
7.4 便捷的 Go-kit RPC 196
7.4.1 Go-kit 簡介 196
7.4.2 實踐案例:Go-kit 過程調用實踐 197
7.5 小結 202
第 8 章 分散式配置中心
8.1 如何管理分散式套用的配置 203
8.2 常見分散式配置中心開源組件 204
8.2.1 Spring Cloud Config. 204
8.2.2 Apollo 205
8.2.3 Disconf 208
8.2.4 分散式配置中心的對比 210
8.3 套用 Spring Cloud Config 統一管理配置 210
8.3.1 搭建 Spring Cloud Config Server 210
8.3.2 Viper 介紹 213
【實例 8-1】Viper 實現讀取本地配置信息 214
8.3.3 實戰案例:動手實現 Spring Cloud Config 的 Go 語言客戶端 216
8.4 實踐案例:實現配置的熱更新 219
8.4.1 如何實現熱更新 219
8.4.2 Go 語言客戶端改進 220
8.4.3 結果驗證 223
8.5 配置信息的加密解密 224
8.5.1 JCE 環境安裝 225
8.5.2 對稱加密與解密 225
8.5.3 非對稱加密與解密 226
8.6 小結 227
第 9 章 微服務網關
9.1 微服務網關介紹與功能特性 228
9.2 實踐案例:自己動手實現一個網關 231
9.2.1 實現思路 231
9.2.2 編寫反向代理方法 232
9.2.3 編寫入口方法 233
9.2.4 運行 235
9.2.5 測試 235
9.3 API 網關選型 235
9.3.1 標配組件:Nginx 網關 236
9.3.2 Java 前置網關服務最佳選型:Netflix Zuul 237
9.3.3 高可用服務網關:Mashape Kong 239
9.3.4 三種常用 API 網關組件的指標對比 240
9.4 Kong 接入 240
9.4.1 為什麼使用 Kong 240
9.4.2 Kong 安裝實踐 241
【實例 9-1】Docker 方式安裝 Kong 242
9.4.3 創建服務 244
9.4.4 創建路由 245
9.5 安裝 Kong 外掛程式 246
9.5.1 跨域身份驗證:JWT 認證外掛程式 246
9.5.2 系統監控報警:Prometheus 可視化監控外掛程式 248
9.5.3 實時鏈路數據追蹤:Zipkin 外掛程式 250
9.5.4 進階套用:自定義 Kong 外掛程式 252
【實例 9-2】自定義鑒權外掛程式 token-auth 252
9.6 小結 257
第 10 章 微服務的容錯處理與負載均衡
10.1 服務熔斷 258
10.1.1 分散式系統中的服務雪崩 258
10.1.2 服務熔斷保障系統可用性 260
10.1.3 斷路器 261
10.2 負載均衡 262
10.2.1 負載均衡類型 262
10.2.2 負載均衡算法 262
10.3 實踐案例:服務熔斷和負載均衡使用 263
10.3.1 負載均衡器 263
10.3.2 服務編寫 264
10.3.3 使用 Go-kit Hystrix 中間件 270
【實例 10-1】使用 Go-kit Hystrix 中間件修飾 Endpoint 270
10.4 Hystrix 詳解 271
10.4.1 Hystrix 基本使用 272
10.4.2 運行流程 273
10.4.3 常用參數配置 274
10.5 Hystrix 監控面板 275
10.5.1 獲取 Hystrix 命令調用信息 275
10.5.2 使用 Hystrix Dashboard 可視化面板 277
10.6 實踐案例:在網關中添加 Hystrix 熔斷和負載均衡 279
10.7 小結 282
第 11 章 統一認證與授權
11.1 微服務安全的挑戰和現狀 283
11.2 常見的認證與授權方案 283
11.2.1 當前行業授權標準 OAuth2 283
11.2.2 數據共享的分散式 Session 287
11.2.3 安全傳輸對象 JWT 288
11.3 實踐案例:基於 OAuth2 協定和 JWT 實現一套簡單 的認證和授權系統 290
11.3.1 系統整體架構 290
11.3.2 授權伺服器 291
1.用戶服務和客戶端服務 292
2.TokenGrant 令牌生成器 294
3.TokenService 令牌服務 296
4.TokenStore 令牌存儲器 300
5./oauth/token 和/oauth/check_token 303
6.請求訪問令牌和刷新令牌 306
11.3.3 資源伺服器 311
1.令牌認證 311
2.鑒權 312
3.訪問受限資源 313
11.4 小結 317
第 12 章 分散式鏈路追蹤
12.1 診斷分散式系統的問題 318
12.1.1 為什麼需要分散式鏈路追蹤 318
12.1.2 什麼是分散式鏈路追蹤 319
12.1.3 分散式鏈路追蹤規範:OpenTracing 320
12.1.4 分散式鏈路追蹤的基礎概念 321
12.2 幾種流行的分散式鏈路追蹤組件 323
12.2.1 簡單易上手的 Twitter Zipkin 323
12.2.2 雲原生鏈路監控組件 Uber Jaeger 324
12.2.3 探針性能低損耗的 SkyWalking 326
12.2.4 鏈路統計詳細的 Pinpoint 327
12.2.5 4 種分散式鏈路追蹤組件的指標對比 328
12.3 實踐案例:套用 Zipkin 追蹤 Go 微服務 329
12.3.1 微服務中集成 zipkin-go 330
12.3.2 Go-kit 微服務框架集成 Zipkin 實現鏈路追蹤 337
1.HTTP 調用方式的鏈路追蹤 338
2.gRPC 調用方式的鏈路追蹤 342
12.4 小結 346
第四篇 綜合實戰
本部分是商品秒殺系統的實戰項目,綜合難度相對較高,我們通過分析業務系統的領域 設計,將系統劃分成具體的微服務,整合各個微服務組件,最終實現一個高並發的商品秒殺 系統。
第 13 章 綜合實戰:秒殺系統的設計與實現
13.1 秒殺系統簡介 347
13.2 項目架構簡介 350
13.2.1 項目簡述 350
13.2.2 架構信息 350
13.2.3 流程簡介 352
13.3 整合升級:各個微服務腳手架的組裝 353
13.3.1 服務註冊和發現 353
13.3.2 負載均衡策略 357
13.3.3 RPC 客戶端裝飾器 360
13.3.4 限流 362
13.3.5 Go 語言 Redis 使用簡介 364
13.3.6 Zookeeper 集成 366
13.3.7 Go-kit 開發利器 Truss 367
13.4 秒殺核心邏輯 368
13.4.1 秒殺業務系統 370
13.4.2 秒殺核心繫統 380
13.4.3 秒殺管理系統 384
13.5 性能壓測 386
13.5.1 查看服務的配置檔案 386
13.5.2 壓測實驗 387
13.6 小結 390