Java 多線程與 Socket:實戰微服務框架
內容描述
本書從實戰角度出發,首先介紹Java多線程、Socket、Spring、動態代理、動態字節碼、序列化等技術在構建分佈式微服務框架中的應用。然後介紹一種微服務框架的架構設計與編程實踐,並將這一微服務框架分解為底層Socket通信、服務註冊與發現、服務暴露與引用、遠程方法調用等層面,逐一深入講解。這里重點介紹作者如何活用相關技術一步步地構建微服務框架的基礎RPC框架並分享了相應的性能調優經驗。最後介紹微服務架構中配套的服務治理系統的設計與實現方案,包括服務的設計、配置、管理與監控。
目錄大綱
第1章多線程基礎
1.1多線程的概念
1.1.1進程與線程
1.1.2並發與並行
1.1.3線程狀態
1.2 Thread線程類
1.2.1基本用法與思考
1.2.2常用方法介紹
1.2.3 wait和sleep的區別
1.2.4 sleep和yield的區別
1.3 Runnable接口
1.4線程池
1.4.1 Executors
1.4.2 ExecutorService
1.4.3 ThreadPoolExecutor
1.4.4基本用法與思考
1.5 Callable與Future
1.6線程安全與效率
1.6.1什麼是線程安全
1.6.2線程同步
1.6.3飢餓與公平
1.6.4鎖與死鎖
1.6.5線程中斷
1.7編程進階
1.7.1 volatile關鍵字
1.7.2 synchronized關鍵字
1.7.3 wait/notify/notifyAll
1.7 .4 CAS操作
1.7.5 atomic包
1.7.6 Lock自旋鎖
1.7.7 Condition條件變量
1.7.8線程安全容器
1.7.9 ThreadLocal類
1.7.10 CountDownLatch計數器
1.7.11 CyclicBarrier柵欄
1.7.12 Semaphore信號量
1.7.13 fork/join框架
第2章Socket基礎
2.1 TCP與Socket
2.2 TCP的通信過程
2.2. 1基本過程
2.2.2建立連接
2.2.3全雙工異步通信
2.2.4斷開連接
2.2.5優雅地斷開
2.2.6半……連接
2.3通信方式
2.3.1長連接與短連接
2.3.2線程模型
2.3.3拆包與組包
2.3.4斷包與粘包
2.3.5數據包的結構
2.4 BIO
2.4.1典型編程模型
2.4.2關鍵API概述
2.4.3字符流傳輸
2.4.4字節流傳輸
2.4.5傳輸多筆數據
2.5 NIO
2.5.1 NIO簡介
2.5.2 Buffer
2.5.3 Channel
2.5.4 Selector
2.5.5 Scatter/Gather
2.5.6 Pipe
2.5.7內存映像文件
2.5.8文件傳輸示例
2.5.9 “聊天室”示例
2.6 AIO
2.6.1 AIO簡介
2.6.2關鍵API概述
2.6.3示例代碼
第3章Spring與Spring Cloud
3.1 Spring簡介
3.2 IoC容器
3.2.1 IoC的概念
3.2.2 Spring中的bean
3.2.3 XML配置方式
3.2.4註解配置方式
3.2.5用Java類來配置
3.2.6 BeanFactory與FactoryBean
3.2.7 ApplicationContext與ApplicationContextAware
3.2.8動態註冊bean配置
3.2.9 ApplicationListener與容器事件
3.3 bean的基本配置
3.3.1 scope屬性
3.3.2 parent與abstract
3.3.3 factory-bean與factory-method
3.3.4 bean的初始化與釋放
3.4依賴注入
3.4.1 setter注入
3.4.2工廠方式註入
3.4.3構造器注入
3.4.4註解注入
3.5 Spring Boot
3.5.1快速創建工程
3.5.2編碼與測試
3.5.3打包部署
3.5.4輔助開發工具
3.5.5監控功能
3.6 Spring Cloud
3.6.1 Spring Cloud簡介
3.6.2架構設計
3.6.3創建應用
3.6.4服務的註冊與發現
3.6.5服務配置
3.6.6 Ribbon負載均衡
3.6.7 Feign服務調用
3.6.8 Hystrix
3.6.9 Zuul服務路由
3.6.10服務監控
第4章動態代理
4.1代理模式
4.2靜態代理
4.3類的裝載
4.4 Java反射
4.5 JDK動態代理
4.6 CGLIB動態代理
4.7 Java Compiler API
4.8 Javassist動態代理
第5章對象序列化
5.1什麼是序列化
5.2 Java序列化
5.2.1基本用法
5.2 .2關於serialVersionUID
5.2.3自定義序列化
5.2.4封裝實現代碼
5.3 Hessian序列化
5.4 Kryo序列化
5.5 FST序列化
5.6其他序列化組件
5.7集成與擴展
5.7.1優雅地集成
5.7.2使用Java SPI
5.7.3使用Spring
第6章框架設計
6.1總體結構
6.1.1邏輯架構
6.1.2框架設計概述
6.1.3 RPC原理
6.1.4工程結構
6.1.5依賴的jar包
6.1.6主要的類
6.2初始化過程
6.2.1 Spring配置
6.2.2應用節點的啟動
6.2.3 Web容器的啟動
6.2.4 RpcCore的初始化
6.2.5 RpcContext的初始化
6.3服務的暴露
6.3.1服務暴露配置
6.3.2方法配置與ID
6.3.3內置的服務方法
6.3.4服務提供方本地調用器
6.3.5服務提供方代理生成器
6.3.6註冊要暴露的服務
6.4服務的引用
6.4.1服務引用配置
6.4.2本地引用工廠類
6.4.3註冊本地引用工廠
6.4.4本地引用與方法ID
6.5服務的註冊與發現
6.5.1註冊表集合
6.5.2註冊表的同步
6.5.3註冊表的解析
6.5.4提交註冊表
6.5.5註冊表推送
6.5.6註冊表檢查
6.6優雅地停機
6.6.1停機的過程
6.6.2停機鉤子
6.6.3監聽Web容器的關閉
6.6.4 RpcCore的關閉
6.6.5停機通知的處理
第7章方法調用
7.1方法調用類型
7.2同步調用
7.2.1同步調用的時序
7.2.2同步調用的發起
7.2.3負載均衡
7.2.4指定服務提供者
7.2.5失敗轉移
7.2.6發送調用請求
7.2.7處理調用請求
7.2.8處理調用響應
7.3異步調用
7.3.1異步調用的時序
7.3.2異步調用的發起
7.3.3異步調用的執行
7.3.4方法調用對象
7.4同步/異步通知
7.5異步回調
7.6廣播調用與廣播通知
7.6.1廣播示例
7.6. 2廣播代碼
第8章通信層實現
8.1 Socket通信框架
8.1.1 Netty與Mina
8.1.2為什麼要自己寫
8.1.3是NIO還是AIO
8.1.4設計思路
8.1.5實際結構
8.2通信協議
8.2.1傳輸對象
8.2. 2數據包結構
8.2.3拆包與發送
8.2.4接收並組包
8.3連接的建立
8.3.1工作模型
8.3.2開始監聽
8.3.3發起連接
8.3.4綁定連接
8.3.5斷線檢測
第9章性能測試與調優
9.1性能調優概述
9.1.1性能指標
9.1.2性能瓶頸
9.1.3環境因素
9.2壓力測試
9.2.1測試方法
9.2.2場景設計
9.2.3測試環境
9.2.4 Dubbo配置
9.2.5測試程序
9.3線程池調優
9.3.1調整線程池的大小
9.3.2選擇合適的隊列
9.3.3線程的管理邏輯
9.3.4選擇拒絕策略
9.4優化線程同步
9.4.1減少上下文切換
9.4.2避免線程濫用
9.4.3避免過多的鎖
9.4.4 synchronized VS Lock
9.4.5縮小鎖的範圍和粒度
9.4.6線程分析工具
9.5 JVM調優
9.5.1堆與棧
9.5.2 JVM內存的分代
9.5.3 GC分類
9.5.4 GC算法
9.5.5分代GC
9.5.6對象的引用
9.5.7內存大小設置
9.5.8內存調優工具
9.6其他優化內容
9.6. 1避免使用反射
9.6.2對像池
9.6.3緩衝區隊列
9.6.4使用直接內存
9.6.5緩存其他對象
9.6.6協調與平衡
第10章服務治理
10.1服務治理概述
10.1.1什麼是服務治理
10.1 .2服務治理架構
10.1.3服務治理接口
10.2服務的定義
10.2.1服務識別
10.2.2接口定義
10.2.3版本管理
10.2.4協議適配
10.2.5服務設計
10.2.6服務的實現
10.2.7依賴關係管理
10.3服務的部署
10.3.1服務的部署方式
10.3.2自動化部署
10.3.3服務的熱部署
10.4註冊與發現
10.4.1 WSDL與UDDI
10.4.2 ZooKeeper的方案
10.4.3 Eureka的方案
10.4.4 Consul的方案
10.4.5 etcd的方案
10.4.6註冊中心集成方案
10.5服務的控制
10.5.1服務狀態
10.5.2服務控制
10.5.3服務開關
10.5.4服務模擬
10.5.5黑白名單
10.5 .6 “踢除”服務提供者
10.6監控與限流
10.6.1 TPS監控與限流
10.6.2響應時間的監控
10.6.3調用鏈的監控
10.6.4資源監控
作者介紹
IBM高級諮詢架構師,擁有16年以上各種類型軟件系統的開發經驗。擅長分佈式與微服務架構的設計和開發。