写在最前面
移动时代、5G时代、物联网时代的大幕已经开启,它们对于高性能、高并发的开发知识和技术的要求,抬升了Java工程师的学习台阶和面试门槛。大公司的面试题从某个侧面映射出生产场景中对专项技术的要求。高并发的面试题以前基本是BAT等大公司的专利,现在几乎蔓延至与Java项目相关的整个行业。例如,与Java NIO、Reactor模式、 高性能通信、分布式锁、分布式ID、分布式缓存、高并发架构等技术相关的面试题,从以前的加分题变成了现在的基础题,这也映射出开发Java项目所必需的技术栈:分布式Java框架、Redis缓存、分布式搜索ElasticSearch、分布式协调ZooKeeper、消息队列Kafka、高性能通信框架Netty。
今天分享的这份笔记虽然重在讲解Netty、Redis、 ZooKeeper的使用方法,但是还有一个更大的价值,就是为大家打下Java高并发开发技术的坚实基础。
首先,从操作系统的底层原理开始讲解:浅显易懂地剖析高并发IO的底层原理,并介绍如何让单体Java应用支持百万级的高并发:从传统的阻塞式OIO开始,细致地解析Reactor高性能模式,介绍高性能网络开发的基础知识:从Java的线程Join和线程池开始,介绍Java Future和Guava ListenableFuture两种常用异步回调技术。这些原理方面的基础知识非常重要,是大家在日常开发Java后台应用时解决实际问题的金钥匙。
接着,重点讲解Netty.这是目前当之无愧的高性能通信框架皇冠上的明珠,是支撑其他众多著名的高并发、分布式、大数据框架底层的框架。这里有两大特色:一是从Reactor模式入手,以四两拨千斤的方式来学习Netty原理;二是通过Netty来解决网络编程中的重点难题,如ProtoBuf序列化问题、 半包问题等。
然后,对ZooKeeper进行详细的介绍。除了全面地介绍使用Curator API操作ZooKeeper之外,还从实战的角度出发,介绍如何使用ZooKeeper来设计分布式ID生成器,并对重要的SnowFlake算法进行详细的介绍。另外,还通过图文并茂和结合小故事的方式浅显易懂地介绍分布式锁的基本原理,并完成一个ZooKeeper分布式锁的小实践案例。
接下来,从实践开发层面对Redis进行说明,详细介绍Redis的5种数据类型、客户端操作指令、Jedis Java API.另外,还通过Sspring-data-redis来 完成两种方式的数据分布式缓存,并详尽地介绍Spring的缓存注解以及涉及的SpEL表达式语言。
最后,通过CrazyIM项目介绍一个亿级流量的高并发IM系统模型。这个高并发架构的系统模型不仅仅限于IM系统,通过简单的调整和适配,就可以应用于当前主流的Java后台系统。
下面将会为大家展示笔记中的部分内容(着重是在让大家知道这份笔记是在讲些什么)由于文章的篇幅受限,完整版的获取方式我放在了文末!
第1章高并发时代的必备技能
Netty为何这么火
高并发利器Redis
分布式利器ZooKeeper
高并发IM的综合实践
Netty、Redis、ZooKeeper实践计划
-
第1天: Java NIO实践
-
第2天: Reactor反应器模式实践
-
第3天:异步回调模式实践
-
第4天: Netty基础实践
-
第5天:解码器(Decoder)与编码器(Encoder) 实践
-
第6天: JSON和ProtoBuf序列化实践
-
第7~10天:基于Netty的单聊实战
-
第11天: ZooKeeper实践计划
-
第12天: Redis实践计划
第2章高并发IO的底层原理
IO读写的基础原理
-
内核缓冲区与进程缓冲区
-
详解典型的系统调用流程
四种主要的IO模型
-
同步阻塞IO (Blocking IO)
-
同步非阻塞NIO (None Blocking IO)
-
IO多路复用模型(IO Multiplexing)
-
异步IO模型(Asynchronous IO)
通过合理配置来支持百万级并发连接
第3章Java NIO通信基础详解
Java NIO简介
-
NIO和OIO的对比
-
通道(Channel)
-
Selector选择器
-
缓冲区(Buffer)
详解NIO Buffer类及其属性
-
Buffer类
-
Buffer类的重要属性
-
4个属性的小结
详解NIO Buffer类的重要方法
-
allocate()创建缓冲区
-
put()写入到缓冲区
-
flip()翻转
-
get()从缓冲区读取
-
rewind()倒带
-
mark( )和reset( )
-
clear( )清空缓中区
详解NIO Channel (通道)类
-
Channel (通道)的主要类型
-
FileChannel文件通道
-
使用FileChannel完成文件复制的实践案例
-
SocketChanne|套接字通道
-
使用SocketChannel发送文件的实践案例
-
DatagramChanne|数据报通道
-
使用DatagramChannel数据包通道发送数据的实践案例
详解NIO Selector选择器
-
选择器以及注册
-
SelectableChannel可选择通道
-
SelectionKey选择键
-
选择器使用流程
-
使用NIO实现Discard服务器的实践案例
-
使用SocketChannel在服务器端接收文件的实践案例
第4章鼎鼎大名的Reactor反应器模式
Reactor反应器模式为何如此重要
-
为什么首先学习Reactor反应器模式
-
Reactor反应器模式简介
-
多线程OIO的致命缺陷
单线程Reactor反应器模式
-
什么是单线程Reactor反应器
-
单线程Reactor反应器的参考代码
-
一个Reactor反应器版本的EchoServer实践案例
-
单线程Reactor反应器模式的缺点
多线程的Reactor反应器模式
-
多线程池Reactor反应器演进
-
多线程Reactor反应器的实践案例
-
多线程Handler处理器的实践案例
Reactor反应器模式小结
第5章并发基础中的Future异步回调模式
从泡茶的案例说起
join异步阻塞
-
线程的join合并流程
-
使用join实现异步泡茶喝的实践案例
-
详解join合并方法
FutureTask异步回调之重武器
-
Callable接口
-
初探FutureTask类
-
Future接口
-
再谈FutureTask类
-
使用FutureTask类实现异步泡茶喝的实践案例
Guava的异步回调
-
详解FutureCallback
-
详解ListenableFuture
-
ListenableFuture异步任务
-
使用Guava实现泡茶喝的实践案例
Netty的异步回调模式
-
详解GenericFutureListener接口
-
详解Netty的Future接口
-
ChannelFuture的使用
-
Netty的出站和入站异步回调
第6章Netty原理与基础
第一个Netty的实践案例DiscardServer
-
创建第一个Netty项目
-
第一个Netty服务器端程序
-
业务处理器NettyDiscardHandler
-
运行NettyDiscardServer
解密Netty中的Reactor反应器模式
-
回顾Reactor反应器模式中IO事件的处理流程
-
Netty中的Channel通道组件
-
Netty中的Reactor反应器
-
Netty中的Handler处理器
-
Netty的流水线(Pipeline)
详解Bootstrap启动器类
-
父子通道
-
EventLoopGroup线程组
-
Bootstrap的启动流程
-
ChannelOption通道选项
详解Channel通道
-
Channel通道的主要成员和方法
-
EmbeddedChannel嵌入式通道
详解Handler业务处理器
-
ChannellnboundHandler通道入站处理器
-
ChannelOutboundHandler通道出站处理器
-
Channellnitializer通道初始化处理器
-
ChannellnboundHandler的生命周期的实践案例
详解Pipeline流水线
-
Pipeline入站处理流程
-
Pipeline出站处理流程
-
ChannelHandlerContext上下文
-
截断流水线的处理
-
Handler业务处理器的热拔插
详解ByteBuf缓冲区
-
ByteBuf的优势
-
ByteBuf的逻辑部分
-
ByteBuf的重要属性
-
ByteBuf的三组方法
-
ByteBuf基本使用的实践案例
-
ByteBuf的引用计数
-
ByteBuf的Allocator分配器
-
ByteBuf缓冲区的类型
-
三类ByteBuf使用的实践案例
-
ByteBuf的自动释放
ByteBuf浅层复制的高级使用方式
-
slice切片浅层复制
-
duplicate整体浅层复制
-
浅层复制的问题
EchoServer回显服务器的实践案例
-
NettyEchoServer回显服务器的服务器端
-
共享NettyEchoServerHandler处理器
-
NettyEchoClient客户端代码
-
NettyEchoClientHandler处理器
第7章Decoder与Encoder重要组件
Decoder原理与实践
-
ByteToMessageDecoder解码器
-
自定义Byte2IntegerDecoder整数解码器的实践案例
-
ReplayingDecoder解码器
-
整数的分包解码器的实践案例
-
字符串的分包解码器的实践案例
-
MessageToMessageDecoder解码器
开箱即用的Netty内置Decoder
-
LineBasedFrameDecoder解码器
-
DelimiterBasedFrameDecoder解码器
-
LengthFieldBasedFrameDecoder解码器
-
多字段Head-Content协议数据帧解析的实践案例
Encoder原理与实践
-
MessageToByteEncoder编码器
-
MessageToMessageEncoder编码器
解码器和编码器的结合
-
Byte ToMessageCodec编解码器
-
CombinedChannelDuplexHandler组合器
第8章JSON和ProtoBuf序列化
详解粘包和拆包
-
半包问题的实践案例
-
什么是半包问题
-
半包现象的原理
JSON协议通信
-
JSON序列化的通用类
-
JSON序列化与反序列化的实践案例
-
JSON传输的编码器和解码器之原理
-
JSON传输之服务器端的实践案例
-
JSON传输之客户端的实践案例
Protobuf协议通信
-
一个简单的proto文件的实践案例
-
控制台命令生成POJO和Builder
-
Maven插件生成POJO和Builder
-
消息POJO和Builder的使用之实践案例
Protobuf编解码的实践案例
-
Protobuf编码器和解码器的原理
-
Protobuf传输之服务器端的实践案例
-
Protobuf传输之客户端的实践案例
详解Protobuf协议语法
-
proto的头部声明
-
消息结构体与消息字段
-
字段的数据类型
-
其他的语法规范
第9章基于Netty的单体IM系统的开发实践
自定义ProtoBuf编解码器
-
自定义Protobuf编码器
-
自定义Protobuf解码器
-
IM系统中Protobuf消息格式的设计
概述IM的登录流程
-
图解登录/响应流程的9个环节
-
客户端涉及的主要模块
-
服务器端涉及的主要模块
客户端的登录处理的实践案例
-
LoginConsoleCommand和User POJO
-
LoginSender发送器
-
ClientSession客户端会话
-
LoginResponceHandler登录响应处理器
-
客户端流水线的装配
服务器端的登录响应的实践案例
-
服务器流水线的装配
-
LoginRequestHandler登录请求处理器
-
LoginProcesser用户验证逻辑
-
EventLoop线程和业务线程相互隔离
详解ServerSession服务器会话
-
通道的容器属性
-
ServerSession服务器端会话类
-
SessionMap会话管理器
点对点单聊的实践案例
-
简述单聊的端到端流程
-
客户端的ChatConsoleCommand收集聊天内容
-
客户端的CommandContoller发送POJO
-
服务器端的ChatRedirectHandler消息转发
-
服务器端的ChatRedirectProcesser异步处理
-
客户端的ChatMsgHandler接收POJO
详解心跳检测
-
网络连接的假死现象
-
服务器端的空闲检测
-
客户端的心跳报文
第10章ZooKeeper分布式协调
ZooKeeper伪集群安装和配置
-
创建数据目录和日志目录:
-
创建myid文件
-
创建和修改配置文件
-
配置文件示例
使用ZooKeeper进行分布式存储
-
详解ZooKeeper存储模型
-
zkCli客户端命令清单
ZooKeeper应用开发的实践
-
ZkcClient开源客户端介绍
-
Curator开源客户端介绍
-
Curator开发的环境准备
-
Curator客户端实例的创建
-
通过Curator创建ZNode节点
-
在Curator中读取节点
-
在Curator中更新节点
-
在Curator中删除节点
分布式命名服务的实践
-
ID生成器
-
ZooKeeper分布式ID生成器的实践案例
-
集群节点的命名服务之实践案例
-
使用ZK实现SnowFlakelD算法的实践案例
分布式事件监听的重点
-
Watcher标准的事件处理器
-
NodeCache节点缓存的监听
-
PathChildrenCache子节点监听
-
Tree Cache节点树缓存
分布式锁的原理与实践
-
公平锁和可重入锁的原理
-
ZooKeeper分布式锁的原理
-
分布式锁的基本流程
-
加锁的实现
-
释放锁的实现
-
分布式锁的使用
-
Curator的InterProcessMutex可重入锁
第11章分布式缓存Redis
Redis入门
-
Redis安装和配置
-
Redis客户端命令
-
Redis Key的命名规范
Redis数据类型
-
String字符串
-
List列表
-
Hash哈希表
-
Set集合
-
Zset有序集合
Jedis基础编程的实践案例
-
Jedis提作Sring字符串
-
Jedis操作List列表
-
Jedis操作Hash哈希表
-
Jedis操作Set集合
-
Jedis操作Zset有序集合
JedisPool连接池的实践案例
-
JedisPool的配置
-
JedisPool创建和预热
-
JedisPool的使用
使用spring-data-redis完成
-
CRUD中应用缓存的场景
-
配置spring-redis.xml
-
使用RedisTemplate模板API
-
使用RedisTemplate模板API完成CRUD的实践案例
-
使用RedisCallback回调完成CRUD的实践案例
Spring的Redis缓存注解
-
使用Spring缓存注解完成CRUD的实践案例
-
spring-redis.xml中配置的调整
-
详解@CachePut和@Cacheable注解
-
详解@CacheEvict注解
-
详解@Caching组合注解
详解SpringEL (SpEL)
-
SpEL运算符
-
缓存注解中的SpringEL表达式
第12章亿级高并发IM架构的开发实践
如何支撑亿级流量的高并发IM架构的理论基础
-
亿级流量的系统架构的开发实践
-
高并发架构的技术选型
-
详解IM消息的序列化协议选型
-
详解长连接和短连接
分布式IM的命名服务的实践案例
-
IM节点的POJO类
-
IM节点的ImWorker类
Worker集群的负裁均衡之实践案例
-
ImLoadBalance负载均衡器
-
与WebGate的整合
即时通信消息的路由和转发的实践案例
-
IM路由器WorkerRouter
-
IM转发器WorkerReSender
Feign短连接RESTful调用
-
短连接API的接口准备
-
声明远程接口的本地代理
-
远程API的本地调用
分布式的在线用户统计的实践案例
-
Curstor的分布式计数器
-
用户上线和下线的统计