本書的各個(gè)章節(jié)環(huán)環(huán)相扣,我們將引導(dǎo)Go語言中高級(jí)開發(fā)人員構(gòu)建一款簡單但功能齊備的分布式鍵值存儲(chǔ)。我們將學(xué)習(xí)選用Go作為開發(fā)語言來解決云原生管理和部署問題的最Z佳實(shí)踐。本書的主要內(nèi)容有:了解云原生應(yīng)用程序與其他軟件架構(gòu)有何不同。了解如何利用Go語言解決設(shè)計(jì)可擴(kuò)展的分布式服務(wù)的各種難題。利用Go語言的底層特性(例如通道和go協(xié)程)來實(shí)現(xiàn)可靠的云原生服務(wù)。探討什么是服務(wù)可靠性及其與云原生的關(guān)系。利用各種模式、抽象和工具來構(gòu)建和管理復(fù)雜的分布式系統(tǒng)。
編輯推薦
Docker、Kubernetes和Prometheus的共同點(diǎn)是什么?所有這些云原生技術(shù)都是用Go語言編寫的。這本實(shí)用指南將向你展示如何利用Go語言的優(yōu)勢(shì)在不可預(yù)期的環(huán)境中開發(fā)可擴(kuò)展且富有彈性的云原生服務(wù)。我們將探索這些應(yīng)用程序的組成和結(jié)構(gòu),從Go語言的底層特性到中級(jí)設(shè)計(jì)模式,再到高級(jí)架構(gòu)的考慮因素。
專家推薦
本書很好地將云原生的高級(jí)概念帶到現(xiàn)實(shí),并使用現(xiàn)代計(jì)算語言Go來實(shí)現(xiàn)。這兩個(gè)概念的結(jié)合效果很好,帶給我們?cè)S多靈感。
Lee Atchison,
Atchison Technology LLC的所有者
這是我讀到的第D一本以如此實(shí)用的方式、如此廣度及深度介紹現(xiàn)代云原生實(shí)踐的書籍。作者通過清晰的示例呈現(xiàn)了可幫助工程師解決日常面臨的實(shí)際問題的各種模式。
Alvaro Atienza,
Flatiron Health網(wǎng)站可靠性工程師
前言對(duì)于技術(shù)專家來說,現(xiàn)如今是一段多么美好的時(shí)光。我們使用Docker 來構(gòu)建容器,使用Kubernetes 來編排容器;使用Prometheus 來監(jiān)控容器;使用Consul 來發(fā)現(xiàn)容器;使用Jaeger 來追蹤容器之間的關(guān)系。這只是幾個(gè)例子,這類的工具還有很多很多,它們代表了新一代技術(shù):它們都是云原生,并且都是用Go 編寫的。感覺上云原生是一個(gè)略帶歧義的流行術(shù)語,但實(shí)際上它有非常具體的定義。根據(jù)云原生計(jì)算基金會(huì)(Linux 基金會(huì)的子基金會(huì)),云原生應(yīng)用程序的設(shè)計(jì)目標(biāo)是在面對(duì)急劇變化的負(fù)載時(shí)可擴(kuò)展、在面對(duì)環(huán)境的不確定性時(shí)具有很好的韌性、在面對(duì)不斷變化的需求時(shí)可管理。換句話說,云原生應(yīng)用程序是為殘酷、不確定的宇宙中的生命構(gòu)建的。Go 創(chuàng)建于大約十年前,吸取了多年來構(gòu)建基于云的軟件的經(jīng)驗(yàn)教訓(xùn),是第一款專門為云原生軟件開發(fā)而設(shè)計(jì)的主流語言。Go 的誕生主要是因?yàn)楫?dāng)時(shí)使用的通用服務(wù)器語言根本不適合編寫谷歌大量產(chǎn)出的分布式、進(jìn)程密集型應(yīng)用程序。從那以來,Go 成為云原生開發(fā)的通用語言,被廣泛用于各個(gè)領(lǐng)域,從Docker 到Harbor、從Kubernetes 到Consul、從InfluxDB 到CockroachDB。云原生計(jì)算基金會(huì)的15 個(gè)畢業(yè)項(xiàng)目中有10 個(gè)是用Go 語言編寫的,而在所有62 個(gè)注1 項(xiàng)目中有42 個(gè)大部分或全部是用Go 編寫的。而且這個(gè)數(shù)字每天都在增加。本書面向的讀者對(duì)象本書主要面向中高級(jí)開發(fā)人員,特別是Web 應(yīng)用程序工程師和DevOps 專家及網(wǎng)站可靠性工程師?赡茉S多人都在使用Go 來構(gòu)建Web 服務(wù),但并不熟悉云原生開發(fā)的微妙之處,甚至不清楚什么是云原生,然后發(fā)現(xiàn)自己的服務(wù)很難管理、部署或觀察。本書不僅可以為這些讀者學(xué)習(xí)如何構(gòu)建云原生服務(wù)提供堅(jiān)實(shí)的基礎(chǔ),而且還將展示為什么這些技術(shù)如此重要,并提供具體的示例來解說這個(gè)有些抽象的主題。許多讀者可能更熟悉其他語言,但被Go 作為云原生開發(fā)語言的名號(hào)所吸引。本書可以為這些讀者提供有關(guān)采用Go 作為云原生開發(fā)語言的最佳實(shí)踐,而且還可以幫助他們解決云原生的管理和部署問題。本書的創(chuàng)作原因應(yīng)用程序的設(shè)計(jì)、構(gòu)建和部署方式正在發(fā)生變化。擴(kuò)展的需求迫使開發(fā)人員將服務(wù)分散到大量服務(wù)器上,軟件行業(yè)正在走向云原生。但這引入了許多新問題:如何開發(fā)、部署或管理在十臺(tái)、一百臺(tái)、一千臺(tái)服務(wù)器上運(yùn)行的服務(wù)?不幸的是,云原生領(lǐng)域的現(xiàn)有書籍都側(cè)重于抽象設(shè)計(jì)原則,而且只介紹如何執(zhí)行這些操作的基本示例,有些甚至連示例都沒有。本書旨在滿足這部分的市場(chǎng)需求:演示復(fù)雜的云原生設(shè)計(jì)原理。使用代碼示例你可以通過如下鏈接下載本書的補(bǔ)充材料(代碼示例,練習(xí)等):https://github.com/cloud-native-go/examples。本書的目的是幫助你完成工作。一般來說,你可以在自己的程序或者文檔中使用本書附帶的示例代碼。你無需聯(lián)系我們獲得使用許可,除非你要復(fù)制大量的代碼。例如,使用本書中的多個(gè)代碼片段編寫程序就無需獲得許可。但以CD-ROM 的形式銷售或者分發(fā)OReilly 書中的示例代碼則需要獲得許可;卮饐栴}時(shí)援引本書內(nèi)容以及書中示例代碼,無需獲得許可。在你自己的項(xiàng)目文檔中使用本書大量的示例代碼時(shí),則需要獲得許可。我們不強(qiáng)制要求署名,但如果你這么做,我們深表感激。署名一般包括書名、作者、出版社和國際標(biāo)準(zhǔn)圖書編號(hào)。例如:Cloud Native Go by Matthew A. Titmus(OReilly). Copyright 2021 Matthew A. Titmus, 978-1-492-07633-9。如果你覺得自身情況不在合理使用或上述允許的范圍內(nèi),請(qǐng)通過郵件和我們聯(lián)系,地址是permissions@oreilly.com。OReilly 在線學(xué)習(xí)平臺(tái)(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術(shù)和商業(yè)培訓(xùn)、知識(shí)和卓越見解,來幫助眾多公司取得成功。公司獨(dú)有的專家和改革創(chuàng)新者網(wǎng)絡(luò)通過OReilly 書籍、文章以及在線學(xué)習(xí)平臺(tái),分享他們的專業(yè)知識(shí)和實(shí)踐經(jīng)驗(yàn)。OReilly 在線學(xué)習(xí)平臺(tái)按照您的需要提供實(shí)時(shí)培訓(xùn)課程、深入學(xué)習(xí)渠道、交互式編程環(huán)境以及來自O(shè)Reilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請(qǐng)?jiān)L問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們?nèi)魏斡嘘P(guān)本書的意見或疑問,請(qǐng)按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南大街2 號(hào)成銘大廈C 座807 室(100035)奧萊利技術(shù)咨詢(北京)有限公司這本書有專屬網(wǎng)頁,你可以在那兒找到本書的勘誤、示例和其他信息。地址是https://oreil.ly/cloud-native-go。如果你對(duì)本書有一些評(píng)論或技術(shù)上的建議,請(qǐng)發(fā)送電子郵件到errata@oreilly.com.cn。要了解OReilly 圖書、培訓(xùn)課程、會(huì)議和新聞的更多信息,請(qǐng)?jiān)L問我們的網(wǎng)站,地址是http://www.oreilly.com。我們的Facebook:http://facebook.com/oreilly。我們的Twitter:http://twitter.com/oreillymedia。我們的Youtube:http://youtube.com/oreillymedia。致謝首先,我要感謝我的妻子和兒子。自從進(jìn)入我的生活以來,你們就成為了我做好每一件事的動(dòng)力,你們就像啟明星指引著我前進(jìn)的方向,吸引著我的目光望向天空。致父親,最近他離我們而去。在我認(rèn)識(shí)的所有人中,只有你最像文藝復(fù)興時(shí)期的人,同時(shí)你也是我認(rèn)識(shí)的最善良、最謙虛的人。我希望長大以后能成為你一樣的人。致Mary。父親的離世帶給你的感觸最深。你是我的家人,永遠(yuǎn)都是我的家人,即使我打電話給你的次數(shù)并不多。父親一定會(huì)為你的力量和優(yōu)雅感到自豪。致Sarah。你的力量和勇氣總讓我感到驚嘆。從牙牙學(xué)語開始,敏銳的頭腦就讓你成為我最堅(jiān)定的盟友,同時(shí)也是最兇猛的對(duì)手。不要告訴Nathan,兄弟姐妹們當(dāng)中我最喜歡的人是你。致Nathan。如果說我們都繼承了父親三分之一的天賦,那么你得到的是他的心。雖然我不會(huì)經(jīng)常宣之于口,但我為你以及你的成就感到驕傲。不要告訴Sarah,兄弟姐妹們當(dāng)中我最喜歡的人是你。致母親。你堅(jiān)強(qiáng)、聰明、多才多藝、不因循守舊。感謝你教導(dǎo)我做真正需要做的事情,不要在乎別人的想法。請(qǐng)繼續(xù)保持你的個(gè)性,記得喂雞。致Albert。你有一顆博大的心和無限的耐心。感謝你加入我們的大家庭,這個(gè)家因?yàn)橛心愣兊酶篮谩V挛业钠渌胰。雖然見面的機(jī)會(huì)并不多,但我非常想念你們。每當(dāng)我需要你們時(shí),你們總會(huì)在我身邊。感謝你們與我一起慶祝勝利,并在我失敗時(shí)給予支持。感謝Walt 和Alvaro,感謝你們始終陪伴在側(cè),即便換工作也離不開你們。感謝你們?cè)谛枰獣r(shí)給予熱情的支持,并讓我及時(shí)認(rèn)清現(xiàn)實(shí)。你們幫助我成為一名更好的工程師。另外,感謝你們把Will Wight 的《Cradle》系列介紹給我,我已經(jīng)深陷其中不能自拔。致Jeff Classic、New Jeff、Alex、Markan、Priyanka、Sam、Owen、Matt M.、Marius、Peter、Rohit,以及我在Flatiron Health 的所有朋友和同事。感謝你們的包容,讓我集中注意力撰寫本書,感謝你們對(duì)我和我的工作的支持,你們擔(dān)任著我的參謀、測(cè)試版讀者和評(píng)論家,并鼓勵(lì)我,推動(dòng)我前進(jìn)。致紐約及世界各地CoffeeOps 的所有朋友。感謝你們傾聽我的想法,允許我挑戰(zhàn)你們,而你們也挑戰(zhàn)了我。感謝你們的投入,讓這本書變得更好。致著名的可觀測(cè)性專家和預(yù)言家 Liz Fong-Jones。感謝您的指導(dǎo),您的代碼示例非常寶貴,如果沒有您的慷慨,本書的創(chuàng)作會(huì)更困難,而且結(jié)果也不如人意。感謝我的技術(shù)審閱人員Lee Atchison、Alvaro Atienza、David Nicponski、Natalie Pistunovich 和James Quigley。感謝你們耐心地閱讀我寫的每一個(gè)字(甚至是腳注)。多虧了你們敏銳的眼光和辛勤的工作,本書得到了極大提升。最后,感謝OReilly Media 編輯以及藝術(shù)家團(tuán)隊(duì)的辛勤勞動(dòng),很榮幸能與你們合作,特別感謝Amelia Blevins、Danny Elfanbaum 和Zan McQuade。今年是非常有趣的一年,你們的善良、耐心和支持讓我渡過了難關(guān)。
Matthew A. Titmus是一位經(jīng)驗(yàn)豐富的軟件開發(fā)行業(yè)資深人士,擁有分子生物學(xué)學(xué)位。作為云原生技術(shù)和Go語言的早期采用者和倡導(dǎo)者,他對(duì)如何構(gòu)建生產(chǎn)級(jí)質(zhì)量的系統(tǒng)充滿熱情。他付諸大量心血來實(shí)現(xiàn)觀察和編排分布式系統(tǒng)的策略。
目錄
第Ⅰ部分 云原生概述
第1 章 什么是云原生應(yīng)用程序 11
1.1 迄今為止的故事 12
1.2 什么是云原生? 14
1.2.1 可擴(kuò)展性 .15
1.2.2 松散耦合 .16
1.2.3 韌性 17
1.2.4 可管理性 .19
1.1.5 可觀察性 .20
1.3 為什么云原生很重要? .21
1.4 小結(jié) .22
第2 章 為什么Go 語言統(tǒng)治云原生世界 23
2.1 Go 語言誕生的動(dòng)機(jī) .23
2.2 云原生世界的特性 24
2.2.1 組合與結(jié)構(gòu)化類型 .25
2.2.2 可理解性 .27
2.2.3 CSP 風(fēng)格的并發(fā) 27
2.2.4 快速構(gòu)建 .28
2.2.5 語言穩(wěn)定性 29
2.2.6 內(nèi)存安全 .30
2.2.7 性能 31
2.2.8 靜態(tài)鏈接 .32
2.2.9 靜態(tài)類型 .33
2.3 小結(jié) .34
第Ⅱ部分 云原生Go 結(jié)構(gòu)
第3 章 Go 語言基礎(chǔ) 39
3.1 基本數(shù)據(jù)類型 .39
3.1.1 布爾值 40
3.1.2 簡單的數(shù)字 40
3.1.3 復(fù)數(shù) 41
3.1.4 字符串 42
3.2 變量 .42
3.2.1 簡短的變量聲明 43
3.2.2 零值 44
3.2.3 空標(biāo)識(shí)符 .45
3.2.4 常量 46
3.3 容器類型:數(shù)組、切片和映射 47
3.3.1 數(shù)組 .47
3.3.2 切片 48
3.3.3 映射 53
3.4 指針 .54
3.5 控制結(jié)構(gòu)56
3.5.1 for 循環(huán) 56
3.5.2 if 語句 59
3.5.3 switch 語句 .60
3.6 錯(cuò)誤處理62
3.7 可變參函數(shù)和閉包 63
3.7.1 函數(shù) 64
3.7.2 可變參函數(shù) 68
3.7.3 匿名函數(shù)和閉包 70
3.8 結(jié)構(gòu)、方法和接口 72
3.8.1 結(jié)構(gòu) 72
3.8.2 方法 73
3.8.3 接口 75
3.8.4 通過類型嵌入實(shí)現(xiàn)組合 77
3.9 并發(fā) .80
3.9.1 Go 協(xié)程 80
3.9.2 通道 80
3.9.3 select 語句 83
3.10 小結(jié) 85
第4 章 云原生模式 87
4.1 Context 包 .88
4.1.1 Context 可以做什么 89
4.1.2 創(chuàng)建Context 90
4.1.3 定義Context 的截止日期和超時(shí) .91
4.1.4 定義請(qǐng)求作用域的值.91
4.1.5 使用Context 92
4.2 本章的主要內(nèi)容 93
4.3 穩(wěn)定性模式 94
4.3.1 斷路器模式 94
4.3.2 防抖模式 .97
4.3.3 重試模式 102
4.3.4 節(jié)流模式 104
4.3.5 超時(shí)模式 108
4.4 并發(fā)模式. 111
4.4.1 扇入模式 112
4.4.2 扇出模式 114
4.4.3 未來模式 117
4.4.4 分片模式 122
4.5 小結(jié) 128
第5 章 構(gòu)建云原生服務(wù) 129
5.1 構(gòu)建一個(gè)服務(wù)! .129
5.2 需求 130
5.2.1 什么是冪等性,為什么冪等性很重要? 131
5.2.2 最終目標(biāo) 133
5.3 第0 代:核心功能 .133
5.4 第一代:單體架構(gòu) .135
5.4.1 使用net/http 構(gòu)建HTTP 服務(wù)器 135
5.4.2 使用gorilla/mux 構(gòu)建HTTP 服務(wù)器 137
5.4.3 構(gòu)建RESTful 服務(wù) 141
5.4.4 確保數(shù)據(jù)結(jié)構(gòu)的并發(fā)安全 146
5.5 第2 代:持久保存資源狀態(tài) .148
5.5.1 什么是事務(wù)日志? 150
5.5.2 將狀態(tài)存儲(chǔ)到事務(wù)日志文件 151
5.5.3 將狀態(tài)存儲(chǔ)到外部數(shù)據(jù)庫 165
5.6 第3 代:實(shí)現(xiàn)傳輸層安全 .174
5.6.1 傳輸層安全 .175
5.6.2 私鑰和證書文件 176
5.6.3 使用HTTPS 保護(hù)Web 服務(wù) 177
5.6.4 傳輸層總結(jié) .179
5.7 鍵值存儲(chǔ)的容器化 .179
5.7.1 Docker 的基礎(chǔ)知識(shí) .181
5.7.2 構(gòu)建鍵值存儲(chǔ)容器 188
5.7.3 外部化容器數(shù)據(jù) 193
5.8 小結(jié) 194
第Ⅲ部分 云原生屬性
第6 章 可信任性 . 197
6.1 云原生的意義 198
6.2 可信任性.198
6.3 什么是可信任性以及為什么可信任性如此重要? 199
6.4 實(shí)現(xiàn)可信任性 203
6.4.1 故障預(yù)防 205
6.4.2 容錯(cuò) .206
6.4.3 故障排除 207
6.4.4 故障預(yù)測(cè) 208
6.5 十二要素應(yīng)用 209
6.5.1 基準(zhǔn)代碼 210
6.5.2 依賴 .210
6.5.3 配置 . 211
6.5.4 依賴服務(wù) 213
6.5.5 構(gòu)建、發(fā)布、運(yùn)行 214
6.5.6 進(jìn)程 .215
6.5.7 數(shù)據(jù)分離 216
6.5.8 可擴(kuò)展性 217
6.5.9 易處理性 217
6.5.10 開發(fā)環(huán)境與生產(chǎn)環(huán)境等價(jià) .218
6.5.11 日志 219
6.5.12 管理進(jìn)程 219
6.6 小結(jié) 221
第7 章 可擴(kuò)展性 . 223
7.1 什么是可擴(kuò)展性 .225
7.2 四個(gè)常見瓶頸 226
7.3 狀態(tài)與無狀態(tài) 228
7.3.1 應(yīng)用程序狀態(tài)與資源狀態(tài) 228
7.3.2 無狀態(tài)的優(yōu)勢(shì) .229
7.4 推遲擴(kuò)展:效率 .230
7.4.1 使用LRU 緩存的高效緩存 .231
7.4.2 高效同步 234
7.4.3 內(nèi)存泄漏可能會(huì)致命錯(cuò)誤:運(yùn)行時(shí):內(nèi)存不足 .240
7.4.4 高效 .244
7.5 服務(wù)架構(gòu).244
7.5.1 單體系統(tǒng)架構(gòu) .245
7.5.2 微服務(wù)系統(tǒng)架構(gòu) 246
7.5.3 無服務(wù)器架構(gòu) .248
7.6 小結(jié) 253
第8 章 松散耦合 . 255
8.1 緊密耦合.256
8.2 服務(wù)之間的通信 .260
8.3 請(qǐng)求響應(yīng)消息 261
8.3.1 常見的請(qǐng)求響應(yīng)實(shí)現(xiàn)262
8.3.2 通過net/http 發(fā)送HTTP 請(qǐng)求 263
8.3.3 使用gRPC 實(shí)現(xiàn)遠(yuǎn)程過程調(diào)用 267
8.4 利用插件實(shí)現(xiàn)本地資源的松散耦合280
8.4.1 帶有插件包的進(jìn)程內(nèi)插件 281
8.4.2 基于RPC 的HashiCorp 插件系統(tǒng) 288
8.5 六邊形架構(gòu) 297
8.5.1 架構(gòu) .297
8.5.2 實(shí)現(xiàn)六邊形服務(wù) 299
8.6 小結(jié) 307
第9 章 韌性 . 309
9.1 為什么韌性很重要 .310
9.2 系統(tǒng)失效是什么意思? 311
9.3 級(jí)聯(lián)失效.313
9.4 重試請(qǐng)求.321
9.4.1 退避算法 322
9.4.2 斷路器 325
9.4.3 超時(shí) .327
9.4.4 冪等性 333
9.5 服務(wù)冗余.337
9.5.1 設(shè)計(jì)系統(tǒng)時(shí)考慮冗余338
9.5.2 自動(dòng)擴(kuò)展 340
9.6 健康檢查.341
9.6.1健康的實(shí)例意味著什么? .342
9.6.2 三種類型的健康檢查343
9.6.3 故障打開 348
9.7 小結(jié) 348
第10 章 可管理性 351
10.1 什么是可管理性,為什么我應(yīng)該關(guān)注可管理性? 352
10.2 配置應(yīng)用程序 354
10.2.1 有關(guān)配置的良好實(shí)踐 355
10.2.2 環(huán)境變量配置 355
10.2.3 命令行參數(shù)配置 .357
10.2.4 配置文件 363
10.2.5 Viper:配置包中的瑞士軍刀 381
10.3 利用特性標(biāo)志管理功能 386
10.3.1 特性標(biāo)志的進(jìn)化 .387
10.3.2 第零代:最初的實(shí)現(xiàn) 388
10.3.3 第一代:硬編碼特性標(biāo)志 .388
10.3.4 第二代:可配置標(biāo)志 390
10.3.5 第三代:動(dòng)態(tài)特性標(biāo)志 391
10.4 小結(jié) 395
第11 章 可觀察性 397
11.1 什么是可觀察性? 398
11.1.1 為什么我們需要可觀察性? .399
11.1.2 可觀察性與傳統(tǒng)的監(jiān)控有何不同? 399
11.2 可觀察性的三大支柱 400
11.3 OpenTelemetry 402
11.4 追蹤 404
11.4.1 追蹤的概念 405
11.4.2 使用OpenTelemetry 進(jìn)行追蹤 407
11.4.3 整合:追蹤 420
11.5 指標(biāo) 427
11.5.1 推式與拉式指標(biāo)集合 429
11.5.2 OpenTelemetry 的指標(biāo) 432
11.5.3 整合:指標(biāo) 444
11.6 日志記錄 447
11.6.1 更好的日志記錄實(shí)踐 448
11.6.2 使用Go 標(biāo)準(zhǔn)的log 包記錄日志 .452
11.6.3 Zap 日志包 455
11.7 小結(jié) 462