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