深入浅出地剖析了高并发IO的底层原理。
图文并茂地介绍了TCP、HTTP、WebSocket协议的核心原理。
细致深入地揭秘了Reactor高性能模式。
全面介绍了Netty框架,并完成单体IM、分布式IM的实战设计。
详尽地介绍了ZooKeeper、Redis的使用。
第1章 高并发时代的必备技能 1
1.1 Netty为何这么火 1
1.1.1 Netty火热的程度 1
1.1.2 Netty是面试的必杀器 2
1.2 高并发利器Redis 2
1.2.1 什么是Redis 2
1.2.2 Redis成为缓存事实标准的原因 3
1.3 分布式利器ZooKeeper 3
1.3.1 什么是ZooKeeper 3
1.3.2 ZooKeeper的优势 4
1.4 高性能HTTP通信技术 4
1.4.1 十万级以上高并发场景中的高并发HTTP通信技术 4
1.4.2 微服务之间的高并发RPC技术 6
1.5 高并发IM的综合实践 7
1.5.1 高并发IM的学习价值 8
1.5.2 庞大的应用场景 8
第2章 高并发IO的底层原理 9
2.1 IO读写的基础原理 9
2.1.1 内核缓冲区与进程缓冲区 10
2.1.2 典型IO系统调用sys_read和sys_write的执行流程 10
2.2 5种主要的IO模型 13
2.2.1 同步阻塞IO 14
2.2.2 同步非阻塞IO 15
2.2.3 IO多路复用模型 16
2.2.4 信号驱动IO模型 18
2.2.5 异步IO模型 21
2.2.6 同步和异步、阻塞和非阻塞的区别与联系 22
2.3 通过合理配置来支持百万级并发连接 22
第3章 Java NIO核心详解 25
3.1 Java NIO的起源 25
3.2 Java NIO简介 28
3.2.1 NIO和OIO的对比 28
3.2.2 通道 29
3.2.3 理解Channel的抽象概念 29
3.2.4 选择器 31
3.2.5 缓冲区 32
3.3 详解NIO Buffer类及其属性 33
3.3.1 Buffer类 33
3.3.2 Buffer类的重要属性 33
3.3.3 Buffer的4个属性总结 35
3.4 详解NIO Buffer类的重要方法 36
3.4.1 allocate() 36
3.4.2 put() 37
3.4.3 flip() 38
3.4.4 get() 39
3.4.5 rewind() 40
3.4.6 mark()和reset() 42
3.4.7 clear() 43
3.4.8 使用Buffer类的基本步骤 44
3.5 详解NIO Channel类 44
3.5.1 Channel的主要类型 44
3.5.2 FileChannel 44
3.5.3 使用FileChannel完成文件复制的实战案例 46
3.5.4 SocketChannel 48
3.5.5 使用SocketChannel发送文件的实战案例 49
3.5.6 DatagramChannel 51
3.5.7 使用DatagramChannel发送数据的实战案例 53
3.6 详解NIO Selector 54
3.6.1 选择器以及注册 54
3.6.2 SelectableChannel 55
3.6.3 SelectionKey 56
3.6.4 选择器的使用流程 57
3.6.5 使用NIO实现Discard服务器的实战案例 59
3.6.6 使用SocketChannel在服务端接收文件的实战案例 61
第4章 鼎鼎大名的Reactor模式 67
4.1 Reactor模式的重要性 67
4.1.1 为什么首先学习Reactor模式 67
4.1.2 Reactor模式简介 68
4.1.3 多线程OIO的致命缺陷 69
4.2 单线程Reactor模式 70
4.2.1 什么是单线程Reactor 70
4.2.2 单线程Reactor的参考代码 71
4.2.3 单线程Reactor模式的EchoServer实战案例 73
4.2.4 单线程Reactor模式的缺点 76
4.3 多线程Reactor模式 76
4.3.1 多线程版本的Reactor模式演进 76
4.3.2 多线程版本的Reactor实战案例 77
4.3.3 多线程版本Handler的实战案例 80
4.4 Reactor模式的优缺点 82
第5章 Netty核心原理与基础实战 83
5.1 第一个Netty的实战案例DiscardServer 83
5.1.1 创建第一个Netty项目 83
5.1.2 第一个Netty服务端程序 84
5.1.3 业务处理器NettyDiscardHandler 85
5.1.4 运行NettyDiscardServer 86
5.2 解密Netty的Reactor模式 87
5.2.1 回顾Reactor模式中IO事件的处理流程 87
5.2.2 Netty中的Channel 88
5.2.3 Netty中的Reactor 89
5.2.4 Netty中的Handler 90
5.2.5 Netty中的Pipeline 92
5.3 详解Bootstrap 93
5.3.1 父子通道 93
5.3.2 EventLoopGroup 94
5.3.3 Bootstrap的启动流程 95
5.3.4 ChannelOption 98
5.4 详解Channel 99
5.4.1 Channel的主要成员和方法 100
5.4.2 EmbeddedChannel 101
5.5 详解Handler 102
5.5.1 ChannelInboundHandler入站处理器 103
5.5.2 ChannelOutboundHandler出站处理器 104
5.5.3 ChannelInitializer通道初始化处理器 105
5.5.4 ChannelInboundHandler的生命周期的实战案例 106
5.6 详解Pipeline 108
5.6.1 Pipeline入站处理流程 109
5.6.2 Pipeline出站处理流程 110
5.6.3 ChannelHandlerContext 112
5.6.4 HeadContext与TailContext 112
5.6.5 Pipeline入站和出站的双向链接操作 114
5.6.6 截断流水线的入站处理传播过程 117
5.6.7 在流水线上热插拔Handler 119
5.7 详解ByteBuf 121
5.7.1 ByteBuf的优势 121
5.7.2 ByteBuf的组成部分 121
5.7.3 ByteBuf的重要属性 122
5.7.4 ByteBuf的方法 122
5.7.5 ByteBuf基本使用的实战案例 123
5.7.6 ByteBuf的自动扩容 125
5.7.7 ByteBuf的引用计数 126
5.7.8 ByteBuf的分配器 128
5.7.9 ByteBuf缓冲区的类型 130
5.7.10 两类ByteBuf使用的实战案例 131
5.7.11 ByteBuf的自动创建与自动释放 134
5.7.12 ByteBuffer的释放原则 139
5.7.13 ByteBuf浅层复制的高级使用方式 139
5.8 Netty的零拷贝 141
5.8.1 通过CompositeByteBuf实现零拷贝 142
5.8.2 通过wrap操作实现零拷贝 144
5.8.3 ByteBuf的核心优势小结 145
5.9 EchoServer实战案例 145
5.9.1 NettyEchoServer 145
5.9.2 共享NettyEchoServerHandler处理器 146
5.9.3 NettyEchoClient客户端代码 147
5.9.4 NettyEchoClientHandler 149
第6章 Decoder与Encoder核心组件 150
6.1 详解粘包和拆包 150
6.1.1 半包问题的实战案例 151
6.1.2 什么是半包问题 152
6.1.3 半包问题的根因分析 153
6.2 Decoder原理与实践 154
6.2.1 ByteToMessageDecoder解码器处理流程 154
6.2.2 自定义Byte2IntegerDecoder整数解码器 155
6.2.3 ReplayingDecoder解码器 157
6.2.4 整数的分包解码器的实战案例 158
6.2.5 字符串的分包解码器的实战案例 161
6.2.6 MessageToMessageDecoder解码器 165
6.3 常用的内置Decoder 166
6.3.1 LineBasedFrameDecoder解码器 166
6.3.2 DelimiterBasedFrameDecoder解码器 167
6.3.3 LengthFieldBasedFrameDecoder解码器 168
6.3.4 多字段Head-Content协议数据帧解析的实战案例 170
6.4 Encoder的原理与实战 173
6.4.1 MessageToByteEncoder编码器 173
6.4.2 MessageToMessageEncoder编码器 174
6.5 解码器和编码器的结合 176
6.5.1 ByteToMessageCodec编解码器 176
6.5.2 CombinedChannelDuplexHandler组合器 177
第7章 序列化与反序列化:JSON和Protobuf 178
7.1 使用JSON协议通信 179
7.1.1 JSON的核心优势 179
7.1.2 JSON序列化与反序列化开源库 180
7.1.3 JSON序列化与反序列化实战案例 181
7.1.4 通过Strategy模式完成不同JSON开源库的切换 182
7.1.5 JSON传输的编码器和解码器 184
7.1.6 JSON传输的服务端实战案例 185
7.1.7 JSON传输的客户端实战案例 186
7.2 使用Protobuf协议通信 187
7.2.1 一个简单的proto文件实战案例 188
7.2.2 通过控制台命令生成POJO和Builder 188
7.2.3 通过Maven插件生成POJO和Builder 189
7.2.4 Protobuf序列化与反序列化演示案例 190
7.3 Protobuf编解码的实战案例 192
7.3.1 Netty内置的Protobuf基础编码器和解码器 192
7.3.2 Protobuf传输的服务端实战案例 194
7.3.3 Protobuf传输的客户端实战案例 195
7.4 详解Protobuf协议语法 196
7.4.1 proto文件的头部声明 196
7.4.2 Protobuf的消息结构体与消息字段 198
7.4.3 Protobuf字段的数据类型 199
7.4.4 proto文件的其他语法规范 200
7.5 序列化、反序列、编码和解码之间的关系 201
7.5.1 序列化和反序列的本源 201
7.5.2 编码和解码的原理 203
第8章 Netty单体IM系统开发实战 206
8.1 自定义Protobuf编码器和解码器 206
8.2 概述IM的登录流程 210
8.3 客户端登录处理实战案例 212
8.4 服务端登录响应实战案例 220
8.5 详解Session服务器会话 226
8.6 点对点单聊实战案例 229
8.7 详解心跳检测 234
第9章 HTTP原理与Web服务器实战 238
9.1 高性能Web应用的架构 238
9.2 详解HTTP应用层协议 243
9.3 HTTP的演进 251
9.4 基于Netty实现简单的Web服务器 259
第10章 高并发HTTP通信的核心原理 273
10.1 需要进行HTTP连接复用的高并发场景 273
10.2 传输层TCP详解 275
10.3 TCP连接状态的原理与实验 288
10.4 HTTP长连接的原理 291
10.5 服务端HTTP长连接技术 293
10.6 客户端HTTP长连接技术原理与实验 299
第11章 WebSocket原理与实战 315
11.1 WebSocket协议简介 315
11.2 WebSocket回显演示程序开发 317
11.3 WebSocket协议通信的原理 324
第12章 SSL/TLS核心原理与实战 331
12.1 什么是SSL/TLS 331
12.2 加密算法原理与实战 334
12.3 SSL/TLS运行过程 346
12.4 详解Keytool工具 354
12.5 使用Java程序管理密钥和证书 361
12.6 OIO通信中SSL/TLS实战 370
12.7 单向认证与双向认证 376
12.8 Netty通信中SSL/TLS的使用 385
12.9 HTTPS安全通信实战 391
第13章 ZooKeeper分布式协调 395
13.1 ZooKeeper伪集群安装与配置 395
13.2 使用ZooKeeper进行分布式存储 401
13.3 ZooKeeper应用开发实战 404
13.4 分布式命名服务实战 412
13.5 分布式事件监听的重点 422
13.6 分布式锁的原理与实战 434
第14章 分布式缓存Redis实战 446
14.1 Redis入门 446
14.2 Redis数据类型 451
14.3 Jedis基础编程的实战案例 456
14.4 JedisPool连接池的实战案例 464
14.5 使用spring-data-redis完成CRUD的实战案例 469
14.6 Spring的Redis缓存注解 478
14.7 详解SpEL 484
第15章 亿级高并发IM架构与实战 489
15.1 支撑亿级用户的高并发IM架构的理论基础 489
15.2 分布式IM的命名服务的实战案例 492
15.3 Worker集群的负载均衡的实战案例 496
15.4 即时通信消息的路由和转发的实战案例 499
15.5 分布式的在线用户统计的实战案例 503