第1章 多线程基础 1
1.1 多线程的概念 1
1.1.1 进程与线程 1
1.1.2 并发与并行 2
1.1.3 线程状态 2
1.2 Thread线程类 3
1.2.1 基本用法与思考 3
1.2.2 常用方法介绍 4
1.2.3 wait和sleep的区别 5
1.2.4 sleep和yield的区别 5
1.3 Runnable接口 6
1.4 线程池 6
1.4.1 Executors 6
1.4.2 ExecutorService 7
1.4.3 ThreadPoolExecutor 8
1.4.4 基本用法与思考 9
1.5 Callable与Future 10
1.6 线程安全与效率 11
1.6.1 什么是线程安全 11
1.6.2 线程同步 13
1.6.3 饥饿与公平 14
1.6.4 锁与死锁 14
1.6.5 线程中断 15
1.7 编程进阶 16
1.7.1 volatile关键字 16
1.7.2 synchronized关键字 19
1.7.3 wait/notify/notifyAll 21
1.7.4 CAS操作 22
1.7.5 atomic包 24
1.7.6 Lock自旋锁 25
1.7.7 Condition条件变量 28
1.7.8 线程安全容器 30
1.7.9 ThreadLocal类 32
1.7.10 CountDownLatch计数器 33
1.7.11 CyclicBarrier栅栏 34
1.7.12 Semaphore信号量 35
1.7.13 fork/join框架 36
第2章 Socket基础 40
2.1 TCP与Socket 40
2.2 TCP的通信过程 41
2.2.1 基本过程 41
2.2.2 建立连接 42
2.2.3 全双工异步通信 43
2.2.4 断开连接 44
2.2.5 优雅地断开 45
2.2.6 半……连接 45
2.3 通信方式 45
2.3.1 长连接与短连接 46
2.3.2 线程模型 47
2.3.3 拆包与组包 49
2.3.4 断包与粘包 51
2.3.5 数据包的结构 52
2.4 BIO 52
2.4.1 典型编程模型 53
2.4.2 关键API概述 53
2.4.3 字符流传输 54
2.4.4 字节流传输 59
2.4.5 传输多笔数据 62
2.5 NIO 66
2.5.1 NIO简介 66
2.5.2 Buffer 67
2.5.3 Channel 70
2.5.4 Selector 73
2.5.5 Scatter/Gather 75
2.5.6 Pipe 76
2.5.7 内存映像文件 76
2.5.8 文件传输示例 78
2.5.9 “聊天室”示例 84
2.6 AIO 93
2.6.1 AIO简介 93
2.6.2 关键API概述 94
2.6.3 示例代码 95
第3章 Spring与Spring Cloud 104
3.1 Spring简介 104
3.2 IoC容器 105
3.2.1 IoC的概念 105
3.2.2 Spring中的bean 106
3.2.3 XML配置方式 106
3.2.4 注解配置方式 107
3.2.5 用Java类来配置 109
3.2.6 BeanFactory与FactoryBean 110
3.2.7 ApplicationContext与ApplicationContextAware 112
3.2.8 动态注册bean配置 113
3.2.9 ApplicationListener与容器事件 114
3.3 bean的基本配置 116
3.3.1 scope属性 116
3.3.2 parent与abstract 116
3.3.3 factory-bean与factory-method 117
3.3.4 bean的初始化与释放 118
3.4 依赖注入 118
3.4.1 setter注入 118
3.4.2 工厂方式注入 123
3.4.3 构造器注入 124
3.4.4 注解注入 125
3.5 Spring Boot 126
3.5.1 快速创建工程 127
3.5.2 编码与测试 129
3.5.3 打包部署 130
3.5.4 辅助开发工具 131
3.5.5 监控功能 131
3.6 Spring Cloud 132
3.6.1 Spring Cloud简介 132
3.6.2 架构设计 134
3.6.3 创建应用 135
3.6.4 服务的注册与发现 136
3.6.5 服务配置 138
3.6.6 Ribbon负载均衡 140
3.6.7 Feign服务调用 141
3.6.8 Hystrix 142
3.6.9 Zuul服务路由 145
3.6.10 服务监控 146
第4章 动态代理 152
4.1 代理模式 152
4.2 静态代理 154
4.3 类的装载 155
4.4 Java反射 157
4.5 JDK动态代理 162
4.6 CGLIB动态代理 163
4.7 Java Compiler API 164
4.8 Javassist动态代理 170
第5章 对象序列化 173
5.1 什么是序列化 173
5.2 Java序列化 176
5.2.1 基本用法 176
5.2.2 关于serialVersionUID 179
5.2.3 自定义序列化 180
5.2.4 封装实现代码 182
5.3 Hessian序列化 183
5.4 Kryo序列化 186
5.5 FST序列化 190
5.6 其他序列化组件 192
5.7 集成与扩展 193
5.7.1 优雅地集成 193
5.7.2 使用Java SPI 194
5.7.3 使用Spring 196
第6章 框架设计 197
6.1 总体结构 197
6.1.1 逻辑架构 197
6.1.2 框架设计概述 199
6.1.3 RPC原理 202
6.1.4 工程结构 203
6.1.5 依赖的jar包 205
6.1.6 主要的类 206
6.2 初始化过程 208
6.2.1 Spring配置 208
6.2.2 应用节点的启动 210
6.2.3 Web容器的启动 212
6.2.4 RpcCore的初始化 213
6.2.5 RpcContext的初始化 216
6.3 服务的暴露 218
6.3.1 服务暴露配置 218
6.3.2 方法配置与ID 220
6.3.3 内置的服务方法 221
6.3.4 服务提供方本地调用器 224
6.3.5 服务提供方代理生成器 225
6.3.6 注册要暴露的服务 231
6.4 服务的引用 233
6.4.1 服务引用配置 233
6.4.2 本地引用工厂类 234
6.4.3 注册本地引用工厂 235
6.4.4 本地引用与方法ID 236
6.5 服务的注册与发现 238
6.5.1 注册表集合 238
6.5.2 注册表的同步 239
6.5.3 注册表的解析 241
6.5.4 提交注册表 242
6.5.5 注册表推送 245
6.5.6 注册表检查 247
6.6 优雅地停机 249
6.6.1 停机的过程 249
6.6.2 停机钩子 250
6.6.3 监听Web容器的关闭 251
6.6.4 RpcCore的关闭 253
6.6.5 停机通知的处理 256
第7章 方法调用 258
7.1 方法调用类型 258
7.2 同步调用 260
7.2.1 同步调用的时序 260
7.2.2 同步调用的发起 263
7.2.3 负载均衡 265
7.2.4 指定服务提供者 267
7.2.5 失败转移 268
7.2.6 发送调用请求 269
7.2.7 处理调用请求 271
7.2.8 处理调用响应 276
7.3 异步调用 277
7.3.1 异步调用的时序 277
7.3.2 异步调用的发起 278
7.3.3 异步调用的执行 280
7.3.4 方法调用对象 280
7.4 同步/异步通知 286
7.5 异步回调 289
7.6 广播调用与广播通知 290
7.6.1 广播示例 290
7.6.2 广播代码 291
第8章 通信层实现 294
8.1 Socket通信框架 294
8.1.1 Netty与Mina 294
8.1.2 为什么要自己写 295
8.1.3 是NIO还是AIO 296
8.1.4 设计思路 297
8.1.5 实际结构 298
8.2 通信协议 300
8.2.1 传输对象 300
8.2.2 数据包结构 301
8.2.3 拆包与发送 302
8.2.4 接收并组包 309
8.3 连接的建立 317
8.3.1 工作模型 317
8.3.2 开始监听 318
8.3.3 发起连接 320
8.3.4 绑定连接 323
8.3.5 断线检测 325
第9章 性能测试与调优 329
9.1 性能调优概述 329
9.1.1 性能指标 329
9.1.2 性能瓶颈 331
9.1.3 环境因素 332
9.2 压力测试 333
9.2.1 测试方法 333
9.2.2 场景设计 334
9.2.3 测试环境 334
9.2.4 Dubbo配置 335
9.2.5 测试程序 336
9.3 线程池调优 338
9.3.1 调整线程池的大小 338
9.3.2 选择合适的队列 341
9.3.3 线程的管理逻辑 342
9.3.4 选择拒绝策略 344
9.4 优化线程同步 345
9.4.1 减少上下文切换 345
9.4.2 避免线程滥用 346
9.4.3 避免过多的锁 348
9.4.4 synchronized VS Lock 350
9.4.5 缩小锁的范围和粒度 350
9.4.6 线程分析工具 352
9.5 JVM调优 353
9.5.1 堆与栈 353
9.5.2 JVM内存的分代 353
9.5.3 GC分类 355
9.5.4 GC算法 356
9.5.5 分代GC 356
9.5.6 对象的引用 359
9.5.7 内存大小设置 359
9.5.8 内存调优工具 361
9.6 其他优化内容 364
9.6.1 避免使用反射 364
9.6.2 对象池 367
9.6.3 缓冲区队列 370
9.6.4 使用直接内存 370
9.6.5 缓存其他对象 371
9.6.6 协调与平衡 372
第10章 服务治理 374
10.1 服务治理概述 374
10.1.1 什么是服务治理 374
10.1.2 服务治理架构 375
10.1.3 服务治理接口 376
10.2 服务的定义 377
10.2.1 服务识别 377
10.2.2 接口定义 378
10.2.3 版本管理 379
10.2.4 协议适配 383
10.2.5 服务设计 384
10.2.6 服务的实现 385
10.2.7 依赖关系管理 387
10.3 服务的部署 387
10.3.1 服务的部署方式 387
10.3.2 自动化部署 388
10.3.3 服务的热部署 390
10.4 注册与发现 391
10.4.1 WSDL与UDDI 391
10.4.2 ZooKeeper的方案 391
10.4.3 Eureka的方案 393
10.4.4 Consul的方案 394
10.4.5 etcd的方案 395
10.4.6 注册中心集成方案 396
10.5 服务的控制 397
10.5.1 服务状态 397
10.5.2 服务控制 399
10.5.3 服务开关 403
10.5.4 服务模拟 405
10.5.5 黑白名单 410
10.5.6 “踢除”服务提供者 416
10.6 监控与限流 421
10.6.1 TPS监控与限流 421
10.6.2 响应时间的监控 429
10.6.3 调用链的监控 430
10.6.4 资源监控 432