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