netty现在应该是java界最流行的网络框架之一了,高性能,可扩展,代码优雅。之前做的页游都是用netty3.x来做网络层通信。最近看到netty4快要出来了,一些新的特性还是很值得推介的。
ChannelBuffer变成了ByteBuff。还引入了Buff对象池Unpooled来管理回收不用的buff,避免gc的频率。在netty3中,buff都是固定大小或者dynamic(write*需要更多的空间)。
为了解决这些问题。 netty4中的所有buff都是动态大小的,可以随意更改capacity,并且性能更好。
CompositeByteBuf是新引入的,可以避免大块内存的拷贝。当你需要组合一个新的buff时,用Unpooled.wrappedBuffer(...)或者Unpooled.compositieBuff(...) 重点要介绍一些ByteBuf对象池,当一个ByteBuf被对象池回收后,可以重复利用,从而避免了频繁的内存分配和gc。当一个ByteBuf被write到目标socket是,它会自动被回收到对象池。
概念的更改,变得更容易理解了。Upstream变成Inbound,Downstream变成了Outbound。
之前netty3每次io读写,都会new一个ChannelBuffer,会导致gc频繁。netty4将socket的数据直接存入inbound buffer,并且使用了对象池技术后会改善这种状况。
netty3的事件处理笼统归为handleUpstream和handleDownstream 。
netty4引入了更具体的事件,包括:
void channelRegistered(ChannelHandlerContext ctx) throws Exception;
void channelUnregistered(ChannelHandlerContext ctx) throws Exception;
void channelActive(ChannelHandlerContext ctx) throws Exception;
void channelInactive(ChannelHandlerContext ctx) throws Exception;
void inboundBufferUpdated(ChannelHandlerContext ctx) throws Exception;
netty4还简化了channel状态模型。之前一个channel connect后,会触发channelOpen, channelBound, 和 channelConnected.
channel关闭后会触发 channelDisconnected, channelUnbound, 和channelClosed.
上面的几个事件被合并成channelActive 和 channelInActive。 messageReceived 和 writeRequested 被 inboundBufferUpdated 和flush 替换了。
Channel支持 half-closed,可以指定关闭后接收剩余的数据。
netty4中,EventLoopGroup取代了ChannelFactory,一个channel必须显式地registere 到EventLoopGroup。这样有个好处,就是在不同的业务中,Channel可以随时deregister和registered到某个EventLoopGroup中去。
EventLoop 是本质上也是一个ScheduledExecutorService,所以一个channel的一些定时操作也可以交由它去执行。从而保证了一个channel的所有操作都是在同一个线程中执行了。。这样的内存模型可以简化很多的线程问题。
之前ChannelConfig 的配置项项都是用字符串定义的。容易出问题。netty4重新定义了常量。例如 cfg.setOption(ChannelOption.TCP_NODELAY, true);
引入了AttributeMap,可以存储任何对象到Channel中。
netty4的改进是很值得推荐的,尤其是内存分配方面的改进,今后更高并发的系统将变得可能,gc造成的延迟也讲得到改善。 准备在netty4正式版出来,稳定之后用于下一个新游戏项目中。到时再跟大家分享一些心得和体会。
准备将blog搬到这里了,希望能跟大家多分享交流技术,thanks