●第1章 如何設計一款永不重復的高性能分布式發號器11.1 可選方案及技術選型21.1.1 為什麼不用UUID21.1.2 基於數據庫的實現方案21.1.3 Snowflake開源項目31.1.4 小結41.2 分布式繫統對發號器的基本需求41.3 架構設計與核心要點61.3.1 發布模式61.3.2 ID類型71.3.3 數據結構71.3.4 並發91.3.5 機器ID的分配91.3.6 時間同步101.3.7 設計驗證111.4 如何根據設計實現多場景的發號器111.4.1 項目結構121.4.2 服務接口的定義141.4.3 服務接口的實現151.4.4 數據與長整型ID的互相轉換221.4.5 時間操作251.4.6 機器ID的生成271.4.7 小結321.5 如何保證性能需求321.5.1 嵌入發布模式的壓測結果331.5.2 中心服務器發布模式的壓測結果331.5.3 REST發布模式(Netty實現)的壓測結果331.5.4 REST發布模式(Spring Boot + Tomcat實現)的壓測結果341.5.5 性能測試總結341.6 如何讓用戶快速使用351.6.1 REST發布模式的使用指南351.6.2 服務化模式的使用指南381.6.3 嵌入發布模式的使用指南411.7 為用戶提供API文檔431.7.1 RESTful API文檔441.7.2 Java API文檔45第2章 可靈活擴展的消息隊列框架的設計與實現492.1 背景介紹502.2 項目目標502.2.1 簡單易用502.2.2 高性能512.2.3 高穩定性512.3 架構難點512.3.1 線程模型512.3.2 異常處理532.3.3 優雅關機532.4 設計與實現542.4.1 項目結構542.4.2 項目包的規劃552.4.3 生產者的設計與實現572.4.4 消費者的設計與實現582.4.5 啟動模塊的設計與實現672.4.6 消息處理器的體繫結構762.4.7 反射機制792.4.8 模板項目的設計802.5 使用指南822.5.1 安裝步驟822.5.2 Java API832.5.3 與Spring環境集成842.5.4 對服務源碼進行注解852.6 API簡介872.6.1 Producer API872.6.2 Consumer API882.6.3 消息處理器882.6.4 消息處理器定義的注解902.7 消息處理機模板項目912.7.1 快速開發向導912.7.2 後臺監控和管理92第3章 輕量級的數據庫分庫分表架構與框架933.1 什麼是分庫分表943.1.1 使用數據庫的三個階段943.1.2 在什麼情況下需要分庫分表953.1.3 分庫分表的典型實例963.2 三種分而治之的解決方案973.2.1 客戶端分片973.2.2 代理分片1003.2.3 支持事務的分布式數據庫1013.3 分庫分表的架構設計1023.3.1 整體的切分方式1023.3.2 水平切分方式的路由過程和分片維度1063.3.3 分片後的事務處理機制1073.3.4 讀寫分離1193.3.5 分庫分表引起的問題1193.4 流行代理分片框架Mycat的初體驗1233.4.1 安裝Mycat1233.4.2 配置Mycat1243.4.3 配置數據庫節點1283.4.4 數據遷移1293.4.5 Mycat支持的分片規則1293.5 流行的客戶端分片框架Sharding JDBC的初體驗1383.5.1 Sharding JDBC簡介1383.5.2 Sharding JDBC的功能1393.5.3 Sharding JDBC的使用1413.5.4 Sharding JDBC的使用1523.6 自研客戶端分片框架dbsplit的設計、實現與使用1533.6.1 項目結構1543.6.2 包結構和執行流程1553.6.3 切片下標命名策略1593.6.4 SQL解析和組裝1673.6.5 SQL實用程序1683.6.6 反射實用程序1733.6.7 分片規則的配置1773.6.8 支持分片的SplitJdbcTemplate和SimpleSplitJdbcTemplate接口API1793.6.9 JdbcTemplate的擴展SimpleJdbcTemplate接口API1843.6.10 用於創建分庫分表數據庫的腳本工具1873.6.11 使用dbsplit的一個簡單示例1923.6.12 使用dbsplit的線上真實示例展示199第4章 緩存的本質和緩存使用的優秀實踐2014.1 使用緩存的目的和問題2024.2 自相似,CPU的緩存和繫統架構的緩存2034.2.1 CPU緩存的架構及性能2054.2.2 CPU緩存的運行過程分析2064.2.3 緩存行與偽共享2084.2.4 從CPU的體繫架構到分布式的緩存架構2184.3 常用的分布式緩存解決方案2214.3.1 常用的分布式緩存的對比2214.3.2 Redis初體驗2254.4 分布式緩存的通用方法2294.4.1 緩存編程的具體方法2294.4.2 應用層訪問緩存的模式2334.4.3 分布式緩存分片的三種模式2354.4.4 分布式緩存的遷移方案2384.4.5 緩存穿透、緩存並發和緩存雪崩2444.4.6 緩存對事務的支持2464.5 分布式緩存的設計與案例2484.5.1 緩存設計的核心要素2484.5.2 緩存設計的優秀實踐2504.5.3 關於常見的緩存線上問題的案例2534.6 客戶端緩存分片框架redic的設計與實現2574.6.1 什麼時候需要redic2584.6.2 如何使用redic2584.6.3 更多的配置2584.6.4 項目結構2604.6.5 包結構2614.6.6 設計與實現的過程261第5章 大數據利器之Elasticsearch2685.1 Lucene簡介2695.1.1 核心模塊2695.1.2 核心術語2705.1.3 檢索方式2715.1.4 分段存儲2735.1.5 段合並策略2755.1.6 Lucene相似度打分2785.2 Elasticsearch簡介2865.2.1 核心概念2865.2.2 3C和腦裂2895.2.3 事務日志2915.2.4 在集群中寫索引2945.2.5 集群中的查詢流程2955.3 Elasticsearch實戰2985.3.1 Elasticsearch的配置說明2985.3.2 常用的接口3005.4 性能調優3055.4.1 寫優化3055.4.2 讀優化3085.4.3 堆大小的設置3135.4.4 服務器配置的選擇3155.4.5 硬盤的選擇和設置3165.4.6 接入方式3185.4.7 角色隔離和腦裂319第6章 全面揭秘分布式定時任務3216.1 什麼是定時任務3226.2 分布式定時任務3416.2.1 定時任務的使用場景3426.2.2 傳統定時任務存在的問題3426.2.3 分布式定時任務及其原理3446.3 開源分布式定時任務的用法3476.3.1 Quartz的分布式模式3476.3.2 TBSchedule3566.3.3 Elastic-Job365第7章 RPC服務的發展歷程和對比分析3777.1 什麼是RPC服務3787.2 RPC服務的原理3797.2.1 Sokcet套接字3797.2.2 RPC的調用過程3807.3 在程序中使用RPC服務3827.4 RPC服務的發展歷程3837.4.1 第一代RPC:以ONC RPC和DCE RPC為代表的函數式RPC3847.4.2 第二代RPC:支持面對像的編程3887.4.3 第三代RPC:SOA和微服務3987.4.4 架構的演進4027.5 主流的RPC框架4037.5.1 Thrift4037.5.2 ZeroC Ice4107.5.3 gRPC4187.5.4 Dubbo430第8章 Dubbo實戰及源碼分析4368.1 Dubbo的四種配置方式4378.1.1 XML配置4378.1.2 屬性配置4408.1.3 API配置4418.1.4 注解配置4438.2 服務的注冊與發現4468.2.1 注冊中心4468.2.2 服務暴露4498.2.3 引用服務4518.3 Dubbo通信協議及序列化探討4558.3.1 Dubbo支持的協議4558.3.2 協議的配置方法4568.3.3 多協議暴露服務4578.3.4 Dubbo協議的使用注意事項4588.3.5 Dubbo協議的約束4598.4 Dubbo中高效的I/O線程模型4598.4.1 對Dubbo中I/O模型的分析4598.4.2 Dubbo中線程配置的相關參數4608.4.3 在Dubbo線程方面踩過的坑4618.4.4 對Dubbo中線程使用的建議4628.5 集群的容錯機制與負載均衡4628.5.1 集群容錯機制的原理4628.5.2 集群容錯模式的配置方法4648.5.3 六種集群容錯模式4648.5.4 集群的負載均衡4658.6 監控和運維實踐4678.6.1 日志適配4678.6.2 監控管理後臺4678.6.3 服務降級4738.6.4 優雅停機4758.6.5 灰度發布4758.7 Dubbo項目線上案例解析4778.7.1 線上問題的通用解決方案4778.7.2 耗時服務耗盡了線程池的案例4808.7.3 容錯重試機制引發服務雪崩的案例4818.8 深入剖析Dubbo源碼及其實現4838.8.1 Dubbo的總體架構設計4838.8.2 配置文件4868.8.3 Dubbo的核心RPC4888.8.4 Dubbo巧妙的URL總線設計4918.8.5 Dubbo的擴展點加載SPI4928.8.6 Dubbo服務暴露的過程4938.8.7 服務引用5028.8.8 集群容錯和負載均衡5038.8.9 集群容錯5048.8.10 負載均衡509第9章 高性能網絡中間件5129.1 TCP/UDP的核心原理及本質探索5139.1.1 網絡模型5139.1.2 UDP、IP及其未解決的問題5159.1.3 TCP詳解5199.1.4 是否可以用UDP代替TCP5279.1.5 網絡通信的不可靠性討論5299.2 網絡測試優秀實踐5309.2.1 網絡測試的關鍵點5309.2.2 那些必不可少的網絡測試工具5329.2.3 典型的測試報告5399.3 高性能網絡框架的設計與實現5449.3.1 對代理功能的測試及分析5459.3.2 網絡中間件的使用介紹5499.3.3 內存和緩存的優化5519.3.4 快速解析流數據554
本書以高可用服務架構為主題,側重於講解高可用架構設計的核心要點:可伸縮和可擴展,從應用層、數據庫、緩存、消息隊列、大數據查詢繫統、分布式定時任務調度繫統、微服務等層面詳細講解如何設計可伸縮、可擴展的框架,並給出在各個領域解決特定問題的方法論和實踐總結。隨著本書的出版,我們還開源了4個行之有效的互聯網可伸縮框架,包括數據庫分庫分表dbsplit、緩存分片redic、專業的發號器vesta和消息隊列處理機框架kclient,每個框架都開箱即用,也可以作為學習互聯網平臺化框架搭建的素材,更可以作為開發開源項目的示例。本書的上冊《分布式服務架構:原理、設計與實戰》詳細介紹了如何解決線上高並發服務的一致性、高性能、高可用、敏捷等痛點,本書與上冊結合後可覆蓋保證線上高並發服務的各個主題:一致性、高性能、高可用、可伸縮、可擴展、敏捷性等,每個主題都是一個方法論。充分理解這些主題,可保障線上服務健壯運行,等