Netty(一、初步了解)
NIO/OIO
Netty是流行的NIO框架,我们在学习Netty之前需要先了解什么是NIO和BIO。
OIO:阻塞IO,传统的socket就是阻塞IO,例如服务端accept是阻塞的,只有当新连接来了,accept才会返回,主线程才能继续。这种IO占用了系统的调度资源,造成了浪费。
NIO(Nonblocking I/O): 非阻塞IO,用的是事件机制,它会获取事件并交给Selector处理,Selector去遍历所有的socket,一旦有一个socket建立了连接,则通知Thread,Thread处理完成后再返回给客户端。若没有事件则将线程休眠起来,直到下个事件发生在继续。
Netty
Netty是基于NIO开发的网络通信框架,所以整个Netty都是异步的,原生的java nio使用起来不是很方便,而Netty将其封装后,提供了易于操作的使用模式和接口。其中在rocketmq和dubbo中均有使用到。
核心组件
- Bootstrap和ServerBootstrap:Netty应用程序通过设置bootstrap引导类来完成,该类提供了一个用于应用程序网络层配置的容器。Bootstrap服务端的是ServerBootstrap,客户端的是Bootstrap。
- Channel:Netty 中的接口 Channel 定义了与 socket 丰富交互的操作集:bind, close, config, connect, isActive, isOpen, isWritable, read, write 等等。
- ChannelHandler:ChannelHandler 支持很多协议,并且提供用于数据处理的容器,ChannelHandler由特定事件触发, 常用的一个接口是ChannelInboundHandler,该类型处理入站读数据(socket读事件)。
- ChannelPipeline:ChannelPipeline 提供了一个容器给 ChannelHandler 链并提供了一个API 用于管理沿着链入站和出站事件的流动。每个 Channel 都有自己的ChannelPipeline,当 Channel 创建时自动创建的。
- EventLoop:EventLoop 用于处理 Channel 的 I/O 操作。一个单一的 EventLoop通常会处理多个 Channel 事件。一个 EventLoopGroup 可以含有多于一个的 EventLoop 和 提供了一种迭代用于检索清单中的下一个。
- ChannelFuture:Netty 所有的 I/O 操作都是异步。因为一个操作可能无法立即返回,我们需要有一种方法在以后获取它的结果。出于这个目的,Netty 提供了接口 ChannelFuture,它的 addListener 方法
ByteBuf
Netty需要接收数据的时候,会在堆内存之外开辟一块内存,数据可以直接从IO到这块内存中去,通过ByteBuf就可对数据进行操作。ByteBuf是个字节数据的容器,提供了两个索引,一个用于读,一个用于写。