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