本书从操作系统底层的IO原理入手,提供了高性能开发的实际案例是一本Java高并发编程的基本原理和实用书籍。
本书共分为15章。第1~4章为高并发基础,浅显易懂地剖析高并发IO的底层原理,细致地讲解Reactor高性能模式,图文并茂地介绍Java异步回调模式。这些原理方面的基础知识非常重要,会为读者打下坚实的基础,也是日常开发Java后台应用时解决实际问题的金钥匙。第5~8章为Netty原理和实战,是本书的重中之重,主要介绍高性能通信框架Netty、Netty的重要组件、单体IM的实战设计和模块实现。第9~12章从TCP、HTTP入手,介绍客户端与服务端、服务端与服务端之间的高性能HTTP通信和WebSocket通信。第13~15章对ZooKeeper、Curator API、Redis、Jedis API的使用进行详尽的说明,以提升读者设计和开发高并发、可扩展系统的能力。
封面图
目录
- 前言
- 自序
- 第1章 高并发时代的必备技能1
- 1.1 Netty为何这么火1
- 1.1.1 Netty火热的程度1
- 1.1.2 Netty是面试的必杀器2
- 1.2 高并发利器Redis2
- 1.2.1 什么是Redis2
- 1.2.2 Redis成为缓存事实标准的原因3
- 1.3 分布式利器ZooKeeper3
- 1.3.1 什么是ZooKeeper3
- 1.3.2 ZooKeeper的优势4
- 1.4 高性能HTTP通信技术4
- 1.4.1 十万级以上高并发场景中的高并发HTTP通信技术5
- 1.4.2 微服务之间的高并发RPC技术6
- 1.5 高并发IM的综合实战7
- 1.5.1 高并发IM的学习价值8
- 1.5.2 庞大的应用场景8
- 第2章 高并发IO的底层原理10
- 2.1 IO读写的基本原理10
- 2.1.1 内核缓冲区与进程缓冲区11
- 2.1.2 典型的系统调用流程11
- 2.2 四种主要的IO模型13
- 2.2.1 同步阻塞IO14
- 2.2.2 同步非阻塞IO15
- 2.2.3 IO多路复用16
- 2.2.4 异步IO17
- 2.3 通过合理配置来支持百万级并发连接18
- 第3章 Java NIO核心详解21
- 3.1 Java NIO简介21
- 3.1.1 NIO和OIO的对比21
- 3.1.2 通道22
- 3.1.3 选择器22
- 3.1.4 缓冲区23
- 3.2 详解NIO Buffer类及其属性23
- 3.2.1 Buffer类23
- 3.2.2 Buffer类的重要属性23
- 3.3 详解NIO Buffer类的重要方法26
- 3.3.1 allocate()26
- 3.3.2 put()27
- 3.3.3 flip()27
- 3.3.4 get()29
- 3.3.5 rewind()30
- 3.3.6 mark()和reset()32
- 3.3.7 clear()33
- 3.3.8 使用Buffer类的基本步骤34
- 3.4 详解NIO Channel类34
- 3.4.1 FileChannel35
- 3.4.2 使用FileChannel完成文件复制的实战案例37
- 3.4.3 SocketChannel39
- 3.4.4 使用SocketChannel发送文件的实战案例41
- 3.4.5 DatagramChannel43
- 3.4.6 使用DatagramChannel发送数据的实战案例45
- 3.5 详解NIO Selector47
- 3.5.1 选择器与注册47
- 3.5.2 SelectableChannel48
- 3.5.3 SelectionKey48
- 3.5.4 选择器使用流程48
- 3.5.5 使用NIO实现Discard服务器的实战案例50
- 3.5.6 使用SocketChannel在服务端接收文件的实战案例53
- 第4章 鼎鼎大名的Reactor模式59
- 4.1 Reactor模式的重要性59
- 4.1.1 为什么首先学习Reactor模式59
- 4.1.2 Reactor模式简介60
- 4.1.3 多线程OIO的致命缺陷60
- 4.2 单线程Reactor模式62
- 4.2.1 什么是单线程Reactor62
- 4.2.2 单线程Reactor的参考代码63
- 4.2.3 单线程Reactor模式的EchoServer的实战案例66
- 4.2.4 单线程Reactor模式的缺点69
- 4.3 多线程Reactor模式69
- 4.3.1 多线程版本的Reactor模式演进69
- 4.3.2 多线程版本Reactor的实战案例69
- 4.3.3 多线程版本Handler的实战案例72
- 4.4 Reactor模式的优缺点74
- 第5章 Netty核心原理与基础实战76
- 5.1 第一个Netty实战案例DiscardServer76
- 5.1.1 创建第一个Netty项目76
- 5.1.2 第一个Netty服务端程序77
- 5.1.3 业务处理器NettyDiscardHandler79
- 5.1.4 运行NettyDiscardServer80
- 5.2 解密Netty中的Reactor模式80
- 5.2.1 回顾Reactor模式中IO事件的处理流程81
- 5.2.2 Netty中的Channel81
- 5.2.3 Netty中的Reactor82
- 5.2.4 Netty中的Handler83
- 5.2.5 Netty中的Pipeline84
- 5.3 详解Bootstrap86
- 5.3.1 父子通道86
- 5.3.2 EventLoopGroup87
- 5.3.3 Bootstrap启动流程88
- 5.3.4 ChannelOption91
- 5.4 详解Channel93
- 5.4.1 Channel的主要成员和方法93
- 5.4.2 EmbeddedChannel94
- 5.5 详解Handler95
- 5.5.1 ChannelInboundHandler入站处理器96
- 5.5.2 ChannelOutboundHandler出站处理器97
- 5.5.3 ChannelInitializer通道初始化处理器99
- 5.5.4 ChannelInboundHandler的生命周期的实战案例99
- 5.6 详解Pipeline103
- 5.6.1 Pipeline入站处理流程103
- 5.6.2 Pipeline出站处理流程104
- 5.6.3 ChannelHandlerContext106
- 5.6.4 HeadContext与TailContext107
- 5.6.5 Pipeline入站和出站的双向链接操作109
- 5.6.6 截断流水线的入站处理传播过程112
- 5.6.7 在流水线上热插拔Handler114
- 5.7 详解ByteBuf117
- 5.7.1 ByteBuf的优势117
- 5.7.2 ByteBuf的组成部分117
- 5.7.3 ByteBuf的重要属性118
- 5.7.4 ByteBuf的方法118
- 5.7.5 ByteBuf基本使用的实战案例120
- 5.7.6 ByteBuf的引用计数122
- 5.7.7 ByteBuf的分配器124
- 5.7.8 ByteBuf缓冲区的类型126
- 5.7.9 两类ByteBuf使用的实战案例127
- 5.7.10 ByteBuf的自动创建与自动释放130
- 5.7.11 ByteBuf浅层复制的高级使用方式136
- 5.8 Netty的零拷贝138
- 5.8.1 通过CompositeByteBuf实现零拷贝139
- 5.8.2 通过wrap操作实现零拷贝141
- 5.9 EchoServer的实战案例142
- 5.9.1 NettyEchoServer142
- 5.9.2 NettyEchoServerHandler143
- 5.9.3 NettyEchoClient144
- 5.9.4 NettyEchoClientHandler146
- 第6章 Decoder与Encoder核心组件148
- 6.1 Decoder原理与实战148
- 6.1.1 ByteToMessageDecoder解码器处理流程148
- 6.1.2 自定义Byte2IntegerDecoder整数解码器149
- 6.1.3 ReplayingDecoder解码器152
- 6.1.4 整数的分包解码器的实战案例153
- 6.1.5 字符串的分包解码器的实战案例156
- 6.1.6 MessageToMessageDecoder解码器161
- 6.2 常用的内置Decoder161
- 6.2.1 LineBasedFrameDecoder解码器162
- 6.2.2 DelimiterBasedFrameDecoder解码器163
- 6.2.3 LengthFieldBasedFrameDecoder解码器164
- 6.2.4 多字段Head-Content协议数据包解析的实战案例167
- 6.3 Encoder原理与实战170
- 6.3.1 MessageToByteEncoder编码器170
- 6.3.2 MessageToMessageEncoder编码器171
- 6.4 解码器和编码器的结合173
- 6.4.1 ByteToMessageCodec编解码器173
- 6.4.2 CombinedChannelDuplexHandler组合器174
- 第7章 序列化与反序列化:JSON和Protobuf176
- 7.1 详解粘包和拆包177
- 7.1.1 半包问题的实战案例177
- 7.1.2 什么是半包问题179
- 7.1.3 半包问题的根因分析179
- 7.2 使用JSON协议通信180
- 7.2.1 JSON的核心优势180
- 7.2.2 JSON序列化与反序列化开源库181
- 7.2.3 JSON序列化与反序列化的实战案例182
- 7.2.4 JSON传输的编码器和解码器184
- 7.2.5 JSON传输的服务端的实战案例185
- 7.2.6 JSON传输的客户端的实战案例186
- 7.3 使用Protobuf协议通信188
- 7.3.1 一个简单的proto文件的实战案例188
- 7.3.2 通过控制台命令生成POJO和Builder189
- 7.3.3 通过Maven插件生成POJO和Builder190
- 7.3.4 Protobuf序列化与反序列化的实战案例191
- 7.4 Protobuf编解码的实战案例194
- 7.4.1 Netty内置的Protobuf基础编码器/解码器194
- 7.4.2 Protobuf传输的服务端的实战案例195
- 7.4.3 Protobuf传输的客户端的实战案例197
- 7.5 详解Protobuf协议语法198
- 7.5.1 proto文件的头部声明199
- 7.5.2 Protobuf的消息结构体与消息字段200
- 7.5.3 Protobuf字段的数据类型201
- 7.5.4 proto文件的其他语法规范202
- 第8章 基于Netty单体IM系统的开发实战204
- 8.1 自定义Protobuf编解码器204
- 8.1.1 自定义Protobuf编码器205
- 8.1.2 自定义Protobuf解码器206
- 8.1.3 IM系统中Protobuf消息格式的设计207
- 8.2 IM的登录流程209
- 8.2.1 图解登录/响应流程的环节209
- 8.2.2 客户端涉及的主要模块210
- 8.2.3 服务端涉及的主要模块210
- 8.3 客户端的登录处理的实战案例211
- 8.3.1 LoginConsoleCommand和User POJO212
- 8.3.2 LoginSender213
- 8.3.3 ClientSession216
- 8.3.4 LoginResponseHandler218
- 8.3.5 客户端流水线的装配219
- 8.4 服务端的登录响应的实战案例220
- 8.4.1 服务端流水线的装配220
- 8.4.2 LoginRequestHandler221
- 8.4.3 LoginProcesser223
- 8.4.4 EventLoop线程和业务线程相互隔离224
- 8.5 详解Session服务器会话227
- 8.5.1 通道的容器属性227
- 8.5.2 ServerSession服务端会话类229
- 8.5.3 SessionMap会话管理器230
- 8.6 点对点单聊的实战案例230
- 8.6.1 单聊的端到端流程231
- 8.6.2 客户端的ChatConsoleCommand收集聊天内容231
- 8.6.3 客户端的CommandController发送POJO232
- 8.6.4 服务端的ChatRedirectHandler进行消息转发233
- 8.6.5 服务端的ChatRedirectProcesser进行异步消息转发234
- 8.6.6 客户端的ChatMsgHandler聊天消息处理器235
- 8.7 详解心跳检测236
- 8.7.1 网络连接的假死现象236
- 8.7.2 服务端的空闲检测237
- 8.7.3 客户端的心跳发送238
- 第9章 HTTP原理与Web服务器实战241
- 9.1 高性能Web应用架构241
- 9.1.1 十万级并发的Web应用架构241
- 9.1.2 千万级高并发的Web应用架构243
- 9.2 详解HTTP应用层协议246
- 9.2.1 HTTP简介247
- 9.2.2 HTTP的请求URL248
- 9.2.3 HTTP的请求报文248
- 9.2.4 HTTP的响应报文251
- 9.2.5 HTTP中GET和POST的区别254
- 9.3 HTTP的演进254
- 9.3.1 HTTP的1.0版本255
- 9.3.2 HTTP的1.1版本258
- 9.3.3 HTTP的2.0版本261
- 9.4 基于Netty实现简单的Web服务器263
- 9.4.1 基于Netty的HTTP服务器演示实例263
- 9.4.2 基于Netty的HTTP请求的处理流程264
- 9.4.3 Netty内置的HTTP报文解码流程266
- 9.4.4 基于Netty的HTTP响应编码流程268
- 9.4.5 HttpEchoHandler回显业务处理器的实战案例269
- 9.4.6 使用Postman发送多种类型的请求体273
- 第10章 高并发HTTP通信的核心原理278
- 10.1 需要进行HTTP连接复用的高并发场景278
- 10.1.1 反向代理Nginx与Java Web应用服务之间的HTTP 高并发通信278
- 10.1.2 微服务网关与微服务Provider实例之间的HTTP高并发通信279
- 10.1.3 分布式微服务Provider实例之间的RPC的HTTP高并发通信280
- 10.1.4 Java通过HTTP客户端访问REST接口服务的HTTP 高并发通信280
- 10.2 详解传输层TCP281
- 10.2.1 TCP/IP的分层模型281
- 10.2.2 HTTP报文传输原理283
- 10.2.3 TCP的报文格式285
- 10.2.4 TCP的三次握手288
- 10.2.5 TCP的四次挥手290
- 10.2.6 三次握手、四次挥手的常见面试题292
- 10.3 TCP连接状态的原理与实验293
- 10.3.1 TCP/IP连接的11种状态293
- 10.3.2 通过netstat指令查看连接状态295
- 10.4 HTTP长连接原理297
- 10.4.1 HTTP长连接和短连接297
- 10.4.2 不同HTTP版本中的长连接选项298
- 10.5 服务端HTTP长连接技术299
- 10.5.1 应用服务器Tomcat的长连接配置299
- 10.5.2 Nginx承担服务端角色时的长连接配置302
- 10.5.3 服务端长连接设置的注意事项304
- 10.6 客户端HTTP长连接技术原理与实验306
- 10.6.1 HttpURLConnection短连接技术306
- 10.6.2 HTTP短连接的通信实验309
- 10.6.3 Apache HttpClient客户端的HTTP长连接技术311
- 10.6.4 Apache HttpClient客户端长连接实验319
- 10.6.5 Nginx承担客户端角色时的长连接技术323
- 第11章 WebSocket原理与实战326
- 11.1 WebSocket协议简介326
- 11.1.1 Ajax短轮询和Long Poll长轮询的原理327
- 11.1.2 WebSocket与HTTP之间的关系327
- 11.2 WebSocket回显演示程序开发328
- 11.2.1 WebSocket回显程序的客户端代码328
- 11.2.2 WebSocket相关的Netty内置处理类331
- 11.2.3 WebSocket的回显服务器333
- 11.2.4 WebSocket的业务处理器335
- 11.3 WebSocket协议通信的原理337
- 11.3.1 抓取WebSocket协议的本机数据包337
- 11.3.2 WebSocket 握手过程338
- 11.3.3 WebSocket通信报文格式341
- 第12章 SSL/TLS核心原理与实战344
- 12.1 什么是SSL/TLS344
- 12.1.1 SSL/TLS协议的版本演进344
- 12.1.2 SSL/TLS协议的分层结构346
- 12.2 加密算法原理与实战347
- 12.2.1 哈希单向加密算法原理与实战347
- 12.2.2 对称加密算法原理与实战349
- 12.2.3 非对称加密算法原理与实战351
- 12.2.4 数字签名原理与实战356
- 12.3 SSL/TLS运行过程361
- 12.3.1 SSL/TLS第一阶段握手361
- 12.3.2 SSL/TLS第二阶段握手363
- 12.3.3 SSL/TLS第三阶段握手367
- 12.3.4 SSL/TLS第四阶段握手369
- 12.4 详解Keytool工具370
- 12.4.1 数字证书与身份识别370
- 12.4.2 存储密钥与证书文件格式373
- 12.4.3 使用Keytool工具管理密钥和证书374
- 12.5 使用Java程序管理密钥与证书377
- 12.5.1 使用Java操作数据证书所涉及的核心类378
- 12.5.2 使用Java程序创建密钥与仓库378
- 12.5.3 使用Java程序导出证书文件383
- 12.5.4 使用Java程序将数字证书导入信任仓库385
- 12.6 OIO通信中的SSL/TLS使用实战389
- 12.6.1 JSSE安全套接字扩展核心类390
- 12.6.2 JSSE安全套接字的创建过程391
- 12.6.3 OIO安全通信的Echo服务端实战393
- 12.6.4 OIO安全通信的Echo客户端实战395
- 12.7 单向认证与双向认证396
- 12.7.1 SSL/TLS 单向认证396
- 12.7.2 使用证书信任管理器399
- 12.7.3 SSL/TLS 双向认证402
- 12.8 Netty通信中的SSL/TLS使用实战405
- 12.8.1 Netty安全通信演示实例405
- 12.8.2 Netty内置SSLEngine处理器详解406
- 12.8.3 Netty的简单安全聊天器服务端程序409
- 12.9 HTTPS协议安全通信实战412
- 12.9.1 使用Netty实现HTTPS回显服务端程序412
- 12.9.2 通过HttpsURLConnection发送HTTPS请求414
- 12.9.3 HTTPS服务端与客户端的测试用例415
- 第13章 ZooKeeper分布式协调417
- 13.1 ZooKeeper伪集群安装和配置417
- 13.1.1 创建数据目录和日志目录417
- 13.1.2 创建myid文本文件419
- 13.1.3 创建和修改配置文件419
- 13.1.4 配置文件示例421
- 13.1.5 启动ZooKeeper伪集群422
- 13.2 使用ZooKeeper 进行分布式存储423
- 13.2.1 详解ZooKeeper存储模型424
- 13.2.2 zkCli客户端指令清单424
- 13.3 ZooKeeper应用开发实战426
- 13.3.1 ZkClient开源客户端427
- 13.3.2 Curator开源客户端427
- 13.3.3 准备Curator开发环境428
- 13.3.4 创建Curator客户端实例429
- 13.3.5 通过Curator创建节点431
- 13.3.6 通过Curator读取节点432
- 13.3.7 通过Curator更新节点433
- 13.3.8 通过Curator删除节点435
- 13.4 分布式命名服务实战436
- 13.4.1 ID生成器437
- 13.4.2 ZooKeeper分布式ID生成器的实战案例438
- 13.4.3 集群节点的命名服务的实战案例440
- 13.4.4 结合ZooKeeper实现SnowFlake ID算法442
- 13.5 分布式事件监听的重点447
- 13.5.1 Watcher标准的事件处理器448
- 13.5.2 NodeCache节点缓存的监听451
- 13.5.3 PathCache子节点监听454
- 13.5.4 TreeCache节点树缓存457
- 13.6 分布式锁原理与实战461
- 13.6.1 公平锁和可重入锁的原理461
- 13.6.2 ZooKeeper分布式锁的原理463
- 13.6.3 分布式锁的基本流程464
- 13.6.4 加锁的实现465
- 13.6.5 释放锁的实现471
- 13.6.6 分布式锁的使用472
- 13.6.7 Curator的InterProcessMutex可重入锁473
- 13.6.8 ZooKeeper分布式锁的优缺点474
- 第14章 分布式缓存Redis实战476
- 14.1 Redis入门476
- 14.1.1 Redis的安装和配置476
- 14.1.2 Redis客户端命令479
- 14.1.3 Redis键的命名规范480
- 14.2 Redis数据类型481
- 14.2.1 String481
- 14.2.2 List482
- 14.2.3 Hash484
- 14.2.4 Set485
- 14.2.5 ZSet486
- 14.3 Jedis基础编程的实战案例487
- 14.3.1 Jedis操作String488
- 14.3.2 Jedis操作List490
- 14.3.3 Jedis操作Hash491
- 14.3.4 Jedis操作Set493
- 14.3.5 Jedis操作ZSet494
- 14.4 JedisPool连接池的实战案例497
- 14.4.1 JedisPool的配置497
- 14.4.2 JedisPool的创建和预热499
- 14.4.3 JedisPool的使用501
- 14.5 使用spring-data-redis完成CRUD的实战案例502
- 14.5.1 CRUD中应用缓存的场景502
- 14.5.2 配置spring-redis.xml504
- 14.5.3 RedisTemplate模板API506
- 14.5.4 使用RedisTemplate模板API完成CRUD的实战案例509
- 14.5.5 使用RedisCallback回调完成CRUD的实战案例511
- 14.6 Spring的Redis缓存注解513
- 14.6.1 使用Spring缓存注解完成CRUD的实战案例514
- 14.6.2 spring-redis.xml中配置的调整515
- 14.6.3 @CachePut和@Cacheable注解517
- 14.6.4 @CacheEvict注解518
- 14.6.5 @Caching组合注解519
- 14.7 详解SpEL520
- 14.7.1 SpEL运算符521
- 14.7.2 缓存注解中的SpEL表达式524
- 第15章 亿级高并发IM架构与实战526
- 15.1 支撑亿级流量的高并发IM架构的理论基础526
- 15.1.1 亿级流量的系统架构的开发实战527
- 15.1.2 高并发架构的技术选型527
- 15.1.3 详解IM消息的序列化协议选型528
- 15.1.4 详解长连接和短连接528
- 15.2 分布式IM的命名服务的实战案例529
- 15.2.1 IM节点的POJO类530
- 15.2.2 IM节点的ImWorker类531
- 15.3 Worker集群的负载均衡的实战案例534
- 15.3.1 ImLoadBalance负载均衡器535
- 15.3.2 与WebGate的整合537
- 15.4 即时通信消息的路由和转发的实战案例538
- 15.4.1 IM路由器WorkerRouter538
- 15.4.2 IM转发器PeerSender541
- 15.5 在线用户统计的实战案例543
- 15.5.1 Curator的分布式计数器543
- 15.5.2 用户上线和下线的统计545