1. Netty是什么
- Netty是JBOSS提供的一个java开源框架, 基于事件驱动的一个网络应用程序框架, 用于快速开发高性能的网络IO程序
- dubbo,ES, redis等都使用了netty
2. IO线程模型
- IO线程模型有
- 传统的阻塞IO模型
- Reactor模型: 单Reactor单线程,单Reactor多线程,主从Reactor多线程
- netty主要是针对主从Reactor多线程模型进行改进
3. Reactor模型
Reactor模式也叫分发者模式, 获取到连接, 将连接分发到后台多线程handler进行处理(多线程版)
-
单Reactor单线程
- 一个单个线程处理连接, 然后通过该单线程线程处理连接后的读写操作(handler)
- Reactor和数据处理都在一个线程中
- 单个线程又做连接处理又做数据处理
-
单Reactor多线程
- 单个线程处理连接和响应, 然后通过多个线程处理连接后的读写操作(handler)
- Reactor是单线程, 数据处理是多线程
-
主从Reactor多线程
- 多个线程处理连接, 然后通过多个线程处理连接后的读写操作
- Reactor和Handler都是多线程版
- 主线程Reactor只做连接处理, 从线程Reactor做响应处理,工作线程做数据处理
4. Netty的Reactor模型
- Netty抽象出两组线程池(类型都是NioEventLoopGroup)
- BossGroup: 主要处理连接事件
- WorkGroup: 主要处理read/write事件
- BossGroup:
- 每个BossGroup中都有多个线程, 多个NioEventLoop(事件循环), 有多个Selector
- BossGroup_NioEventLoop: 处理三件事
- accept: 监听绑定在这个NioEventLoop上的accept事件
- register: 将新连接的NioSocketChannel注册到workGroup其中的一个Selector上
- runAllTasks: 处理队列里面的任务
- WorkGroup:
- 每个WorkGroup中都有多个线程, 多个NioEventLoop(事件循环), 有多个Selector
- WorkGroup_NioEventLoop: 处理三件事
- 循环判断是否有read/write事件发生
- 处理read/write事件
- runAllTasks: 处理队列里面的任务