|
-- 會員 / 註冊 --
|
|
|
|
微服務架構設計模式 ( 簡體 字) |
作者:[美] 克里斯·理查森(Chris Richardson) 著 | 類別:1. -> 程式設計 -> 綜合 |
譯者: |
出版社:機械工業出版社 | 3dWoo書號: 51012 詢問書籍請說出此書號!【缺書】 NT售價: 695 元 |
出版日:4/1/2019 |
頁數:450 |
光碟數:0 |
|
站長推薦: |
印刷:黑白印刷 | 語系: ( 簡體 版 ) |
|
加入購物車 │加到我的最愛 (請先登入會員) |
ISBN:9787111624127 |
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 序 |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證) |
作者序: |
譯者序: |
前言:我最喜歡的格言之一是:
未來已經到來,只是還沒有平均分布。
—威廉·吉布森,科幻小說作家
這句話的實質是在說,新的想法和技術需要一段時間才能通過社區傳播開來并被廣泛采用。我發現并深入關注微服務的故事,就是新思想緩慢擴散的一個極好例子。這個故事始于 2006 年,當時受到 AWS 布道師一次演講的啟發,我開始走上了一條最終導致我創建早期 Cloud Foundry 的道路,它與今天的 Cloud Foundry 唯一相同的是名稱。Cloud Foundry 采用平臺即服務(PaaS)模式,用于在 EC2 上自動部署 Java 應用程序。與我構建的其他每個企業級 Java 應用程序一樣,我的 Cloud Foundry 采用了單體架構,它由單個 Java Web 應用程序(WAR)文件構成。
將初始化、配置、監控和管理等各種復雜的功能捆綁到一個單體架構中,這給開發和運維都帶來了挑戰。例如,你無法在不測試和重新部署整個應用程序的情況下更改它的用戶界面。因為監控和管理組件依賴于維護內存狀態的復雜事件處理(CEP)引擎,所以我們無法運行應用程序的多個實例!這是個令人尷尬的事實,但我可以說的是,我是一名軟件開發人員,就讓我這個無辜的碼農來指出這些問題吧。
顯然,單體架構無法滿足應用程序的需求,但替代方案是什么?在eBay 和亞馬遜等公司,軟件界已經開始逐漸嘗試一些新東西。例如,亞馬遜在 2002 年左右開始逐步從單體架構遷移新架構用一系列松散耦合的服務取代了單體。服務由亞馬遜稱為“兩個比薩”的團隊所維護:團隊規模小到兩個比薩餅就能讓所有人吃飽。
亞馬遜采用這種架構來加快軟件開發速度,以便公司能夠更快地進行創新并贏得競爭。結果令人印象深刻:據報道,亞馬遜平均每11.6秒就能夠將代碼的更改部署到生產環境中!
2010年年初,當我轉向其他項目之后,我終于領悟了軟件架構的未來。那時我正在讀Michael T. Fisher和Martin L. Abbott 撰寫的《The Art of Scalability: Scalable Web Architecture, Processes, and Organizations for the Modern Enterprise》(Addison-Wesley Professional,2009)。該書中的一個關鍵思想是擴展立方體,如第2章所述,它是一個用于擴展應用程序的三維模型。由擴展立方體定義的 Y 軸擴展功能將應用程序功能分解為服務。事后來看,這是顯而易見的,但對我來說,這是一個讓我醍醐灌頂的時刻!如果將 Cloud Foundry 設計為一組服務,我本可以解決兩年前面臨的挑戰!
2012年4月,我首次就這種架構方法發表了題為“Decomposing Applications for Scalability and Deployability”的演講當時,這種架構并沒有一個被普遍接受的名稱。我有時稱它為模塊化多語言架構,因為服務可以用不同的語言編寫。
未來還沒有平均分布的另一個佐證是,微服務這個詞在 2011 年的軟件架構研討會上被用來描述這種架構, 當我聽到 Fred George 在 Oredev 2013 上發表演講時,我第一次遇到這個詞,我立刻喜歡上了它!小型、松散耦合的團隊快速可靠地開發和運維微服務的思想正在通過軟件社區慢慢擴散。但是,這種對未來的看法可能與日常現實截然不同。如今,業務關鍵型企業應用程序通常是由大型團隊開發的大型單體應用。雖然軟件版本不經常更新,但每次更新都會給所涉及的參與人員帶來巨大的痛苦。IT經常難以跟上業務需求。大家都很想知道如何采用微服務架構來解決所有這些問題。
本書的目標就是回答這個問題。它將使讀者對微服務架構、它的好處和弊端,以及應該何時使用微服務架構有一個很好的理解。書中描述了如何解決我們將面臨的眾多架構設計挑戰,包括如何管理分布式數據,還介紹了如何將單體應用程序重構為微服務架構。但本書并不是鼓吹微服務架構的宣言。相反,它的內容圍繞著一系列模式進行展開。模式是在特定上下文中發生的問題的可重用解決方案。模式的優點在于,除了描述解決方案的好處之外,還描述了成功實施解決方案時必須克服的弊端和問題。根據我的經驗,在選擇解決方案時,這種客觀性會帶來更好的決策。我希望你會喜歡閱讀這本書,它會教你如何成功開發基于微服務架構的應用程序。
致謝
寫作是一項孤獨的活動,但是把粗略的草稿變成一本完整的圖書,卻需要來自各方的共同努力。
首先,我要感謝 Manning 出版社的 Erin Twohey 和 Michael Stevens,他們一直鼓勵我在《POJOs in Action》之后再寫一本書。我還要感謝我的編輯 Cynthia Kane 和 Marina Michaels。Cynthia Kane 幫助我啟動了這本書,并在前幾章與我合作。Marina Michaels 接替 Cynthia 并與我一起工作到最后。Marina 對書的內容提出了細致和建設性的意見,我將永遠感激不盡。我還要感謝 Manning 出版社參與了這本書的出版的其他成員。
我要感謝技術編輯 Christian Mennerich、技術校對員 Andy Miles以及所有的外部審校員:Andy Kirsch、Antonio Pessolano、Areg Melik-Adamyan、Cage Slagel、Carlos Curotto、Dror Helper、Eros Pedrini、Hugo Cruz、Irina Romanenko、Jesse Rosalia、Joe Justesen、John Guthrie、Keerthi Shetty、Michele Mauro、Paul Grebenc、Pethuru Raj、Potito Coluccelli、Shobha Iyer、Simeon Leyzerzon、Srihari Sridharan、Tim Moore、Tony Sweets、Trent Whiteley、Wes Shaddix、William E. Wheeler 和 Zoltan Hamori。
我還要感謝所有購買 MEAP 預覽版并在論壇或直接向我提供反饋的人。
我要感謝我曾經參與過的所有會議和聚會的組織者及與會者,他們給了我大量的機會,讓我介紹和調整我關于微服務的想法。我要感謝我在世界各地的咨詢和培訓客戶,讓我有機會幫助他們將我關于微服務的想法付諸實踐。
我還要感謝 Eventuate 公司的同事 Andrew、Valentin、Artem 和 Stanislav 對 Eventuate 產品和開源項目的貢獻。
最后,我要感謝妻子 Laura 和孩子Ellie、Thomas 和 Janet,感謝他們在過去的 18 個月里給予我的支持和理解。這段時間我一直盯著我的筆記本電腦,以至于接連錯過了觀看 Ellie 的足球比賽、Thomas 學習飛行模擬器,以及嘗試與 Janet 一起開設新餐館這些重要的家庭活動。
謝謝你們! |
內容簡介:成功地開發基于微服務架構的應用軟件,需要掌握一系列全新的架構思想和實踐。在這本獨特的書籍中,微服務架構的先驅、Java開發者社區的意見領袖Chris Richardson收集、分類并解釋了44個架構設計模式,這些模式可用來解決諸如服務拆分、事務管理、查詢和跨服務通信等難題。
本書將教會你如何開發和部署生產級別的微服務架構應用。這套寶貴的架構設計模式建立在數十年的分布式系統經驗之上,Chris還為開發服務添加了新的模式,并將它們組合成可在真實條件下可靠地擴展和執行的系統。本書不僅僅是一個模式目錄,還提供了經驗驅動的建議,以幫助你設計、實現、測試和部署基于微服務的應用程序。
本書包含
如何(以及為什么)使用微服務架構
服務拆分的策略
事務管理和查詢相關的模式
高效的測試策略
包括容器和Serverless在內的部署模式
本書專為熟悉標準企業應用程序架構的開發人員編寫,使用Java編寫所有示例代碼。 |
目錄:寫給中文版讀者的話 譯者序 中文版序一 中文版序二 前言 引言 第1章 逃離單體地獄 / 1 1.1 邁向單體地獄的漫長旅程 / 2 1.1.1 FTGO應用程序的架構 / 3 1.1.2 單體架構的好處 / 4 1.1.3 什么是單體地獄 / 4 1.2 為什么本書與你有關 / 7 1.3 你會在本書中學到什么 / 8 1.4 拯救之道:微服務架構 / 8 1.4.1 擴展立方體和服務 / 9 1.4.2 微服務架構作為模塊化的一種形式 / 11 1.4.3 每個服務都擁有自己的數據庫 / 12 1.4.4 FTGO的微服務架構 / 12 1.4.5 微服務架構與SOA的異同 / 14 1.5 微服務架構的好處和弊端 / 15 1.5.1 微服務架構的好處 / 15 1.5.2 微服務架構的弊端 / 17 1.6 微服務架構的模式語言 / 19 1.6.1 微服務架構并不是“銀彈” / 20 1.6.2 模式和模式語言 / 21 1.6.3 微服務架構的模式語言概述 / 24 1.7 微服務之上:流程和組織 / 29 1.7.1 進行軟件開發和交付的組織 / 30 1.7.2 進行軟件開發和交付的流程 / 31 1.7.3 采用微服務架構時的人為因素 / 32 第2章 服務的拆分策略 / 34 2.1 微服務架構到底是什么 / 35 2.1.1 軟件架構是什么,為什么它如此重要 / 35 2.1.2 什么是架構的風格 / 37 2.1.3 微服務架構是一種架構風格 / 40 2.2 為應用程序定義微服務架構 / 43 2.2.1 識別系統操作 / 45 2.2.2 根據業務能力進行服務拆分 / 50 2.2.3 根據子域進行服務拆分 / 53 2.2.4 拆分的指導原則 / 54 2.2.5 拆分單體應用為服務的難點 / 56 2.2.6 定義服務API / 59 第3章 微服務架構中的進程間通信 / 63 3.1 微服務架構中的進程間通信概述 / 64 3.1.1 交互方式 / 64 3.1.2 在微服務架構中定義API / 66 3.1.3 API的演化 / 67 3.1.4 消息的格式 / 69 3.2 基于同步遠程過程調用模式的通信 / 70 3.2.1 使用REST / 71 3.2.2 使用gRPC / 74 3.2.3 使用斷路器模式處理局部故障 / 75 3.2.4 使用服務發現 / 78 3.3 基于異步消息模式的通信 / 82 3.3.1 什么是消息傳遞 / 83 3.3.2 使用消息機制實現交互方式 / 84 3.3.3 為基于消息機制的服務API創建API規范 / 86 3.3.4 使用消息代理 / 87 3.3.5 處理并發和消息順序 / 91 3.3.6 處理重復消息 / 92 3.3.7 事務性消息 / 93 3.3.8 消息相關的類庫和框架 / 97 3.4 使用異步消息提高可用性 / 99 3.4.1 同步消息會降低可用性 / 99 3.4.2 消除同步交互 / 101 第4章 使用Saga管理事務 / 106 4.1 微服務架構下的事務管理 / 107 4.1.1 微服務架構對分布式事務的需求 / 108 4.1.2 分布式事務的挑戰 / 109 4.1.3 使用Saga模式維護數據一致性 / 109 4.2 Saga的協調模式 / 113 4.2.1 協同式Saga / 113 4.2.2 編排式Saga / 117 4.3 解決隔離問題 / 121 4.3.1 缺乏隔離導致的問題 / 122 4.3.2 Saga模式下實現隔離的對策 / 123 4.4 Order Service和Create Order Saga的設計 / 127 4.4.1 OrderService類 / 128 4.4.2 Create Order Saga的實現 / 129 4.4.3 OrderCommandHandlers類 / 136 4.4.4 OrderServiceConfiguration類 / 138 第5章 微服務架構中的業務邏輯設計 / 141 5.1 業務邏輯組織模式 / 142 5.1.1 使用事務腳本模式設計業務邏輯 / 143 5.1.2 使用領域模型模式設計業務邏輯 / 144 5.1.3 關于領域驅動設計 / 146 5.2 使用聚合模式設計領域模型 / 146 5.2.1 模糊邊界所帶來的問題 / 147 5.2.2 聚合擁有明確的邊界 / 149 5.2.3 聚合的規則 / 150 5.2.4 聚合的顆粒度 / 152 5.2.5 使用聚合設計業務邏輯 / 153 5.3 發布領域事件 / 154 5.3.1 為什么需要發布變更事件 / 154 5.3.2 什么是領域事件 / 155 5.3.3 事件增強 / 155 5.3.4 識別領域事件 / 156 5.3.5 生成和發布領域事件 / 157 5.3.6 消費領域事件 / 161 5.4 Kitchen Service的業務邏輯 / 162 5.5 Order Service的業務邏輯 / 167 5.5.1 Order聚合 / 169 5.5.2 OrderService類 / 173 第6章 使用事件溯源開發業務邏輯 / 176 6.1 使用事件溯源開發業務邏輯概述 / 177 6.1.1 傳統持久化技術的問題 / 177 6.1.2 什么是事件溯源 / 179 6.1.3 使用樂觀鎖處理并發更新 / 186 6.1.4 事件溯源和發布事件 / 186 6.1.5 使用快照提升性能 / 188 6.1.6 冪等方式的消息處理 / 189 6.1.7 領域事件的演化 / 190 6.1.8 事件溯源的好處 / 192 6.1.9 事件溯源的弊端 / 193 6.2 實現事件存儲庫 / 194 6.2.1 Eventuate Local事件存儲庫的工作原理 / 195 6.2.2 Eventuate的Java客戶端框架 / 198 6.3 同時使用Saga和事件溯源 / 201 6.3.1 使用事件溯源實現協同式Saga / 203 6.3.2 創建編排式Saga / 203 6.3.3 實現基于事件溯源的Saga參與方 / 205 6.3.4 實現基于事件溯源的Saga編排器 / 208 第7章 在微服務架構中實現查詢 / 212 7.1 使用API組合模式進行查詢 / 213 7.1.1 findOrder()查詢操作 / 213 7.1.2 什么是API組合模式 / 214 7.1.3 使用API組合模式實現findOrder()查詢操作 / 215 7.1.4 API組合模式的設計缺陷 / 216 7.1.5 API組合模式的好處和弊端 / 219 7.2 使用CQRS模式 / 220 7.2.1 為什么要使用CQRS / 220 7.2.2 什么是CQRS / 223 7.2.3 CQRS的好處 / 226 7.2.4 CQRS的弊端 / 227 7.3 設計CQRS視圖 / 228 7.3.1 選擇視圖存儲庫 / 229 7.3.2 設計數據訪問模塊 / 230 7.3.3 添加和更新CQRS視圖 / 232 7.4 實現基于AWS DynamoDB的CQRS視圖 / 233 7.4.1 OrderHistoryEventHandlers模塊 / 234 7.4.2 DynamoDB中的數據建模和查詢設計 / 235 7.4.3 OrderHistoryDaoDynamoDb類 / 239 第8章 外部API模式 / 244 8.1 外部API的設計難題 / 245 8.1.1 FTGO移動客戶端API的設計難題 / 246 8.1.2 其他類型客戶端API的設計難題 / 248 8.2 API Gateway模式 / 250 8.2.1 什么是API Gateway模式 / 250 8.2.2 API Gateway模式的好處和弊端 / 256 8.2.3 以Netflix為例的API Gateway / 257 8.2.4 API Gateway的設計難題 / 258 8.3 實現一個API Gateway / 260 8.3.1 使用現成的API Gateway產品或服務 / 261 8.3.2 開發自己的API Gateway / 262 8.3.3 使用GraphQL實現API Gateway / 269 第9章 微服務架構中的測試策略(上) / 282 9.1 微服務架構中的測試策略概述 / 284 9.1.1 什么是測試 / 284 9.1.2 微服務架構中的測試挑戰 / 289 9.1.3 部署流水線 / 295 9.2 為服務編寫單元測試 / 296 9.2.1 為實體編寫單元測試 / 298 9.2.2 為值對象編寫單元測試 / 299 9.2.3 為Saga編寫單元測試 / 300 9.2.4 為領域服務編寫單元測試 / 302 9.2.5 為控制器編寫單元測試 / 303 9.2.6 為事件和消息處理程序編寫單元測試 / 305 第10章 微服務架構中的測試策略(下) / 308 10.1 編寫集成測試 / 308 10.1.1 針對持久化層的集成測試 / 311 10.1.2 針對基于REST的請求/響應式交互的集成測試 / 312 10.1.3 針對發布/訂閱式交互的集成測試 / 316 10.1.4 針對異步請求/響應式交互的集成契約測試 / 320 10.2 編寫組件測試 / 324 10.2.1 定義驗收測試 / 325 10.2.2 使用Gherkin編寫驗收測試 / 326 10.2.3 設計組件測試 / 328 10.2.4 為FTGO的Order Service編寫組件測試 / 330 10.3 端到端測試 / 334 10.3.1 設計端到端測試 / 335 10.3.2 編寫端到端測試 / 335 10.3.3 運行端到端測試 / 336 第11章 開發面向生產環境的微服務應用 / 338 11.1 開發安全的服務 / 339 11.1.1 傳統單體應用程序的安全性 / 340 11.1.2 在微服務架構中實現安全性 / 343 11.2 設計可配置的服務 / 349 11.2.1 使用基于推送的外部化配置 / 350 11.2.2 使用基于拉取的外部化配置 / 352 11.3 設計可觀測的服務 / 353 11.3.1 使用健康檢查API模式 / 355 11.3.2 使用日志聚合模式 / 357 11.3.3 使用分布式追蹤模式 / 358 11.3.4 使用應用程序指標模式 / 361 11.3.5 使用異常追蹤模式 / 364 11.3.6 使用審計日志模式 / 365 11.4 使用微服務基底模式開發服務 / 367 11.4.1 使用微服務基底 / 368 11.4.2 從微服務基底到服務網格 / 368 第12章 部署微服務應用 / 371 12.1 部署模式:編程語言特定的發布包格式 / 374 12.1.1 使用編程語言特定的發布包格式進行部署的好處 / 376 12.1.2 使用編程語言特定的發布包格式進行部署的弊端 / 377 12.2 部署模式:將服務部署為虛擬機 / 378 12.2.1 將服務部署為虛擬機的好處 / 380 12.2.2 將服務部署為虛擬機的弊端 / 380 12.3 部署模式:將服務部署為容器 / 381 12.3.1 使用Docker部署服務 / 383 12.3.2 將服務部署為容器的好處 / 385 12.3.3 將服務部署為容器的弊端 / 386 12.4 使用Kubernetes部署FTGO應用程序 / 386 12.4.1 什么是Kubernetes / 386 12.4.2 在Kubernetes上部署Restaurant Service / 389 12.4.3 部署API Gateway / 392 12.4.4 零停機部署 / 393 12.4.5 使用服務網格分隔部署與發布流程 / 394 12.5 部署模式:Serverless部署 / 402 12.5.1 使用AWS Lambda進行Serverless部署 / 403 12.5.2 開發Lambda函數 / 404 12.5.3 調用Lambda函數 / 404 12.5.4 使用Lambda函數的好處 / 405 12.5.5 使用Lambda函數的弊端 / 406 12.6 使用AWS Lambda和AWS Gateway部署RESTful服務 / 406 12.6.1 AWS Lambda版本的Restaurant Service / 407 12.6.2 把服務打包為ZIP文件 / 411 12.6.3 使用Serverless框架部署Lambda函數 / 412 第13章 微服務架構的重構策略 / 415 13.1 重構到微服務需要考慮的問題 / 416 13.1.1 為什么要重構單體應用 / 416 13.1.2 絞殺單體應用 / 417 13.2 將單體應用重構為微服務架構的若干策略 / 420 13.2.1 將新功能實現為服務 / 420 13.2.2 隔離表現層與后端 / 422 13.2.3 提取業務能力到服務中 / 423 13.3 設計服務與單體的協作方式 / 429 13.3.1 設計集成膠水 / 430 13.3.2 在服務和單體之間維持數據一致性 / 434 13.3.3 處理身份驗證和訪問授權 / 438 13.4 將新功能實現為服務:處理錯誤配送訂單 / 440 13.4.1 Delayed Delivery Service的設計 / 441 13.4.2 為Delayed Delivery Service設計集成膠水 / 442 13.5 從單體中提取送餐管理功能 / 444 13.5.1 現有的送餐管理功能 / 444 13.5.2 Delivery Service概覽 / 446 13.5.3 設計Delivery Service的領域模型 / 447 13.5.4 Delivery Service集成膠水的設計 / 450 13.5.5 修改FTGO單體使其能夠與Delivery Service交互 / 451 |
序: |
|