netty现在应该是java界最流行的网络框架之一了,高性能,可扩展,代码优雅。之前做的页游都是用netty3.x来做网络层通信。最近看到netty4快要出来了,一些新的特性还是很值得推介的。
- 1.Buff
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是,它会自动被回收到对象池。
- 2.Channel
概念的更改,变得更容易理解了。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,可以指定关闭后接收剩余的数据。
- 3.I/0线程分配
netty4中,EventLoopGroup取代了ChannelFactory,一个channel必须显式地registere 到EventLoopGroup。这样有个好处,就是在不同的业务中,Channel可以随时deregister和registered到某个EventLoopGroup中去。
EventLoop 是本质上也是一个ScheduledExecutorService,所以一个channel的一些定时操作也可以交由它去执行。从而保证了一个channel的所有操作都是在同一个线程中执行了。。这样的内存模型可以简化很多的线程问题。
- 4.配置项和attach对象
之前ChannelConfig 的配置项项都是用字符串定义的。容易出问题。netty4重新定义了常量。例如 cfg.setOption(ChannelOption.TCP_NODELAY, true);
引入了AttributeMap,可以存储任何对象到Channel中。
- 总结
netty4的改进是很值得推荐的,尤其是内存分配方面的改进,今后更高并发的系统将变得可能,gc造成的延迟也讲得到改善。 准备在netty4正式版出来,稳定之后用于下一个新游戏项目中。到时再跟大家分享一些心得和体会。
thanks!
相关推荐
Netty应用中文详解
Netty4.x源码分析详解
NULL 博文链接:https://bijian1013.iteye.com/blog/2340977
java_Netty权威指南,详解nio,tcp,http,netty.rar
4、使用IDEA分别导入NettyClient和NettyServer在两个窗体中 5、在服务端输入指定的端口,然后点击“启动Nettye服务器按钮”启动服务端。 6、在客户端输入服务IP地址和端口,然后点击“开启客户端”按钮。 如果一切...
netty超实用课程讲解,从开始到精通的一步步讲解,内含netty的高级应用和使用场景
Netty快速入门视频全套详解教程(内附有网盘链接地址),讲的非常详细,每个知识点附有代码demo
netty深入学习包括重要地方的源码分析以及java nio的详解,绝对干货!!!
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输示例代码.
从IO流到BIO,再到NIO,AIO,以及Reactor模式和Proactor模式来分析netty
24_gRPC整合Gradle与代码生成············82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析;83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析;84_Netty引用计数注意事项与...
主要介绍了使用Netty解决TCP粘包和拆包问题过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
82_Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 83_AtomicIntegerFieldUpdater实例演练与volatile关键字分析 84_Netty引用计数注意事项与内存泄露检测方式 85_Netty编解码器剖析与入站出站处理器...
第82讲:Netty引用计数原子更新揭秘与AtomicIntegerFieldUpdater深度剖析 第83讲:AtomicIntegerFieldUpdater实例演练与volatile关键字分析 第84讲:Netty引用计数注意事项与内存泄露检测方式 第85讲:Netty编...
基于Netty5.0的高级案例NettyWebsocket,详情请参见博文:http://blog.csdn.net/l1028386804/article/details/55026558
由于netty各个版本之间差异较大,这里整理了一下各个版本的包及样例,使用了maven工程,将各个版本需要的最简jar文件已配置完全,可以在些基础上进行正式项目的开发。
1、netty宏观理解 2、netty的scoket编程详解 3、netty多客户端连接与通信 4、netty读写检测机制与长连接要素 5、protobuf多协议消息支援与工程最佳实践 6、grpc通信示例与数据通信详解 .........
主要介绍了SpringBoot整合Netty心跳机制过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了springboot整合netty过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下