了解网站建设的基本流程怎样进行网络推广效果更好
目录
- 为什么要学习netty
- netty学习导图
- 学习netty前需要知道的知识
- I/O模型
- 主要I/O模型
- netty框架的整体结构
- netty的逻辑架构
- 网络通信层
- 事件调度层
- 服务编排层
为什么要学习netty
Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty本质是一个NIO框架,通过异步、基于事件驱动的IO,用以快速开发高性能、高可靠性的网络IO程序,主要针对在TCP协议下,面向Client端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用。
作为Java后端研发同学,一定都会接触到框架和网络通信,就我接触过并看过源码的开源项目,可以说基本上都是使用Netty作为网络通信的底层框架,如Dubbo、RocketMQ、Canal、otter、HBase等等。
————————————————
版权声明:本文为CSDN博主「西木风落」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenwiehuang/article/details/103937396
netty学习导图
学习netty前需要知道的知识
I/O模型
I/O请求分为两个阶段:
- I/O调用阶段:用户进程向内核发起系统调用
- I/O执行阶段:内核等待I/O请求处理完成并返回
如下图
主要I/O模型
-
同步堵塞I/O (BIO)
-
同步非堵塞I/O (NIO)
-
I/O多路复用
- 信号驱动I/O
- 异步I/O
netty的IO模型是基于非堵塞IO,底层实现依赖于JDK NIO的多路复用器Selector
事件处理器(Event Handler)
负责将读写事件分发给对应的读写事件处理器(Event Handler)
Reactor (使用同步IO)和 Proactor (异步IO),主流的事件模型主要使用Reactor 或Epoll
netty框架的整体结构
Core核心层
提供底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信API、支持零拷贝的 ByteBuf等
Protocol Support 协议支持层
- 覆盖了主流协议的编解码实现如HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等
- 支持自定义应用层协议
Transport Service传输服务层
- 传输服务层提供了网络传输能力的定义和实现方法支持Socket、HTTP隧道、虚拟机管道等传输方式
- Netty的模块设计具备较高的通用性和可扩展性 支持自定义应用层协议
netty的逻辑架构
网络通信层
网络通信层的职责是执行网络I/O的操作,支持多种网络协议和I/О模型的连接操作,包括ServerBootstrap,Bootstrap,Channel组件
- Bootstrap可用于连接远端服务器,只绑定一个EventLoopGroup (Boss),负责客户端的启动
- ServerBootStrap 用于服务端启动绑定本地端口,绑定两个EventLoopGroup (Worker),负责服务端的启动
Bootstrap,ServerBootStrap是netty程序的入口
每个服务器中都会有一个Boss,会有一群做事情的 Worker
Boss 会不停地接收新的连接,将连接分配给一个个Worker处理连接
roup
√支持自定义应用层协议
Channel
Channel是网络通信的载体,提供了基本的API用于网络I/О操作
如register、bind、connect、read、write、flush等Netty自己实现的Channel是以JDKNIO Channel为基础的
Channel会有多种状态,如连接建立、连接注册、数据读写、
连接销毁等
Channel的状态
事件 | 说明 |
---|---|
channelRegistered | Channel创建后被注册到EventLoop 上 |
channelUnregistered | Channel创建后未注册或者从EventLoop取消注册 |
channelInactive | Channel处于非就绪状态 |
channelRead | Channel可以从远端读取到数据 |
小结
BootStrap和ServerBootStrap 分别负责客户端和服务端的启动
Channel是网络通信的载体,提供了与底层Socket交互的能力
事件调度层
通过Reactor线程模型对各类事件进行聚合处理通过Selector主循环线程集成多种事件
核心组件包括EventLoopGroup、EventLoop
EventLoopGroup是Netty Reactor线程模型的具体实现方式
服务编排层
ChannelPipeline负责组装各种ChannelHandler实际数据的编解码以及加工处理操作由ChannelHandler完成
当I/O读写事件触发时,ChannelPipeline会
依次调用ChannelHandler列表对Channel的数据进行拦截和处理
每一个新的Channel会对应绑定一个新的ChannelPipeline(线程安全的);一个ChannelPipeline关联一个EventLoop一个EventLoop仅会绑定一个线程
ChannelPipeline入站和出站
channel和ChannelPipeline的关系
ChannelHandlerContext的作用
- 保存ChannelHandler上下文
- 实现ChannelHandler之间的交互,包含ChannelHandler生命周期的所有事件
如connect、bind、read、flush、write、close等
组件之间的协作
小结
- Bootstrap负责客户端或服务端的启动工作,包括创建、初始化Channel等
- EventLoop负责向注册的Channel发起I/O读写操作
- channelPipeline负责ChannelHandler的有序编排