第一篇 雲原生與微服務
雲原生與微服務分彆是什麼,它們之間有什麼關係呢?本部分圍繞雲原生與微服務的概 念展開介紹,我們透過雲計算的曆史和係統架構的演進,具體瞭解這兩個概念的意義及其背 後的技術發展。
第 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
· · · · · · (
收起)