關于我們
書單推薦
新書推薦
|
Go語言高并發(fā)與微服務實戰(zhàn)
近年來云原生技術發(fā)展迅猛,幫助開發(fā)者在云上快速和頻繁地構建、發(fā)布和部署應用,以提高開發(fā)效率和快速定位故障。 微服務作為開展云原生技術落地的核心,它將復雜的單體應用按照業(yè)務劃分并進行有效地拆分,每個微服務都可以進行獨立部署和開發(fā),大大提升了應用開發(fā)效率。Go語言作為新生代的編譯型編程語言,具備語法簡單、高并發(fā)性能良好和編譯速度快等特點,是微服務架構落地實踐的絕妙利器。
深入Go語言和微服務框架,提供高并發(fā)場景下Go微服務應用實戰(zhàn)案例
寫作背景 Go語言在云計算時代大放異彩。 進入互聯(lián)網時代,尤其是移動互聯(lián)網時代之后,這個大環(huán)境面臨新的挑戰(zhàn),一方面在功能性方面要求越來越高:除了簡單功能快速實現之外,還有對性能、安全、穩(wěn)定性、高可用和可擴展性的諸多要求,而且越來越苛刻;另一個方面,更多的需求來自對效率的追求:包括開發(fā)、測試、部署、維護和迭代變更的效率,以及對成本的要求。 快速迭代是傳統(tǒng)企業(yè)的硬傷,這不是通過加班就能解決的。在滿足各種功能性的前提下,易用性的提升不僅僅滿足了企業(yè)的需求,也極大地改善了開發(fā)體驗。 對效率的追求,推動了云計算的產生和發(fā)展,以及云原生理念和架構的產生,我們熟知的容器技術、微服務架構以及新生的Service Mesh架構都由此誕生,不可變基礎設施和聲明式API的理念也在實踐中被總結出來,并為后續(xù)的云原生架構提供理論指導。云計算的發(fā)展以及云原生的推出,為云和云上產品帶來了除功能性之外的易用性特征。由于大部分維護工作由云承擔,因此降低了對于維護的工作量,開發(fā)人員和應用服務更加關注與業(yè)務實現,而非業(yè)務實現的內容應該由云和云上產品提供。 對效率的追求,催生了云和云原生架構,帶來了易用性的提升,改善了開發(fā)體驗,從而進一步提升了效率。這個過程會持續(xù)發(fā)生,架構的演進不是一蹴而就的,而是一個長期發(fā)展的過程,因此云原生架構也會持續(xù)演進。在過去幾年間,云原生架構中的容器/微服務等架構都是在這個循環(huán)中不斷完善和普及的。 技術背景 微服務架構是云原生架構中的關鍵技術點,也是本書主要的關注點。微服務的話題,近幾年一直很熱門,微服務是SOA架構的一種具體實踐。除了微服務以外,Go語言也很熱門,越來越受到開發(fā)人員的青睞。Go(又稱Golang)是Google開發(fā)的一種靜態(tài)強類型、編譯型、并發(fā)型且具有垃圾回收功能的編程語言。 Go語言自2009年開源以來,持續(xù)受到關注。Go語言之所以厲害,是因為它在服務端的開發(fā)中,能抓住程序員的痛點,以最直接、簡單、高效和穩(wěn)定的方式來解決問題;贕o語言實現的微服務,更好地體現微服務和Go語言的優(yōu)勢。 人類對于技術進步的追求從未停歇。熱門的技術組合在一起,能不能發(fā)揮各自的優(yōu)勢,變得更加高效?其實不然,在逐漸發(fā)展的環(huán)境和技術演化的過程中,存在著技術人員對主流技術趨勢的理解參差不齊現象。當然架構沒有絕對的對與錯,本書將會帶讀者走進基于Go語言的高并發(fā)與微服務實戰(zhàn)世界,在這個世界里不停地探索和汲取經驗。 本書內容以當前流行的微服務架構和Go語言的高并發(fā)特性為主線,介紹Go語言微服務的各個組件和并發(fā)實戰(zhàn)。本書包含四個部分的內容: (1)第一部分淺談云原生與微服務,涉及云原生架構的全貌介紹和微服務的概述。 (2)第二部分介紹Go語言基礎,側重于介紹Go語言的一些特性。 (3)第三部分深入Go語言的微服務實踐,介紹微服務架構中涉及的基礎組件,如分布式配置中心、服務注冊與發(fā)現、輕量級通信機制與負載均衡、微服務的容錯處理和分布式鏈路追蹤等組件,在熟悉組件原理的基礎上進行并發(fā)實踐。 (4)最后一部分為綜合實戰(zhàn),將會結合Go語言微服務框架Go-kit實現一個完整的商品秒殺系統(tǒng),涉及本書介紹的各個微服務組件,并將這些組件進行整合。 讀者對象 本書比較適合架構師和有一定基礎的技術人員閱讀,特別是正在實踐或準備實踐微服務的架構師和開發(fā)人員,以及轉型到Go語言微服務開發(fā)的技術團隊。希望本書能給讀者在微服務和Go語言開發(fā)實踐中獲取一些經驗和靈感,少走一些彎路,最終的目的是提升技術人員的開發(fā)體驗和企業(yè)產品迭代的效率。 源碼及勘誤 本書提供源代碼下載(見封面后勒口,可掃碼或鏈接下載),備用下載地址為https://github.com/ longjoy/micro-go-book。 讀者在實踐時,需要注意組件下載的版本,建議相關開發(fā)環(huán)境與本書一致,或者不低于本書所列的配置。不同版本之間存在兼容性問題,而且不同版本的軟件所對應的功能有的也是不同的。 書中的內容大多來自編者的工作經驗,不免存在遺漏及錯誤,歡迎指正。讀者可以直接發(fā)送郵件到郵箱(aoho002@gmail.com),在此提前表示感謝。 作者團隊與致謝 本書由朱榮鑫、黃迪璇、張?zhí)旃餐瓿。具體章節(jié)的分工,其中第1、5、8、9、12章由朱榮鑫編寫;第3、4、6、10、11章由黃迪璇編寫;第2、7、13章由張?zhí)炀帉;全書由朱榮鑫統(tǒng)稿。 本書的完成需要感謝很多朋友和同行的傾力幫助,感謝Go語言社區(qū)的熱心小伙伴在本書撰寫前后提供了很多內容組織方面的建議,他們犧牲不少休息時間幫忙審稿,給了筆者很多實質性的指導;感謝筆者所在的公司為筆者提供的良好平臺,幫助筆者積累了大量Go語言高并發(fā)與微服務架構實踐的經驗。 寫書是一件枯燥的事情,一本書從想法、策劃到出版非常不易,編輯老師給了編者很大的信心和幫助。在內容和結構組織上,編者也是同本書策劃編輯荊波老師反復進行了討論和校正,因此特別感謝中國鐵道出版社有限公司的荊波編輯和其他工作人員為本書的出版所做的努力。 編 者 2020年2月
朱榮鑫
軟件工程碩士,微服務早期實踐者,微服務方面技術專家,對高并發(fā)、分布式有多年深入的實踐經驗。掘金優(yōu)秀作者,CSDN博客專家。公眾號“aoho求索”的作者。 黃迪璇 畢業(yè)于南京大學,目前就職于國內一線互聯(lián)網公司,曾就職于字節(jié)跳動、騰訊,具有多年服務端開發(fā)經驗,技術極客,熱衷于新技術的研究和實踐。 張?zhí)? 服務端技術專家,精耕于微服務、分布式、數據庫和性能調優(yōu)等后端開發(fā)領域。著有《Spring Cloud微服務架構進階》,CSDN博客專家。公眾號“程序員歷小冰”的作者。
第一篇 云原生與微服務
云原生與微服務分別是什么,它們之間有什么關系呢?本部分圍繞云原生與微服務的概 念展開介紹,我們透過云計算的歷史和系統(tǒng)架構的演進,具體了解這兩個概念的意義及其背 后的技術發(fā)展。 第 1 章 云原生架構 1.1 云計算的歷史 1 1.1.1 云計算的基礎:虛擬化技術 1 1.1.2 基于虛擬機的云計算 3 1.1.3 容器的橫空出世和容器編排大戰(zhàn) 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 系統(tǒng)架構的演進 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.以業(yè)務為中心 28 4.彈性設計 28 5.日志與監(jiān)控 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 語言的特性功能:反 射與并發(fā)模型,介紹 Go 語言協(xié)程、通道、多路復用和同步的具體實踐;最后是 Golang Web 的相關介紹,一起構建一個完整的 Go Web 服務器。 第 3 章 Go 語言基礎 3.1 Go 語言介紹 35 3.2 環(huán)境安裝 36 3.2.1 Go 開發(fā)包安裝 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 分支與循環(huán)控制 49 3.4 Go 中常用的容器 50 3.4.1 數組 50 3.4.2 切片 51 【實例 3-3】切片的動態(tài)擴容 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 并發(fā)模型 82 4.3.1 并發(fā)與并行 82 4.3.2 CSP 并發(fā)模型 82 4.3.3 常見的線程模型 83 4.3.4 MPG 線程模型概述 85 4.4 并發(fā)實踐 87 4.4.1 協(xié)程 goroutine 87 4.4.2 通道 channel 89 【實例 4-2】協(xié)程使用 channel 發(fā)送和接收數據 90 【實例 4-3】使用帶緩沖區(qū)的 channel 91 【實例 4-4】使用 switch 從多個 channel 中讀取數據 92 4.4.3 sync 同步包 94 【實例 4-5】使用 sync.Mutex 控制多 goroutine 串行執(zhí)行 94 【實例 4-6】sync.RWMutex 允許多讀和單寫 95 【實例 4-7】sync.WaitGroup 阻塞主 goroutine 直到其他 goroutine 執(zhí)行結束 97 【實例 4-8】使用 sync.Map 并發(fā)添加數據 98 4.5 小結 99 第 5 章 構建 Go Web 服務器 5.1 Web 的工作原理 100 5.1.1 HTTP 協(xié)議詳解 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 第三篇 微服務核心組件 本部分是全書的核心,介紹微服務中各個核心組件的原理和實踐應用,包括分布式配置 中心、服務注冊與發(fā)現、微服務網關、微服務的容錯、微服務中的通信與負載均衡、統(tǒng)一認 證與授權、微服務中的鏈路追蹤。通過組件原理的介紹、組件的選型對比以及組件的實踐應 用,吃透每一個微服務組件。 第 6 章 服務注冊與發(fā)現 6.1 服務注冊與發(fā)現的基本原理 126 6.1.1 服務注冊與發(fā)現中心的職責 126 6.1.2 服務實例注冊服務信息 127 6.1.3 CAP 原理 127 6.2 常用的服務注冊與發(fā)現框架 128 6.2.1 基于 Raft 算法的開箱即用服務發(fā)現組件 Consul 128 6.2.2 基于 HTTP 協(xié)議的分布式 key/Value 存儲組件 Etcd 130 6.2.3 重量級一致性服務組件 Zookeeper 131 6.2.4 服務注冊與發(fā)現組件的對比與選型 132 6.3 Consul 安裝和接口定義 133 6.3.1 Consul 的安裝與啟動 133 6.3.2 Go-kit 項目結構 134 6.3.3 服務注冊與發(fā)現接口 135 6.3.4 項目的總體結構 135 6.4 實踐案例:直接使用 HTTP 的方式和 Consul 交互 140 6.4.1 服務注冊與健康檢查 142 6.4.2 服務注銷 144 6.4.3 服務發(fā)現 146 6.5 實踐案例:借助 Go-kit 服務注冊與發(fā)現包和 Consul 交互 147 6.5.1 服務注冊與健康檢查 148 6.5.2 服務注銷 149 6.5.3 服務發(fā)現 150 6.5.4 服務實例信息緩存 150 6.5.5 MyDiscoverClient 和 KitDiscoverClient 的比較 153 6.6 實踐案例:基于服務注冊與發(fā)現的 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 通信協(xié)議制定 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 客戶端發(fā)送 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 統(tǒng)一管理配置 210 8.3.1 搭建 Spring Cloud Config Server 210 8.3.2 Viper 介紹 213 【實例 8-1】Viper 實現讀取本地配置信息 214 8.3.3 實戰(zhàn)案例:動手實現 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 環(huán)境安裝 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 創(chuàng)建服務 244 9.4.4 創(chuàng)建路由 245 9.5 安裝 Kong 插件 246 9.5.1 跨域身份驗證:JWT 認證插件 246 9.5.2 系統(tǒng)監(jiān)控報警:Prometheus 可視化監(jiān)控插件 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 分布式系統(tǒng)中的服務雪崩 258 10.1.2 服務熔斷保障系統(tǒng)可用性 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 監(jiān)控面板 275 10.5.1 獲取 Hystrix 命令調用信息 275 10.5.2 使用 Hystrix Dashboard 可視化面板 277 10.6 實踐案例:在網關中添加 Hystrix 熔斷和負載均衡 279 10.7 小結 282 第 11 章 統(tǒng)一認證與授權 11.1 微服務安全的挑戰(zhàn)和現狀 283 11.2 常見的認證與授權方案 283 11.2.1 當前行業(yè)授權標準 OAuth2 283 11.2.2 數據共享的分布式 Session 287 11.2.3 安全傳輸對象 JWT 288 11.3 實踐案例:基于 OAuth2 協(xié)議和 JWT 實現一套簡單 的認證和授權系統(tǒng) 290 11.3.1 系統(tǒng)整體架構 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 診斷分布式系統(tǒng)的問題 318 12.1.1 為什么需要分布式鏈路追蹤 318 12.1.2 什么是分布式鏈路追蹤 319 12.1.3 分布式鏈路追蹤規(guī)范:OpenTracing 320 12.1.4 分布式鏈路追蹤的基礎概念 321 12.2 幾種流行的分布式鏈路追蹤組件 323 12.2.1 簡單易上手的 Twitter Zipkin 323 12.2.2 云原生鏈路監(jiān)控組件 Uber Jaeger 324 12.2.3 探針性能低損耗的 SkyWalking 326 12.2.4 鏈路統(tǒng)計詳細的 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 第四篇 綜合實戰(zhàn) 本部分是商品秒殺系統(tǒng)的實戰(zhàn)項目,綜合難度相對較高,我們通過分析業(yè)務系統(tǒng)的領域 設計,將系統(tǒng)劃分成具體的微服務,整合各個微服務組件,最終實現一個高并發(fā)的商品秒殺 系統(tǒng)。 第 13 章 綜合實戰(zhàn):秒殺系統(tǒng)的設計與實現 13.1 秒殺系統(tǒng)簡介 347 13.2 項目架構簡介 350 13.2.1 項目簡述 350 13.2.2 架構信息 350 13.2.3 流程簡介 352 13.3 整合升級:各個微服務腳手架的組裝 353 13.3.1 服務注冊和發(fā)現 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 開發(fā)利器 Truss 367 13.4 秒殺核心邏輯 368 13.4.1 秒殺業(yè)務系統(tǒng) 370 13.4.2 秒殺核心系統(tǒng) 380 13.4.3 秒殺管理系統(tǒng) 384 13.5 性能壓測 386 13.5.1 查看服務的配置文件 386 13.5.2 壓測實驗 387 13.6 小結 390
你還可能感興趣
我要評論
|