- 关键字 :Netty是什么、Netty架构设计、NioEventLoop相关组件
Netty是什么
- 首先,Netty是一款基于Java NIO实现的异步非阻塞网络通信框架,在降低了NIO编程复杂度的同时,同时通过Reactor多线程模型+事件驱动来降低传统请求过程创建大量线程的;支持使用Epoll来代替Select、Poll的传统轮训就绪事件描述符,采用监听就绪事件机制并优化底层数据结构来应对高并发 ;另外也提供了统一的粘包、拆包抽象,方便用户自定义通信协议。
简单总结如下:
- 基于Java NIO的网络通信框架(异步非阻塞)
- Reactor多线程+IO多路复用模型
- linux下支持epoll应对大量的网络事件触发
- 事件驱动
- 抽象数据粘包、拆包,方便自定义协议处理数据包
Netty架构设计
下图为 Netty 官网给出的 Netty 架构图
组件架构Design
官方给的是模块设计架构,粒度比较粗,下面我们再来看一张业务架构设计图
Reactor模型
- BossGroup:用来处理客户端的请求,属于ServerBootstrap的parent EventLoopGroup
- WorkGroup:处理BossGroup转交过来的请求,ServerBootstrap的child EventLoopGroup
- Channel:一个channel对应一个客户端连接,由Boss下面的NioEventLoop轮训到accept事件时获取,后续会转交给WorkGroup下其中一个NioEventLoop来轮训处理后续读写事件
- Selector:用于监听内核事件,一个Selector上面可以注册多个channel
- NioEventLoop:类似于线程,真正用来监听网络事件的组件,对应一个Selector
- NioEventLoopGroup:线程池(功能类似于jdk中的ThreadExecutorPool),管理一组NioEventLoop
- ChannelHandler:分为入站
ChannelInboundHandler
,顾名思义就是处理请求的handler,出站ChannelOutboundHandler
,处理响应的handler
上图中Worker线程接收到就绪事件之后会触发Netty框架下面的Pipeline(也就是我们在网络编程中用得最多的地方,后面的文章会有源码分析,本篇先混个脸熟)
Pipeline流程处理
accept到连接之后的转交过程
NioEventLoop.processSelectedKeys() -> NioEventLoop.processSelectedKey() -> NioMessageUnsafe.read() -> NioServerSocketChannel.doReadMessages() -> ServerBootstrapAcceptor.channelRead()
上面是nio下接收到连接的过程(单独拿出来是因为代码藏的比较深,感兴趣的可以找到对应的代码先分析一波😁),也算是为后续的源码篇做个引子吧!下篇将会通过源码来进行逐步拆解Netty框架,敬请期待~
- ☛ 文章要是勘误或者知识点说的不正确,欢迎评论,毕竟这也是作者通过阅读源码及相关文档获得的知识,难免会有疏忽!
- ☛ 要是感觉文章对你有所帮助,不妨点个关注,或者移驾看一下作者的其他文集,也都是干活多多哦,文章也在全力更新中。
- ☛ 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处!