- 學(xué)習(xí)有效和明確的端到端微服務(wù)系統(tǒng)設(shè)計(jì)。
- 定義團(tuán)隊(duì)、他們的職責(zé)以及共同工作的指導(dǎo)方針。
- 了解如何將大型應(yīng)用程序分割成一組微服務(wù)。
- 研究如何將數(shù)據(jù)隔離并嵌入到相應(yīng)的微服務(wù)中。
- 為基礎(chǔ)架構(gòu)更改構(gòu)建一個(gè)簡(jiǎn)單但功能強(qiáng)大的CI/CD管道。
- 為示例微服務(wù)編寫(xiě)代碼。
- 在Amazon上部署可正常工作的微服務(wù)應(yīng)用程序Web服務(wù)。
微服務(wù)架構(gòu)提供更快的更改速度,更好的可擴(kuò)展性,更干凈,可進(jìn)化的系統(tǒng)設(shè)計(jì)。但是實(shí)現(xiàn)你的個(gè)微服務(wù)架構(gòu)是困難的。你如何做出無(wú)數(shù)的選擇,讓你的團(tuán)隊(duì)了解所有的技術(shù)細(xì)節(jié),并引導(dǎo)組織走向成功的執(zhí)行,以限度地提高你的成功機(jī)會(huì)?在這本書(shū)中,本書(shū)作者為構(gòu)建有效的微服務(wù)架構(gòu)提供了一步一步的指導(dǎo)。
架構(gòu)師和工程師將遵循基于已被證明適用微服務(wù)系統(tǒng)的技術(shù)和架構(gòu)進(jìn)行實(shí)現(xiàn)。你將構(gòu)建一個(gè)操作模型、一個(gè)微服務(wù)設(shè)計(jì)、一個(gè)基礎(chǔ)設(shè)施和兩個(gè)正在工作的微服務(wù),然后將這些部分放在一起作為一個(gè)實(shí)現(xiàn)。對(duì)于任何負(fù)責(zé)構(gòu)建微服務(wù)或微服務(wù)架構(gòu)的人來(lái)說(shuō),本書(shū)都是非常寶貴的。
前言
十年前,一群軟件架構(gòu)師聚集在一起,創(chuàng)造了微服務(wù)一詞來(lái)定義已經(jīng)發(fā)展的軟件架構(gòu)風(fēng)格。從那時(shí)起,微服務(wù)風(fēng)格的課程、視頻和書(shū)面作品激增。實(shí)際上,在2016 年,我們與人合著了《Microservice Architecture》,該書(shū)為微服務(wù)系統(tǒng)的原理提供了入門(mén)指南。
自該書(shū)出版以來(lái),我們和許多人都有機(jī)會(huì)使用自己構(gòu)建的微服務(wù)系統(tǒng)。我們自己的經(jīng)驗(yàn)以及從與其他從業(yè)者的對(duì)話(huà)中獲得的經(jīng)驗(yàn),已經(jīng)使我們更好地理解了微服務(wù)實(shí)施者所面臨的實(shí)際問(wèn)題。這種理解很多來(lái)自成功的經(jīng)驗(yàn),但是一些有用的見(jiàn)解來(lái)自錯(cuò)誤帶來(lái)的教訓(xùn)。
我們努力將從業(yè)者的經(jīng)驗(yàn)整理成一份備受好評(píng)的指南。我們生活在一個(gè)可以獲得大量從業(yè)者建議的時(shí)代。但是,我們很難在這個(gè)信息海洋中找準(zhǔn)方向,也很難以一種可以一起工作的方式將這些信息組織起來(lái)。本書(shū)提供了一個(gè)實(shí)用的說(shuō)明性模型,涵蓋了團(tuán)隊(duì)設(shè)計(jì)、領(lǐng)域設(shè)計(jì)、基礎(chǔ)架構(gòu)、工程和發(fā)布。我們的目標(biāo)是為你提供有關(guān)微服務(wù)實(shí)現(xiàn)的統(tǒng)一視圖,以幫助你在采用微服務(wù)架構(gòu)的過(guò)程中邁出堅(jiān)實(shí)的一步。
本書(shū)面向的讀者群
我們?yōu)槲⒎⻊?wù)實(shí)現(xiàn)者編寫(xiě)了這本書(shū)。當(dāng)我們討論微服務(wù)系統(tǒng)的一些原理和模式時(shí),本書(shū)的重點(diǎn)是實(shí)用的設(shè)計(jì)和工程。如果你是負(fù)責(zé)構(gòu)建微服務(wù)或微服務(wù)體系結(jié)構(gòu)的架構(gòu)師或工程師,那么這本書(shū)非常適合你。許多人能從本書(shū)中受益。對(duì)于那些只想通過(guò)微服務(wù)實(shí)現(xiàn)親密接觸的讀者來(lái)說(shuō),這本書(shū)也是有用的指南。無(wú)論你是什么角色,如果你想了解構(gòu)建微服務(wù)系統(tǒng)的工作,這本書(shū)都會(huì)對(duì)你有所啟發(fā)。
你需要什么
由于微服務(wù)涉及的范疇很大,因此我們使用許多不同的工具和方法。如果你想遵循所有示例,則需要安裝或訂閱才能使用以下工具和平臺(tái):
Docker。
Redis。
MySQL。
GitHub。
GitHub Actions。
Terraform。
Amazon Web Services。
kubectl。
Helm。
Argo CD。
在相關(guān)章節(jié),我們提供了哪里獲得以及如何獲得這些工具的說(shuō)明。
內(nèi)容約定
本書(shū)采用下述的排版約定。
斜體(Italic)
表示新術(shù)語(yǔ)、URL、示例電子郵件地址、文件名、擴(kuò)展名、路徑名和目錄。
等寬字體(Constant Width)
表示命令、選項(xiàng)、開(kāi)關(guān)、變量、屬性、鍵、函數(shù)、類(lèi)型、類(lèi)、命名空間、方法、模塊、屬性、參數(shù)、值、對(duì)象、事件、事件句柄、XML 標(biāo)簽、HTML 標(biāo)簽、宏、文件的內(nèi)容或者命令的輸出。
等寬加粗字體(Constant Width Bold)
表示應(yīng)由用戶(hù)輸入的命令或其他文本。
斜體等寬字體(Constant Width Italic)
表示應(yīng)該替換成用戶(hù)提供的值。
使用代碼示例
補(bǔ)充材料( 代碼示例、練習(xí)等) 可從https://oreil.ly/Microservices UpandRunning 下載。
如果你在使用代碼示例時(shí)遇到技術(shù)問(wèn)題或疑問(wèn), 請(qǐng)發(fā)送電子郵件至bookquestions@oreilly.com。
本書(shū)的目的是幫助你完成工作。一般來(lái)說(shuō),你可以在自己的程序或者文檔中使用本書(shū)附帶的示例代碼。你無(wú)需聯(lián)系我們獲得使用許可,除非你修改了代碼的關(guān)鍵部分。例如,使用本書(shū)中的多個(gè)代碼片段編寫(xiě)程序就無(wú)需獲得許可,但銷(xiāo)售或者分發(fā)OReilly 書(shū)中的示例代碼則需要獲得許可;卮饐(wèn)題時(shí)援引本書(shū)內(nèi)容無(wú)需獲得許可,但將本書(shū)中大量示例代碼合并到產(chǎn)品文檔中需要獲得許可。
我們不強(qiáng)制要求署名,但如果你這么做,我們深表感激。署名一般包括書(shū)名、作者、出版社和國(guó)際標(biāo)準(zhǔn)圖書(shū)編號(hào)。例如:Microservices: Up and Running by Ronnie Mitra and Irakli Nadareishvili (OReilly). Copyright 2021 Mitra Pandey Consulting, Ltd. and Irakli Nadareishvili, 978-1-492-07545-5。
如果你覺(jué)得自身情況不在合理使用或上述允許的范圍內(nèi),請(qǐng)通過(guò)郵件和我們聯(lián)系,地址是 permissions@oreilly.com。
OReilly 在線(xiàn)學(xué)習(xí)平臺(tái)(OReilly Online Learning)
近40 年來(lái),OReilly Media 致力于提供技術(shù)和商業(yè)
培訓(xùn)、知識(shí)和卓越見(jiàn)解,來(lái)幫助眾多公司取得成功。
我們擁有獨(dú)一無(wú)二的專(zhuān)家和革新者組成的龐大網(wǎng)絡(luò),他們通過(guò)圖書(shū)、文章、會(huì)議和我們的在線(xiàn)學(xué)習(xí)平臺(tái)分享他們的知識(shí)和經(jīng)驗(yàn)。OReilly 的在線(xiàn)學(xué)習(xí)平臺(tái)允許你按需訪(fǎng)問(wèn)現(xiàn)場(chǎng)培訓(xùn)課程、深入的學(xué)習(xí)路徑、交互式編程環(huán)境,以及OReilly 和200 多家其他出版商提供的大量文本和視頻資源。有關(guān)的更多信息,請(qǐng)?jiān)L問(wèn)http://oreilly.com。
聯(lián)系我們
美國(guó):
OReilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國(guó):
北京市西城區(qū)西直門(mén)南大街2號(hào)成銘大廈C座807室(100035)
奧萊利技術(shù)咨詢(xún)(北京)有限公司
這本書(shū)有專(zhuān)屬網(wǎng)頁(yè),你可以在那兒找到本書(shū)的勘誤、示例和其他信息。這個(gè)網(wǎng)頁(yè)的地址是:https://oreil.ly/MicroservicesUpandRunning。
如果你對(duì)本書(shū)有一些評(píng)論或技術(shù)上的建議, 請(qǐng)發(fā)送電子郵件到bookquestions@oreilly.com。
有關(guān)其他圖書(shū)、講座、會(huì)議、新聞的信息,請(qǐng)?jiān)L問(wèn)我們的網(wǎng)站:http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
我們要感謝我們的編輯Melissa Potter 和Deborah Baker,以及OReilly 的團(tuán)隊(duì),沒(méi)有他們,我們將永遠(yuǎn)不會(huì)完成這本書(shū)。我們還要感謝Pete Hodgson、Chris ODell、Lorinda Brandon、JP Morgenthal、Mike Amundsen 和David Butland,他們提供了令人難以置信的見(jiàn)解、反饋和觀察。后,我們要感謝Capital One 和Publicis Sapient 提供的支持,使我們能夠?qū)⑦@本書(shū)付諸實(shí)踐。
作者介紹
Ronnie Mitra是一位作家,戰(zhàn)略家和顧問(wèn),擁有超過(guò)25年網(wǎng)絡(luò)和連接技術(shù)工作經(jīng)驗(yàn)。他是OReilly的《Microservice Architecture》和《Continuous API Management》的合著者。
Irakli Nadareishvili是Capital One核心創(chuàng)新副總裁,領(lǐng)導(dǎo)著負(fù)責(zé)構(gòu)建基于微服務(wù)的核心銀行平臺(tái)的團(tuán)隊(duì)。在此之前,他是健康科技初創(chuàng)公司ReferWell的聯(lián)合創(chuàng)始人兼CTO,并在CA Technologies和NPR擔(dān)任技術(shù)領(lǐng)導(dǎo)職務(wù)。您可以通過(guò)@inadarei在Twitter上關(guān)注Irakli。
譯者介紹
王巖,thoughtworks高級(jí)咨詢(xún)師,專(zhuān)注于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的實(shí)踐和推廣。
黃俊彬,thoughtworks高級(jí)咨詢(xún)師,在智能硬件、通信、互聯(lián)網(wǎng)、金融等領(lǐng)軍企業(yè)提供敏捷轉(zhuǎn)型、系統(tǒng)架構(gòu)改造、大型遺留系統(tǒng)重構(gòu)等服務(wù)。
目錄
前言 .1
第1 章 邁向微服務(wù)架構(gòu) 7
1.1 微服務(wù)是什么? .8
1.2 降低協(xié)作成本 10
1.2.1 協(xié)作成本問(wèn)題 11
1.2.2 艱難部分. 13
1.3 從實(shí)踐中學(xué)習(xí) 14
1.4 決策,決策…… 17
1.5 小結(jié) 21
第2 章 微服務(wù)運(yùn)作模式的設(shè)計(jì) 22
2.1 為什么團(tuán)隊(duì)和人員很重要 23
2.1.1 團(tuán)隊(duì)規(guī)模. 24
2.1.2 團(tuán)隊(duì)技能. 26
2.1.3 團(tuán)隊(duì)間協(xié)作 27
2.2 引入團(tuán)隊(duì)拓?fù)?29
2.2.1 團(tuán)隊(duì)類(lèi)型. 29
2.2.2 交互模式. 31
2.3 設(shè)計(jì)一個(gè)微服務(wù)團(tuán)隊(duì)拓?fù)?32
2.3.1 建立系統(tǒng)設(shè)計(jì)團(tuán)隊(duì) . 33
2.3.2 構(gòu)建微服務(wù)團(tuán)隊(duì)模板 35
2.3.3 平臺(tái)團(tuán)隊(duì). 38
2.3.4 賦能和復(fù)雜的子系統(tǒng)團(tuán)隊(duì) . 39
2.3.5 消費(fèi)者團(tuán)隊(duì) 41
2.3.6 小結(jié) 43
第3 章 設(shè)計(jì)微服務(wù):SEED(S)流程 44
3.1 介紹服務(wù)設(shè)計(jì)的七個(gè)基本演變:SEED(S)方法 . 45
3.2 確定參與者 . 46
3.3 確定參與者必須做的工作 49
3.3.1 使用工作故事描述格式來(lái)完成待完成工作(JTBDs) 51
3.3.2 我們的示例項(xiàng)目中的示例JTBD 52
3.4 用序列圖發(fā)現(xiàn)交互模式 53
3.5 從JTBD 派生操作和查詢(xún) 56
3.6 將每個(gè)查詢(xún)和操作描述為具有開(kāi)放標(biāo)準(zhǔn)的規(guī)范 59
3.7 獲得關(guān)于API 規(guī)范的反饋 64
3.8 實(shí)現(xiàn)微服務(wù) . 65
3.9 微服務(wù)與API . 65
3.10 小結(jié) . 68
第4 章 調(diào)整微服務(wù)的大小:尋找服務(wù)邊界 69
4.1 為什么邊界很重要,什么時(shí)候重要,以及如何找到它們 69
4.2 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)和微服務(wù)邊界 71
4.2.1 上下文映射 75
4.2.2 同步集成與異步集成 78
4.2.3 DDD 聚合 79
4.3 事件風(fēng)暴簡(jiǎn)介 79
4.4 介紹通用規(guī)模計(jì)算公式 86
4.5 小結(jié) 87
第5 章 處理數(shù)據(jù) 89
5.1 獨(dú)立部署和數(shù)據(jù)共享 . 89
5.2 微服務(wù)嵌入他們的數(shù)據(jù) 91
5.2.1 嵌入數(shù)據(jù)不應(yīng)導(dǎo)致數(shù)據(jù)庫(kù)集群數(shù)量激增 92
5.2.2 數(shù)據(jù)嵌入和數(shù)據(jù)委托模式 . 93
5.2.3 使用數(shù)據(jù)復(fù)制解決獨(dú)立性 . 95
5.2.4 分布式事務(wù)和失敗補(bǔ)償 96
5.3 事件源和CQRS 99
5.3.1 事件源 100
5.3.2 通過(guò)滾動(dòng)快照提高性能 106
5.3.3 事件存儲(chǔ) 107
5.3.4 命令查詢(xún)職責(zé)分離 108
5.4 微服務(wù)之外的事件源和CQRS 109
5.5 小結(jié) . 111
第6 章 構(gòu)建基礎(chǔ)設(shè)施流水線(xiàn) . 112
6.1 DevOps 原則和實(shí)踐 113
6.1.1 不可變的基礎(chǔ)設(shè)施 114
6.1.2 基礎(chǔ)設(shè)施即代碼 116
6.1.3 持續(xù)集成和持續(xù)交付 . 118
6.2 建立基礎(chǔ)設(shè)施即代碼的環(huán)境 120
6.2.1 設(shè)置GitHub 120
6.2.2 安裝Terraform 121
6.3 配置Amazon Web Services 122
6.3.1 設(shè)置一個(gè)AWS Operations 賬戶(hù) 123
6.3.2 配置AWS CLI 127
6.3.3 設(shè)置AWS 權(quán)限 . 128
6.3.4 為T(mén)erraform 創(chuàng)建S3 存儲(chǔ) 132
6.4 建立基礎(chǔ)設(shè)施即代碼流水線(xiàn) 134
6.4.1 創(chuàng)建沙箱代碼庫(kù) 135
6.4.2 使用Terraform 137
6.4.3 編寫(xiě)沙盒環(huán)境代碼 138
6.4.4 構(gòu)建流水線(xiàn) . 142
6.4.5 測(cè)試流水線(xiàn) . 152
6.5 小結(jié) . 154
第7 章 構(gòu)建微服務(wù)基礎(chǔ)設(shè)施 . 156
7.1 基礎(chǔ)設(shè)施組件 . 156
7.1.1 網(wǎng)絡(luò) 157
7.1.2 Kubernetes 服務(wù) 158
7.1.3 GitOps 部署服務(wù)器 . 160
7.2 實(shí)現(xiàn)基礎(chǔ)設(shè)施 . 162
7.2.1 安裝kubectl 162
7.2.2 設(shè)置模塊代碼庫(kù) 163
7.2.3 網(wǎng)絡(luò)模塊 166
7.2.4 Kubernetes 模塊 182
7.2.5 設(shè)置Argo CD 195
7.2.6 測(cè)試環(huán)境 200
7.2.7 清理基礎(chǔ)設(shè)施 201
7.3 小結(jié) . 203
第8 章 開(kāi)發(fā)者空間 205
8.1 編碼標(biāo)準(zhǔn)和開(kāi)發(fā)者的配置 . 206
8.2 在本地設(shè)置一個(gè)容器化的環(huán)境 214
8.2.1 安裝Multipass 215
8.2.2 輸入容器和映射文件夾 217
8.3 安裝Docker . 218
8.4 本地Docker 的高級(jí)用法:安裝Cassandra 220
8.5 安裝Kubernetes . 221
8.6 小結(jié) . 223
第9 章 開(kāi)發(fā)微服務(wù) 225
9.1 設(shè)計(jì)微服務(wù)端點(diǎn) 225
9.1.1 航班管理微服務(wù) 229
9.1.2 預(yù)留管理微服務(wù) 230
9.1.3 設(shè)計(jì)OpenAPI 規(guī)范 230
9.2 為微服務(wù)實(shí)現(xiàn)數(shù)據(jù) 238
9.2.1 預(yù)訂微服務(wù)的Redis 數(shù)據(jù)模型 238
9.2.2 航班微服務(wù)的MySQL 數(shù)據(jù)模型 . 241
9.3 微服務(wù)的實(shí)現(xiàn)代碼 243
9.3.1 航班微服務(wù)背后的代碼 244
9.3.2 健康檢查 250
9.4 向項(xiàng)目引入第二種微服務(wù) . 252
9.5 通過(guò)傘式項(xiàng)目關(guān)聯(lián)微服務(wù) . 259
9.6 小結(jié) . 262
第10 章 發(fā)布微服務(wù) 264
10.1 設(shè)置Staging 環(huán)境 265
10.1.1 Ingress 模塊 . 266
10.1.2 數(shù)據(jù)庫(kù)模塊 267
10.1.3 Forking Staging 基礎(chǔ)設(shè)施項(xiàng)目 268
10.1.4 配置Staging 工作流 269
10.1.5 編輯Staging 基礎(chǔ)設(shè)施代碼 . 271
10.2 傳輸航班信息容器 . 275
10.2.1 介紹Docker Hub 276
10.2.2 配置Docker Hub 277
10.2.3 配置流水線(xiàn) 278
10.3 部署航班服務(wù)容器 . 282
10.3.1 了解Kubernetes 部署 . 283
10.3.2 創(chuàng)建 Helm Chart 284
10.3.3 創(chuàng)建微服務(wù)部署代碼庫(kù) . 286
10.3.4 使用Argo CD 進(jìn)行GitOps 式的部署 . 292
10.4 清理 299
10.5 小結(jié) 299
第11 章 變更管理 . 300
11.1 微服務(wù)系統(tǒng)中的變更 301
11.1.1 以數(shù)據(jù)為導(dǎo)向 . 301
11.1.2 變更的影響 302
11.1.3 三種部署模型 . 304
11.2 基于我們的架構(gòu)的考量 306
11.2.1 基礎(chǔ)設(shè)施的變更 . 307
11.2.2 微服務(wù)變更 311
11.2.3 數(shù)據(jù)的變更 316
11.3 小結(jié) 318
第12 章 旅程的終點(diǎn)(和新的起點(diǎn)) . 320
12.1 微服務(wù)的復(fù)雜性與簡(jiǎn)化 321
12.2 衡量微服務(wù)轉(zhuǎn)型的進(jìn)展 325
12.3 小結(jié) 328