揭开Netty的神秘面纱之架构设计

  • 关键字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框架,敬请期待~

  1. ☛ 文章要是勘误或者知识点说的不正确,欢迎评论,毕竟这也是作者通过阅读源码及相关文档获得的知识,难免会有疏忽!
  2. 要是感觉文章对你有所帮助,不妨点个关注,或者移驾看一下作者的其他文集,也都是干活多多哦,文章也在全力更新中。
  3. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容