一 什么是Netty?
Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty 是一个基于NIO的客户、服务器端的编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。
二 什么是pipeline?
pipeline 有管道,流水线的意思,最早使用在 Unix 操作系统中,可以让不同功能的程序相互通讯,使软件更加”高内聚,低耦合”,它以一种”链式模型”来串起不同的程序或组件,使它们组成一条直线的工作流。
三 Netty pipeline的工作原理
Pipeline 本质上是一个双向链表,它采用了责任链模式,在netty中每个 channel都有且仅有一个channel pipeline 与之对应,他们的组织关系如下图所示:
一个 Channel包含了一个 ChannelPipeline,而 ChannelPipeline 又维护了一个由 ChannelHandlerContext 组成的双向链表,这个链表的头叫做 Headcontext,这个链表的尾叫做 TailContext,并且每个 ChannelHandlerContext 中又关联着一个 ChannelHandler。在Netty中,Pipeline 的初始化是通过调用 Channel的 handler()方法,然后在 handler()方法中去传入一个叫做Channellnitializer 的一个对象,通过 SocketChannel去构建出一个新的 Pipeline 对象,我们每次在调用 Pipeline 的addLast()方法的时候都会在 Pipelie 的末端插入一个ChannelHandlerContext。每个ChannelHandlerContext中要包含一个ChannelHandler,通过addLast()方法往 Pipeline 中去添加对象,并且 Handler 的添加顺序会影响到代码的执行顺序,而这些Handler 本质上都是实现编码和解码的功能,不管是编码器还是解码器都必需要实现 ChannelHandler 接囗。在图中我们看到的 Handler就是我们的代码程序要执行的逻辑,而 Netty 默认帮我们实现了非常多的内置的 Handler,我们只需要拿过来直接用就可以了。当然,我们也可以自己去实现 ChannelHandler 接口,来实现一些自定义的编解码器,比如自定义的通信协议等等。当所有的 Handler 全部添加到 Pipeline 以后,Netty 就会将这些 Handler,组装成一个双向链表,从而实现串行化的调用。我们把从头部往尾部执行的 Handler,称为 Inbound,它用来去接受用户请求。从尾部往头部执行的 Handler称之为 Outbound,用来给用户响应。所以Inbound 可以用来实现解码的功能,而 Outbound 可以用来实现编码的功能。