什么是Netty
Netty是一款开源的网络通讯框架,它是异步的、基于事件的,且高性能的框架,它支持多种网络协议,例如HTTP,websocket,TCP/IP、UDP、FTP等等,所有网络通讯问题都能由Netty解决
Netty线程模型
Netty核心组件
EventLoopGroup
概述:这是一个事件循环组,这个组内可以有一个或多个EventLoop,一个BossGroup和WorkerGroup都是EventLoopGroup的实现,通常BossGroup处理客户端连接,然后把连接后的客户通道交给WorkerGroup进行IO处理
EventLoop
概述:这个是一个事件循环,在这个事件循环里面有一个selector和一个taskQueue,而selector里维护着多个管道
Pipeline
概述: 管道和Pipeline是一对一的关联关系,而pipeline内部的多个Context形成了链表,Context只是对Handler的封装,当有事件发生数据通过通道流入管道,经过一个又一个的处理器
Netty自带的Handler
概述:Netty自带了一些Handler(处理器),这些处理器通常用于正式处理业务前后的编码、解码
HTTP相关Handler
-
HttpRequestDecoder:该处理器是把HTTP请求解码,然后将解码后数据封装到HttpObject(默认DefaultHttpRequest实现)内后传给下一个Handler,这是一个InBound处理器
-
HttpResponseEncoder:该处理器是把HTTP响应编码为浏览器可读的数据的处理器,这是一个OutBound处理器
-
HttpServerCodec:该处理器相当于HttpRequestDecoder+ HttpResponseEncoder,通常用于服务器上
-
HttpResponseDecoder:该处理器是把HTTP响应解码为一个HttpObject(默认DefaultHttpResponse实现)对象后传给下一个Handler,这是一个InBound处理器
-
HttpRequestEncoder:该处理器是把HTTP请求编码为可发送的HTTP请求数据,这是一个OutBound处理器
-
HttpClientCodec:该处理器相当于HttpResponseDecoder+ HttpRequestEncoder,通常用于客户端上
ChannelHandler的调用/注册顺序
概述:在管道中有一个管道处理器链,这个链是有序的,根据注册的顺序来调用管道内的处理器
注册顺序:
注册顺序从链头到链尾为:解码器(入栈)->编码器(出栈)->业务处理器(入/出栈)
注意:如果出栈处理器被注册在处理器链的尾部,那么这个出栈处理器可能达不到预期的效果,所以一般注册在业务处理器的前面
调用顺序:
处理器的调用顺序为:
链头入栈处理器1入栈处理器2入栈处理器n链尾出栈处理器n出栈处理器n-1出栈处理器n-2…出栈处理器1链头
注意:调用顺序为从链头开始向链尾调用中间所有可调用的入栈处理器,然后再在链尾处逆向回来调用中间可用的所有出栈处理器,最到链头结束