netty
目录
1为什么Netty 会诞生 1
2说说netty是什么? 1
3为什么使用netty? 1
4netty可以用来做什么事情? 1
5netty的核心组件了解吗?分别有什么作用? 2
5.1网络通信层有三个核心组件,Bootstrap、ServerBootStrap、Channel。 2
6说说Netty 有几种线程模型吧? 2
6.1谈谈你对这三种线程Reactor模型的理解?原理?分别起到什么作用? 3
1为什么Netty 会诞生
为了解决NI0 编码复杂,但是又想使用NIO,所以netty来了,netty 通过对nio复杂的api进行了封装,使得netty在具备高性能、高吞吐量、低延迟的前提下,还能方便开发人员进行快速开发。
2说说netty是什么?
Netty是一个基于NIO模型的高性能网络通信框架。其实可以认为是对NIO网络模型的封装,提供了简单易用的api,我们可以利用这样一些封装好的api去快速开发自己的网络程序,netty在NIO的基础上做了很多优化,比如零拷贝机制,高性能无锁队列,内存池,因此性能要比nio要高。Netty可以支持多种通信协议,比如http,websocket协议,并且针对数据通信,拆包粘包的一些问题,内置了拆包策略,所以我们在整个使用过程中非常方便。
3为什么使用netty?
Netty相对于直接去使用jdk自带的nio相关的api来说,会更加简单,具备一些特点:
第一, 统一的api,支持多种传输类型,比如阻塞,非阻塞,以及epoll,poll等模型。
第二, 可以使用非常少的代码来实现。多线程reactor模型以及主从多线程reactor模型。
第三, 自带编解码器,去解决tcp粘包,拆包的问题。
第四, 自带各种通信协议。
第五, 相对于自己使用java库里面的nio的话,它提供了一个更高的吞吐量,以及更低的延迟,更低的资源消耗和更少的内存复制。
第六, 安全性很好,有完整的ssl/tls的支持,
第七, 社区活跃度非常好,版本迭代非常稳定。经历了各种大的项目的考验,比如dubbo、zookeeper、rocketMQ,他们都有用到netty
4netty可以用来做什么事情?
我们之所以要用netty,核心的点还是解决服务器如何去承载更多的用户同时访问的问题,传统的bio模型,由于他阻塞的一个特性,使得我们在高并发的场景中很难去支持更高的吞吐量,后来我们去基于nio多路复用模型。虽然可以在阻塞方面进行优化,但是他的api使用比较复杂,对于初学者来说不是特别友好,而netty是基于nio的一个封装,提供了成熟简单易用的api,降低了使用成本和学习成本。
本质上来说,netty和nio所扮演的角色是相同的,都是为了去提升服务端的吞吐量,让用户获得更好的产品体验。另外,netty这个中间件经历了很多年的考证,本质上来说netty和nio所扮演的角色是一样的,都是为了更好的用户的产品体验。
5netty的核心组件了解吗?分别有什么作用?
Netty是由三层结构构成的,网络通信层,事件调度层,服务编排层。
5.1网络通信层有三个核心组件,Bootstrap、ServerBootStrap、Channel。
Bootstrap呢负责客户端启动,并且去连接远程的nettyServer,而serverBootStrap是为了负责服务端的监听,用来监听指定的一个端口,channel呢是网络通信的一个载体(事件调度器),事件调度器有两个核心角色,EventLoopCroup与EventLoop。
EventLoopGroup呢本上是一个线程池,主要去负责接收IO请求,并分配线程去执行处理请求。
EventLoop是相对于线程池里面的一个具体线程,在服务编排层呢有三个核心组件,ChannelPipeline,ChannelHandle以及 channelHandlerContext。
ChannelPipeline是负责处理多个Channelhandler。他会把多个Channelhandler的构成一个链,去形成一个PipeLine。
ChannelHandle呢主要是针对 IO 数据的一个处理器,数据处理接收。数据接收后呢,通过指定的一个Handler进行处理。
ChannelHandleContext是用来去保存ChannelHandler的一个上下文信息的
6说说Netty 有几种线程模型吧?
Netty提供了三种reactor模型的一个支持,第一种是单线程单Reactor模型,第二种是 多线程单Reactor模型,第三种是多线程多Reactor模型,也叫主从多线程Reactor模型。
6.1谈谈你对这三种线程Reactor模型的理解?原理?分别起到什么作用?
Reactor他有三个重要的组件,第一个是reactor是负责将io事件,分派给对应的handler。第二个是acceptor,他是处理客户端的连接请求。第三个是handlers,去执行我们的业务逻辑的读写操作。这是最基本的reactor的模型组件。
连接进来到io事件处理都是一个线程来处理的、单线程但reactor模型
多线程单reactor模型。
单reactoe多线程模型,所有的业务场景都由reactor来处理io,小容量场景没什么问题,高并发情况下,很容易会因为单reactor的阻塞或者带来的一个性能瓶颈。导致整个吞吐量有影响。所以当这个线程的超过负载之后,处理速度会变慢,就会导致大量客户端连接超时,超时以后就会重发,这反而加重了这个线程的一个负载,最终会导致大量的消息的积压和处理的超时,成为了整个系统的性能瓶颈。所以我们还可以进行进一步的优化,也就是引入多线程多reactor模型,所谓多线程多reactor模型也叫做
主从模型。MainReactor它是负责接收客户的连接请求。然后把接受的请求传递给subReactor,其中subReactor我们可以配置多个。这样的话我们可以进行灵活的扩容和缩容。具体的业务io由subReactor去完成,最终去绑定给对应的handler,那么subreactor他还是扮演一个请求。接收者没有发生变化。那么subreactor他还是会扮演一个请求,接收者没有任何变化,他会把接受的请求呢,转发到mainReactor来处理,MainReactor再去交给subreactor来进行真正意义上的分发。
浙公网安备 33010602011771号