前言:
现在各位老铁们对“netty用在哪”大约比较着重,同学们都需要剖析一些“netty用在哪”的相关内容。那么小编也在网络上汇集了一些关于“netty用在哪””的相关资讯,希望兄弟们能喜欢,我们快快来学习一下吧!Netty是由jboss提供的一个java开源的框架。它提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
要了解netty的历史,避不开地要谈java io的三个阶段:BIO、NIO、AIO。
01
BIO(Blocking IO,阻塞式IO),是java最早期提供IO API,它的特点是连接是阻塞的,举个例子,就好像餐厅里来一个客人,餐厅就会给这个客人专门安排一个服务员,这个服务员就专门为这个客人服务,直到这个客人离开。反映在程序中就是每一个连接都享有一个线程的单独服务,像图1.1。
图1.1
BIO有很明显的缺陷:
(1)线程创建资源开销巨大;如果有一万个连接怎么办?开一万个连接明显很不现实,系统开销太大。
(2)单个线程资源浪费;连接在创建后并不是一直处理工作状态,中间很有可能是等待状态,处于等待状态的连接不会主动释放资源。
针对阻塞的情况,可以使用线程池的方式来改进,但是依然无法解决大数量连接情况下的资源浪费问题。
02
NIO(non-blocking IO,非阻塞式IO)。在jdk 1.4时提供了nio的功能,与bio不同,nio可以实现非阻塞式的连接,只用一个线程就可以处理大量的连接。Nio的关键就是Selector(称做多路复用器),所有的连接都会被注册到Selector,并监听相关事件,当有相关事件发生时,会被通知到Selector,这个时候我们就知道我们关注的事件发生了,然后再去处理。这样就节省了很多系统开销。
图2.1
Selector的实现利用了Linux内核中的epoll,这里涉及的知识过于底层,先了解这么多。
03
AIO(Async IO,异步IO),异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。
Netty的底层封装了nio,简化了nio的复杂api,使得我们可以专心于业务实现,降低开发门槛,极大地简化了网络编程的难度。
下面是两个Server端的代码比较:
Nio Server端代码示例:
Netty Server端代码示例:
netty的示例代码中我们使用了多Reactor线程模型,分别为bossGroup和workerGroup,bossGroup负责连接,workerGroup负责具体处理;示例代码部分大部分为模板代码,我们只需要在channel pipleline中增加一个我们自己定义的channelHandler。最简单的方式是继承SimpleChannelInboundHandler类,重写其中的channelRead0和exceptionCaught方法。channelRead0中写我们的具体的业务逻辑,exceptionCaught是当我们的程序出现异常时,默认调用的异常处理方法。将我们自定义的channelHandler的子类EchoHandler加入到ChannelPipeline中,我们的业务逻辑就会被调用。ChannelPipeline是由多个ChannelHandler组成的,它使用了责任链模式,使得所有的ChannelHandler被依次执行。
标签: #netty用在哪