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!
[来源:http://janeky.iteye.com/blog/1844201]
分类目录
- arch/management (17)
- computer (38)
- java/j2ee (305)
- lnmpa (237)
- mac/iphone/ipad/android (11)
- mysql/oracle/postgresql (126)
- os/software (74)
- other (518)
- python (6)
- redis/memcached/mongo (31)
- sitebuild (143)
随便看看
标签云
程序员 创业 人生箴言 eclipse 快捷键 术语 索引 unix命令 vim wordpress java学习笔记 环境变量 oracle内置函数 index 人生 数据类型 nohup tuxedo mysql学习笔记 MS-DOS命令 servlet spring 职场进阶 职业进阶 服务器选购 服务器选型 apache JPA MongoDB 注解 tomcat 子女教育 jquery maven JVM aix命令 网络营销 java异常 seo 人生规划 关键字 css 网络推广 struts 系统优化 成长 frame iframe bluehost jdbc select 我的信仰 oracle函数 cookie HashMap 站长工具 乱码 ArrayList secureCRT jsp session tail find halt 事务 oracle单记录函数 算法 URL window table javascript操作表单元素 String 字符串处理 健康 http 域名 情感 more google A记录 域名解析 netstat 弹出对话框 弹出窗口 框架集 框架 excel 字符串 javascript函数 showModalDialog nginx number 数组 sql frameset 开源程序 java数组 软件 oracle服务友情链接
收藏链接