Netty原理 & 手写简化版Netty
背景&目的
本文提出netty有这么4个核心概念:
- Reactor线程模型:一种高性能的多线程程序设计思路
- nettyChannel:增强版的通道概念
- ChannelPipeline 职责链:事件处理机制
- 内存管理:增强的 ByteBuf 缓冲区
这么 4 个概念结合在一起,让 netty 这么美妙:
- 支持Socket等多种传输方式;
- 提供了多种协议的编码实现;
- 有多美妙,参看官网:https://netty.io/
那么,试着手写一个简化版本的netty,探探这里面究竟是什么?
本文分为两个部分:
- 手写简化版 Netty
- Netty 原理
手写简化版Netty
netty 源码稍微有些复杂,考虑了许多可扩展、安全、性能等,netty 的核心就隐藏在这百花深处。那么,何不拨开这些,自己尝试尝试,触及 netty 的核心原理呢~
陆续完善中,详见 github:https://github.com/leishiguang/netty-simplified.git
Netty 原理
Reactor 线程模型
大致的步骤是这样:
- 客户端的请求进来,首先到达 reactor 线程,由它专门负责轮询;
- reactor 线程不对请求进行处理,而是轮询事件,分发到对应的 worker 线程;
- worker 线程依据配置,继续分发,或者对请求进行处理;
简化为两个线程组
抽象线程对象
- 每个线程有自己的选择器:来源于构造器,与线程对象一起完成初始化。
- 有自己的任务队列:保存所需要处理的工作。
- 通道注册的方法:提交注册任务到自己的任务队列,会把通道注册在自己的选择器上。
- 有启动的方法与状态:线程对象初次创建的时候,没