可伸縮服務架構:框架與中間件( 簡體 字) | |
作者:李艷鵬 等 | 類別:1. -> 程式設計 -> 綜合 |
出版社:電子工業出版社 | 3dWoo書號: 48695 詢問書籍請說出此書號! 有庫存 NT售價: 545 元 |
出版日:3/1/2018 | |
頁數:580 | |
光碟數:0 | |
站長推薦: | |
印刷:黑白印刷 | 語系: ( 簡體 字 ) |
ISBN:9787121335723 | 加入購物車 │加到我的最愛 (請先登入會員) |
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社) | |
第1章 如何設計一款永不重復的高性能分布式發號器 1
1.1 可選方案及技術選型 2 1.1.1 為什么不用UUID 2 1.1.2 基于數據庫的實現方案 2 1.1.3 Snowflake開源項目 3 1.1.4 小結 4 1.2 分布式系統對發號器的基本需求 4 1.3 架構設計與核心要點 6 1.3.1 發布模式 6 1.3.2 ID類型 7 1.3.3 數據結構 7 1.3.4 并發 9 1.3.5 機器ID的分配 9 1.3.6 時間同步 10 1.3.7 設計驗證 11 1.4 如何根據設計實現多場景的發號器 11 1.4.1 項目結構 12 1.4.2 服務接口的定義 14 1.4.3 服務接口的實現 15 1.4.4 ID元數據與長整型ID的互相轉換 22 1.4.5 時間操作 25 1.4.6 機器ID的生成 27 1.4.7 小結 32 1.5 如何保證性能需求 32 1.5.1 嵌入發布模式的壓測結果 33 1.5.2 中心服務器發布模式的壓測結果 33 1.5.3 REST發布模式(Netty實現)的壓測結果 33 1.5.4 REST發布模式(Spring Boot + Tomcat實現)的壓測結果 34 1.5.5 性能測試總結 34 1.6 如何讓用戶快速使用 35 1.6.1 REST發布模式的使用指南 35 1.6.2 服務化模式的使用指南 38 1.6.3 嵌入發布模式的使用指南 41 1.7 為用戶提供API文檔 43 1.7.1 RESTful API文檔 44 1.7.2 Java API文檔 45 第2章 可靈活擴展的消息隊列框架的設計與實現 49 2.1 背景介紹 50 2.2 項目目標 50 2.2.1 簡單易用 50 2.2.2 高性能 51 2.2.3 高穩定性 51 2.3 架構難點 51 2.3.1 線程模型 51 2.3.2 異常處理 53 2.3.3 優雅關機 53 2.4 設計與實現 54 2.4.1 項目結構 54 2.4.2 項目包的規劃 55 2.4.3 生產者的設計與實現 57 2.4.4 消費者的設計與實現 58 2.4.5 啟動模塊的設計與實現 67 2.4.6 消息處理器的體系結構 76 2.4.7 反射機制 79 2.4.8 模板項目的設計 80 2.5 使用指南 82 2.5.1 安裝步驟 82 2.5.2 Java API 83 2.5.3 與Spring環境集成 84 2.5.4 對服務源碼進行注解 85 2.6 API簡介 87 2.6.1 Producer API 87 2.6.2 Consumer API 88 2.6.3 消息處理器 88 2.6.4 消息處理器定義的注解 90 2.7 消息處理機模板項目 91 2.7.1 快速開發向導 91 2.7.2 后臺監控和管理 92 第3章 輕量級的數據庫分庫分表架構與框架 93 3.1 什么是分庫分表 94 3.1.1 使用數據庫的三個階段 94 3.1.2 在什么情況下需要分庫分表 95 3.1.3 分庫分表的典型實例 96 3.2 三種分而治之的解決方案 97 3.2.1 客戶端分片 97 3.2.2 代理分片 100 3.2.3 支持事務的分布式數據庫 101 3.3 分庫分表的架構設計 102 3.3.1 整體的切分方式 102 3.3.2 水平切分方式的路由過程和分片維度 106 3.3.3 分片后的事務處理機制 107 3.3.4 讀寫分離 119 3.3.5 分庫分表引起的問題 119 3.4 流行代理分片框架Mycat的初體驗 123 3.4.1 安裝Mycat 123 3.4.2 配置Mycat 124 3.4.3 配置數據庫節點 128 3.4.4 數據遷移 129 3.4.5 Mycat支持的分片規則 129 3.5 流行的客戶端分片框架Sharding JDBC的初體驗 138 3.5.1 Sharding JDBC簡介 138 3.5.2 Sharding JDBC的功能 139 3.5.3 Sharding JDBC的使用 141 3.5.4 Sharding JDBC的使用限制 152 3.6 自研客戶端分片框架dbsplit的設計、實現與使用 153 3.6.1 項目結構 154 3.6.2 包結構和執行流程 155 3.6.3 切片下標命名策略 159 3.6.4 SQL解析和組裝 167 3.6.5 SQL實用程序 168 3.6.6 反射實用程序 173 3.6.7 分片規則的配置 177 3.6.8 支持分片的SplitJdbcTemplate和SimpleSplitJdbcTemplate接口API 179 3.6.9 JdbcTemplate的擴展SimpleJdbcTemplate接口API 184 3.6.10 用于創建分庫分表數據庫的腳本工具 187 3.6.11 使用dbsplit的一個簡單示例 192 3.6.12 使用dbsplit的線上真實示例展示 199 第4章 緩存的本質和緩存使用的優秀實踐 201 4.1 使用緩存的目的和問題 202 4.2 自相似,CPU的緩存和系統架構的緩存 203 4.2.1 CPU緩存的架構及性能 205 4.2.2 CPU緩存的運行過程分析 206 4.2.3 緩存行與偽共享 208 4.2.4 從CPU的體系架構到分布式的緩存架構 218 4.3 常用的分布式緩存解決方案 221 4.3.1 常用的分布式緩存的對比 221 4.3.2 Redis初體驗 225 4.4 分布式緩存的通用方法 229 4.4.1 緩存編程的具體方法 229 4.4.2 應用層訪問緩存的模式 233 4.4.3 分布式緩存分片的三種模式 235 4.4.4 分布式緩存的遷移方案 238 4.4.5 緩存穿透、緩存并發和緩存雪崩 244 4.4.6 緩存對事務的支持 246 4.5 分布式緩存的設計與案例 248 4.5.1 緩存設計的核心要素 248 4.5.2 緩存設計的優秀實踐 250 4.5.3 關于常見的緩存線上問題的案例 253 4.6 客戶端緩存分片框架redic的設計與實現 257 4.6.1 什么時候需要redic 258 4.6.2 如何使用redic 258 4.6.3 更多的配置 258 4.6.4 項目結構 260 4.6.5 包結構 261 4.6.6 設計與實現的過程 261 第5章 大數據利器之Elasticsearch 268 5.1 Lucene簡介 269 5.1.1 核心模塊 269 5.1.2 核心術語 270 5.1.3 檢索方式 271 5.1.4 分段存儲 273 5.1.5 段合并策略 275 5.1.6 Lucene相似度打分 278 5.2 Elasticsearch簡介 286 5.2.1 核心概念 286 5.2.2 3C和腦裂 289 5.2.3 事務日志 291 5.2.4 在集群中寫索引 294 5.2.5 集群中的查詢流程 295 5.3 Elasticsearch實戰 298 5.3.1 Elasticsearch的配置說明 298 5.3.2 常用的接口 300 5.4 性能調優 305 5.4.1 寫優化 305 5.4.2 讀優化 308 5.4.3 堆大小的設置 313 5.4.4 服務器配置的選擇 315 5.4.5 硬盤的選擇和設置 316 5.4.6 接入方式 318 5.4.7 角色隔離和腦裂 319 第6章 全面揭秘分布式定時任務 321 6.1 什么是定時任務 322 6.2 分布式定時任務 341 6.2.1 定時任務的使用場景 342 6.2.2 傳統定時任務存在的問題 342 6.2.3 分布式定時任務及其原理 344 6.3 開源分布式定時任務的用法 347 6.3.1 Quartz的分布式模式 347 6.3.2 TBSchedule 356 6.3.3 Elastic-Job 365 第7章 RPC服務的發展歷程和對比分析 377 7.1 什么是RPC服務 378 7.2 RPC服務的原理 379 7.2.1 Sokcet套接字 379 7.2.2 RPC的調用過程 380 7.3 在程序中使用RPC服務 382 7.4 RPC服務的發展歷程 383 7.4.1 第一代RPC:以ONC RPC和DCE RPC為代表的函數式RPC 384 7.4.2 第二代RPC:支持面對象的編程 388 7.4.3 第三代RPC:SOA和微服務 398 7.4.4 架構的演進 402 7.5 主流的RPC框架 403 7.5.1 Thrift 403 7.5.2 ZeroC Ice 410 7.5.3 gRPC 418 7.5.4 Dubbo 430 第8章 Dubbo實戰及源碼分析 436 8.1 Dubbo的四種配置方式 437 8.1.1 XML配置 437 8.1.2 屬性配置 440 8.1.3 API配置 441 8.1.4 注解配置 443 8.2 服務的注冊與發現 446 8.2.1 注冊中心 446 8.2.2 服務暴露 449 8.2.3 引用服務 451 8.3 Dubbo通信協議及序列化探討 455 8.3.1 Dubbo支持的協議 455 8.3.2 協議的配置方法 456 8.3.3 多協議暴露服務 457 8.3.4 Dubbo協議的使用注意事項 458 8.3.5 Dubbo協議的約束 459 8.4 Dubbo中高效的I/O線程模型 459 8.4.1 對Dubbo中I/O模型的分析 459 8.4.2 Dubbo中線程配置的相關參數 460 8.4.3 在Dubbo線程方面踩過的坑 461 8.4.4 對Dubbo中線程使用的建議 462 8.5 集群的容錯機制與負載均衡 462 8.5.1 集群容錯機制的原理 462 8.5.2 集群容錯模式的配置方法 464 8.5.3 六種集群容錯模式 464 8.5.4 集群的負載均衡 465 8.6 監控和運維實踐 467 8.6.1 日志適配 467 8.6.2 監控管理后臺 467 8.6.3 服務降級 473 8.6.4 優雅停機 475 8.6.5 灰度發布 475 8.7 Dubbo項目線上案例解析 477 8.7.1 線上問題的通用解決方案 477 8.7.2 耗時服務耗盡了線程池的案例 480 8.7.3 容錯重試機制引發服務雪崩的案例 481 8.8 深入剖析Dubbo源碼及其實現 483 8.8.1 Dubbo的總體架構設計 483 8.8.2 配置文件 486 8.8.3 Dubbo的核心RPC 488 8.8.4 Dubbo巧妙的URL總線設計 491 8.8.5 Dubbo的擴展點加載SPI 492 8.8.6 Dubbo服務暴露的過程 493 8.8.7 服務引用 502 8.8.8 集群容錯和負載均衡 503 8.8.9 集群容錯 504 8.8.10 負載均衡 509 第9章 高性能網絡中間件 512 9.1 TCP/UDP的核心原理及本質探索 513 9.1.1 網絡模型 513 9.1.2 UDP、IP及其未解決的問題 515 9.1.3 TCP詳解 519 9.1.4 是否可以用UDP代替TCP 527 9.1.5 網絡通信的不可靠性討論 529 9.2 網絡測試優秀實踐 530 9.2.1 網絡測試的關鍵點 530 9.2.2 那些必不可少的網絡測試工具 532 9.2.3 典型的測試報告 539 9.3 高性能網絡框架的設計與實現 544 9.3.1 對代理功能的測試及分析 545 9.3.2 網絡中間件的使用介紹 549 9.3.3 內存和緩存的優化 551 9.3.4 快速解析流數據 554 本書以高可用服務架構為主題,側重于講解高可用架構設計的核心要點:可伸縮和可擴展,從應用層、數據庫、緩存、消息隊列、大數據查詢系統、分布式定時任務調度系統、微服務等層面詳細講解如何設計可伸縮、可擴展的框架,并給出在各個領域解決特定問題的方法論和實踐總結。隨著本書的出版,我們還開源了4個行之有效的互聯網可伸縮框架,包括數據庫分庫分表dbsplit、緩存分片redic、專業的發號器vesta和消息隊列處理機框架kclient,每個框架都開箱即用,也可以作為學習互聯網平臺化框架搭建的素材,更可以作為開發開源項目的示例。本書的上冊《分布式服務架構:原理、設計與實戰》詳細介紹了如何解決線上高并發服務的一致性、高性能、高可用、敏捷等痛點,本書與上冊結合后可覆蓋保證線上高并發服務的各個主題:一致性、高性能、高可用、可伸縮、可擴展、敏捷性等,每個主題都是一個方法論。充分理解這些主題,可保障線上服務健壯運行,對實現服務穩定性的n個9有著不可估量的作用。無論是對于互聯網的或者傳統的軟件工程師、測試工程師、架構師,還是對于深耕于IT的其他管理人員,本書都有很強的借鑒性和參考價值,是值得每個技術人員閱讀的架構級技術書。
本書的上冊《分布式服務架構:原理、設計與實戰》詳細介紹了如何解決線上高并發服務的一致性、高性能、高可用、敏捷等痛點。本書延續了高可用服務架構的主題,側重于講解高可用架構設計的核心要點:可伸縮和可擴展,從應用層、數據庫、緩存、消息隊列、大數據查詢系統、分布式定時任務調度系統、微服務等層面詳細講解如何設計可伸縮、可擴展的框架,并給出在各個領域解決特定問題的方法論和實踐總結。隨著本書的出版,我們還開源了4個行之有效的互聯網可伸縮框架,包括數據庫分庫分表dbsplit、緩存分片redic、專業的發號器vesta和消息隊列處理機框架kclient,每個框架都開箱即用,且都是獨立的互聯網高并發框架,是構建互聯網級項目的重要組件,也可以作為學習互聯網平臺化框架搭建的素材,更可以作為開發開源項目的示例。
在寫作本書的過程中,我們的多位作者根據自身在互聯網大規模、高并發項目中遇到的實際問題,總結了切實有效的方法論和解決方案,最后沉淀出一套適合高并發服務的優秀開源技術框架,其中的方法論可以幫助讀者解決實際問題,開源框架可以幫助讀者快速搭建可伸縮的互聯網高并發項目。無論是對于互聯網的或者傳統的軟件工程師、測試工程師、架構師,還是對于深耕于IT的其他管理人員,本書都有很強的借鑒性和參考價值,是值得每個技術人員閱讀的架構級技術書。 感謝我的作者團隊,楊彪、海亮、劉淏、博巖等無數次地與我一起通宵達旦地趕稿子;感謝汪勤平、史先斌、潘運鵬、張誠、高亮、李繼、周偉、曲源等同學在編輯階段為我閱稿,并提出專業意見;感謝IT行業內的重量級大咖焦英俊、楊延峰、右軍(于君澤)在百忙之中抽出時間為本書作序;也感謝大作者開濤和安曉輝等同學為本書寫評語;感謝各個行業的重量級朋友們對本書的大力支持,包括:馮沁原、賀偉、張義明、馬星光、高春東、黃福偉、李雪冰、付紅雷等;更感謝加入云時代架構技術社區的小伙伴們的持續關注和支持! 在寫書的過程中,我們每個人都兢兢業業、勤勤懇懇,每增加一部分內容,都互相審核,盡量保證書中案例的準確性和時效性,確保能為讀者帶來很有價值的設計經驗,并且我們想做到“授人以漁”,而不是“授人以魚”。在寫作的過程中有辛苦、有快樂、有價值、有成果,我們希望能持續地為讀者帶來經驗、解決方案、架構思路和快樂。 感謝電子工業出版社博文視點張國霞編輯的認真態度和辛勤工作,本書在經過作者們及國霞編輯大半年的努力后最終順利出版。 最后,感謝我的妻子和父母在我寫書期間對我的全力支持和幫助。 李艷鵬 2018年3月 推薦序一 從傳統互聯網到移動互聯網再到物聯網,中國乃至全球的互聯網技術在近十年得到了高速發展。作為架構師,我們非常樂意把這些技術傳播出去,讓更多的人享受互聯網技術的紅利,讓技術拓展商業的邊界。阿里巴巴的雙11技術已經越來越成熟,因為阿里巴巴已經逐步具備了基于云的計算能力,可以輕松應對各種業務壓力。 本書的內容包括緩存分片、消息隊列框架、數據庫分庫分表、分布式發號器、大數據查詢系統、分布式定時調度任務系統、微服務和RPC等;并配備了4個開箱即用的開源項目,包括分庫分表框架dbsplit、專業的發號器vesta、消息隊列框架kclient和緩存分片的redic,每個項目都是獨立的互聯網高并發框架,是構建互聯網級項目的重要組件。本書對行業內許多流行的開源項目也有很多介紹,讀者可以在其中學到平臺架構設計的方方面面,也可以了解開源項目在構思和實現方面的優秀實踐。 互聯網的技術核心其實源于分布式,這是互聯網具備高性能、高并發特性的基礎,掌握這些核心內容后,你會發現駕馭技術變得如此輕松!希望艷鵬的這本書可以帶領大家掌握分布式的精髓,這本書非常棒!也感謝艷鵬邀請我為本書作序! 技術的世界是如此美妙,作為一名深耕架構的技術人,我由衷地希望有更多的人加入,一起為中國的技術添磚加瓦! 焦英俊 未達科技CEO、原阿里巴巴中文站首席架構師 推薦序二 近十年來,互聯網服務在社交網絡、搜索、電商、O2O、視頻、移動和云計算等領域呈現了井噴式發展,伴隨而來的是數千萬的日訂單量、數億的日活躍用戶、數百億的日消息發送量等海量的業務規模。支撐這些海量的業務規模的則是基于廉價服務器集群的高可用、可伸縮的分布式互聯網技術。 本書以可伸縮服務架構為重點,從理論基礎、架構設計、一線行業的實踐經驗和代碼實現細節等方面,系統化地介紹了分布式互聯網的高可用、可伸縮技術的核心要點,是一本兼具深度和廣度的技術參考書。 雖然本書的主題是“架構”,但是這并不影響本書的易讀性,它比大多數同類書都要講得透徹、明白,也適合有想法、有目標的初中級開發人員閱讀。分庫分表、Dubbo 源碼解析等方面的內容,更可以幫助高級技術人員提升自己的技術實力,以及發揮更大的價值。 架構是在長期的生產活動中經過深度思考所積累下來的優秀實踐和可復用的合理抽象,希望你不要錯過本書的精彩內容。 楊延峰 開心網副總裁 推薦序三 楊彪兄弟找我為本書寫序,我欣然從命。我閱讀了這本佳作的若干個章節,發現它有幾個特點:緊扣常見的問題域;結合了開源產品;代碼很講究。這里,我想談一談開源與寫作的關系,因為我覺得這就是一場修行。 什么是開源?我的粗淺理解就是,開源就是開源產品,是開放了源代碼的產品。我從業16年,用過不少開源產品,但發現被廣泛使用的項目并不都擁有好的代碼和充分的測試用例,可見知易行難。可喜的是,國人的開源產品在逐漸增多,也有不少好作品出現,艷鵬的vesta-id-generator解決的就是分布式系統中常見的ID生成問題。 古人談學習有“眼到”、“手到”、“心到”之說。 “眼到”指的是閱讀,但閱讀面廣并不見得知識就是自己的,例如一個早晚聽張靚穎歌曲的粉絲不見得就能發出海豚音。 “手到”指的是要不斷練習,當然,這并不是指簡單、重復地練習。佛羅里達州立大學心理學家K. Anders Ericsson首次提出了“刻意練習”的概念,該練習方法的核心假設是:專家級水平是逐漸練出來的,而有效進步的關鍵在于找到一系列小任務讓受訓者按順序完成,這些小任務必須是受訓者正好不會做但又可以學習和掌握的。 我認為,“心到”的一個環節是寫作。寫作能幫我們把脈絡梳理得更通暢。從自己懂,到給別人講明白,再到寫出來且別人還能明白,是進階的關系。 所以,從項目產品實踐,到開源,再到寫作,就是一場修行。修行是外在的表現、是與同行交流、是與世界對話;修行也是內觀,是收獲若干思想的結晶、汲取若干靈感的泉水、沉淀若干系統的對白,在其中收獲更多的就是作者自己。 開卷有益,愿讀者也能在閱讀和實踐上收獲知與行的快樂! 于君澤 螞蟻金服高級技術專家 |