Netty是什么

1.Netty 是一个 基于 NIO 的 client-server(客户端服务器)框架,使用它可以快速简单地开发网络应用程序。
2.它极大地简化并优化了 TCP 和 UDP 套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。
3.支持多种协议 如 FTP,SMTP,HTTP 以及各种二进制和基于文本的传统协议。

应用场景

作为 RPC 框架的网络通信工具 :
我们在分布式系统中,不同服务节点之间经常需要相互调用,这个时候就需要 RPC 框架了。不同服务节点之间的通信是如何做的呢?可以使用 Netty 来做。
实现一个自己的 HTTP 服务器 :通过 Netty 我们可以自己实现一个简单的 HTTP 服务器,这个大家应该不陌生。说到 HTTP 服务器的话,作为 Java 后端开发,我们一般使用 Tomcat 比较多。一个最基本的 HTTP 服务器可要以处理常见的 HTTP Method 的请求,比如 POST 请求、GET 请求等等。
实现一个即时通讯系统 :使用 Netty 我们可以实现一个可以聊天类似微信的即时通讯系统,这方面的开源项目还蛮多的,可以自行去 Github 找一找。
实现消息推送系统 :市面上有很多消息推送系统都是基于 Netty 来做的。

讲讲Netty的特点?

高并发:Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架,对比于BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高 。
传输快:Netty的传输快其实也是依赖了NIO的一个特性——零拷贝。
封装好:Netty封装了NIO操作的很多细节,提供易于使用的API。

核心组件
  1. Channel接口
    基础的IO操作,如绑定、连接、读写等都依赖于底层网络传输所提供的原语,在Java的网络编程中,基础核心类是Socket,而Netty的Channel提供了一组API,极大地简化了直接与Socket进行操作的复杂性,并且Channel是很多类的父类
  2. EventLoop
    每个客户端的socket都会注册到一个EventLoop上,由这个EventLoop负责处理该channel的所有IO事件和IO操作。
  3. ChannelHandler
    是消息的具体处理器。他负责处理读写操作、客户端连接等事情。

ChannelHandler 分为入站和出站两种:ChannelInboundHandler 和 ChannelOutboundHandler ,不过一般不建议直接实现这两个接口,而是它们的抽象类:

  • SimpleChannelInboundHandler :处理入站事件,不建议直接使用ChannelInboundHandlerAdapter
  • ChannelOutboundHandlerAdapter :处理出站事件
  • ChannelDuplexHandler :双向的

其中, SimpleChannelInboundHandler 相比于 ChannelInboundHandlerAdapter 优势更明显,它可以帮我们做资源的自动释放等操作。

  1. ChannelPipeline
    ChannelPipeline 为 ChannelHandler 的链,提供了一个容器并定义了用于沿着链传播入站和出站事件流的 API 。当 Channel 被创建时,它会被自动地分配到它专属的 ChannelPipeline。我们可以在 ChannelPipeline 上通过 addLast() 方法添加一个或者多个ChannelHandler ,因为一个数据或者事件可能会被多个 Handler 处理。当一个 ChannelHandler 处理完之后就将数据交给下一个 ChannelHandler 。

一个 Channel 对应一个 ChannelPipeline
一个 ChannelPipeline 包含一条双向的 ChannelHandlerContext 链.
一个 ChannelHandlerContext 中包含一个 ChannelHandler.
一个 Channel 会绑定到一个 EventLoop 上.
一个 NioEventLoop 维护了一个 Selector (使用的是 Java 原生的 Selector )
一个 NioEventLoop 相当于一个线程.

Netty的解码器

1.FixedLengthFrameDecoder 基于固定长度的解码器
2.LineBasedFrameDecoder 基于行(\n,\r)的解码器
3.DelimiterBasedFrameDecoder 基于分隔符的解码器
4.LengthFieldBasedFrameDecoder 基于长度的解码器

ByteBuf分类

Pooled和Unpooled—》Pooled从已经分配好的内存取内存 Unpooled新创建一块内存
Unsafe和非Unsafe—》Unsafe依赖于jdk底层Unsafe对象 非Unsafe不依赖于jdk底层Unsafe对象
Heap和Direct —》Heap底层就是byte数组 Direct依赖于Nio的ByteBuffer创建出DirectByteBuffer,堆外内存