Go 語言高併發與微服務實戰

朱榮鑫,黃迪璿,張天

買這商品的人也買了...

商品描述

近年來雲原生技術發展迅猛,幫助開發者在雲上快速和頻繁地構建、發佈和部署應用,以提高開發效率和快速定位故障。 微服務作為開展雲原生技術落地的核心,它將複雜的單體應用按照業務劃分並進行有效地拆分,每個微服務都可以進行獨立部署和開發,大大提升了應用開發效率。Go語言作為新生代的編譯型程式設計語言,具備語法簡單、高併發性能良好和編譯速度快等特點,是微服務架構落地實踐的絕妙利器。

作者簡介

朱榮鑫
軟體工程碩士,微服務早期實踐者,微服務方面技術專家,對高併發、分散式有多年深入的實踐經驗。掘金優秀作者,CSDN博客專家。公眾號“aoho求索”的作者。

黃迪璿
畢業于南京大學,目前就職於國內一線互聯網公司,曾就職於位元組跳動、騰訊,具有多年服務端開發經驗,技術極客,熱衷於新技術的研究和實踐。

張天
服務端技術專家,精耕於微服務、分散式、資料庫和性能調優等後端開發領域。著有《Spring Cloud微服務架構進階》,CSDN博客專家。公眾號“程式師曆小冰”的作者。

目錄大綱

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