深入理解Netty以及为什么项目中要使用?(三)Netty框架的使用
为什么选择Netty
Netty其实就是一个高性能NIO框架,所以它是基于NIO基础上的封装,本质上是提供高性能网络IO通信的功能。
Netty提供了上述三种Reactor模型的支持,我们可以通过Netty封装好的API来快速完成不同Reactor模型的开发,这也是为什么大家都选择Netty的原因之一,除此之外,Netty相比于NIO原生API,它有以下特点:
提供了高效的I/O模型、线程模型和时间处理机制
提供了非常简单易用的API,相比NIO来说,针对基础的Channel、Selector、Sockets、Buffers等api提供了更高层次的封装,屏蔽了NIO的复杂性
对数据协议和序列化提供了很好的支持
稳定性,Netty修复了JDK NIO较多的问题,比如select空转导致的cpu消耗100%、TCP断线重连、keep-alive检测等问题。
可扩展性在同类型的框架中都是做的非常好的,比如一个是可定制化的线程模型,用户可以在启动参数中选择Reactor模型、 可扩展的事件驱动模型,将业务和框架的关注点分离。
性能层面的优化,作为网络通信框架,需要处理大量的网络请求,必然就面临网络对象需要创建和销毁的问题,这种对JVM的GC来说不是很友好,为了降低JVM垃圾回收的压力,引入了两种优化机制
对象池复用,
零拷贝技术
Netty的基本使用
添加jar包依赖
使用4.1.66版本
创建Netty Server服务
大部分场景中,我们使用的主从多线程Reactor模型,Boss线程是主Reactor,Worker是从Reactor。他们分别使用不同的NioEventLoopGroup
主Reactor负责处理Accept,然后把Channel注册到从Reactor,从Reactor主要负责Channel生命周期内的所有I/O事件。
public class NettyBasicServerExample {
public void bind(int port){
// 我们要创建两个EventLoopGroup,
// 一个是boss专门用来接收连接,可以理解为处理accept事件,