1、Bootstrap、ServerBootstrap
一个Netty应用通常由一个Bootstrap开始,主要作用是配置整个Netty程序,串联各个组件。Bootstrap是客户端程序的启动引导类,ServerBootstrap是服务端启动引导类;
2、Future、ChannelFuture
Channel channel(),返回当前正在进行IO操作的通道;
ChannelFuture sync(),等待异步操作执行完毕;
3、Channel
- 可获得当前网络连接的通道的状态;
- 可获得网络连接的配置参数
- Channel 提供异步的网络 I/O 操作(如建立连接,读写,绑定端口),异步调用意味着任何 I/O 调用都将立即返回,并且不保证在调用结束时所请求的 I/O 操作已完成
- 调用立即返回一个 ChannelFuture 实例,通过注册监听器到 ChannelFuture 上,可以 I/O 操作成功、失败或取消时回调通知调用方。
- 支持关联 I/O 操作与对应的处理程序
- 不同协议、不同的阻塞类型的连接都有不同的 Channel 类型与之对应,常用的 Channel 类型:
4、Selector
- Netty基于Selector对象实现IO多路复用,通过Selector线程可以监听多个连接的Channel事件;
- 当向一个Selector中注册channel后,Selector内部机制就可以自动查询这些注册的Channel是否有就绪的IO事件,这样程序就可以很简单地使用一个线程高效的管理多个Channel;
5、ChannelHandler
ChannelHandler 是一个接口,处理 I/O 事件或拦截 I/O 操作,并将其转发到其 ChannelPipeline(业务处理链)中的下一个处理程序。
6、Pipeline和ChannelPipeline
ChannelPipeline 是一个 Handler 的集合,它负责处理和拦截 inbound 或者 outbound 的事件和操作,相当于一个贯穿 Netty 的链。(也可以这样理解:ChannelPipeline 是 保存 ChannelHandler 的 List,用于处理或拦截 Channel 的入站事件和出站操作)
ChannelPipeline 实现了一种高级形式的拦截过滤器模式,使用户可以完全控制事件的处理方式,以及 Channel 中各个的 ChannelHandler 如何相互交互
一个 Channel 包含了一个 ChannelPipeline,而 ChannelPipeline 中又维护了一个由 ChannelHandlerContext 组成的双向链表,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler
入站事件和出站事件在一个双向链表中,入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干扰
7、ChannelHandlerContext
- 保存Channel相关的所有上下文信息,同时关联一个ChannelHandler对象,同时也绑定了对应的pipeline和channel信息;
8、ChannelOption
Netty 在创建 Channel 实例后,一般都需要设置 ChannelOption 参数。
ChannelOption.SO_BACKLOG
对应 TCP/IP 协议 listen 函数中的 backlog 参数,用来初始化服务器可连接队列大小。服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接。多个客户端来的时候,服务端将不能处理的客户端连接请求放在队列中等待处理,backlog 参数指定
了队列的大小。
ChannelOption.SO_KEEPALIVE
一直保持连接活动状态
9、EventLoopGroup、NioEventLoopGroup
- EventLoopGroup 是一组 EventLoop 的抽象,Netty 为了更好的利用多核 CPU 资源,一般会有多个 EventLoop 同时工作,每个 EventLoop 维护着一个 Selector 实例。
- EventLoopGroup 提供 next 接口,可以从组里面按照一定规则获取其中一个 EventLoop来处理任务。在 Netty 服务器端编程中,我们一般都需要提供两个 EventLoopGroup,例如:BossEventLoopGroup 和 WorkerEventLoopGroup。