Netty5值得关注的变化

Netty5版本不像Netty3到Netty4的变化那么巨大。

核心变化


<1> 简化了handler类型分级结构
合并ChannelInboundHandler与ChannelOutboundHandler到ChannelHandler。ChannelHandler现在具有inbound与outbound的方法。
废弃了ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter和ChannelDuplexHandlerAdapter,新增ChannelHandlerAdapter。

 

<2> channelRead0()改名为messageReceived();

 

<3> 更灵活的线程模型
在Netty4.x中,每个EvenLoop被紧紧绑定到一个固定的线程,这个线程会执行注册到它这的channels的所有IO事件以及其它提交过来的任务。
从5.0版本开始,EventLoop不再直接使用线程,转而使用Executor作为抽象层。因此,新版本中,EventLoop的构造函数新增了一个Executor参数。同时,不会在无限循环中去轮询I/O事件,而是提交任务给Executor去做这个事。
除非指定,否则Netty使用JDK提供的ForkJoinPool作为默认的Executor。ForkJoinPool有一个不错的属性——使用线程本地(thread local)队列。因此,从Thread A提交的Task极有可能会再次在Thread A执行。这可以给EventLoops提供更高水平的线程亲和性。
此外,开发者也许会想使用自己的Executor来接管EventLoops的调度。有一种场景,这种方式证明是有用的——即Netty是作为一个大规模软件系统的一部分。假设系统已经使用了一个线程池来以最优方式并行执行所有的任务,尽管是系统的一部分,在Netty 4.x中,还是只能使用自己的线程。但从Netty 5.0开始,开发者可以将Netty与其它系统运行在同一个线程池中,通过应用更好的调度策略与减少调度开销可能会提高性能。
但是,这些关于线程模型的变化不会影响ChannelHandlers的开发。从开发者的角度来看,唯一的变化在于ChannelHandler不再保证总是在同一个线程中执行,但是,同一个时间,ChannelHandler不会在多个线程中执行。另外,Netty也会处理任何可能发生的内存可视化问题。所以,不用担心ChannelHandler中的线程安全问题与volatile变量。
这个变化的影响是NioEventLoop,NioEventLoopGroup,EpollEventLoop与EpollEventLoopGroup不再使用ThreadFactory作为构造函数参数,而是使用Executor和ExecutorFactory。

 

<4> 更好的Channel.deregister

 


如果未说明,本Blog中文章皆为原创文章,请尊重他人劳动,转载请注明: 转载自jmatrix

本文链接地址: Netty5值得关注的变化

(注:一般引用了,我都会添加引用,如果有侵权的请联系我)



This entry was posted in 译文. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Trackbacks are closed, but you can post a comment.