您的位置:首页 > 其它

学习Netty in action第一章心得

2016-04-23 19:55 351 查看
继续上一篇文章,选择Netty作为通信服务器。今天启程阅读Netty资料。

本来想看Netty权威指南的。国内第一本系统介绍Netty的书。然而,当我打开豆辫,显示的是一片差评。被吐槽最多的是赶工明显,凑字数,大篇幅日志。客观来说,适合新手。

这也满足了我的需求了。

只是看到国外也有一本叫Netty in action。看评价还蛮不错。

又想学英语,那就选择它吧。

看目录,很简洁呀,才只有4章。目前我看完第一章了。正式总结第一章的内容。

jdk 提供了IO,NIO库。

先说IO库

使用IO库做通信服务器,是非常古老的事情了。

服务器的模型是1个客户端链接对应服务器一个线程。

昨天测试mac下一个进程默认只有2077个线程,看其他资料,window系统有5千多,linux默认是1024.当然,这都是可以改的配置。

频繁创建和删除线程,消耗系统资源。也不可能满足现在百万级别的connection。

然后是NIO库

N的意思就是non_blocking 非阻塞

新增了ServerSocketChannel,SocketChannel等channel,

channel是对应了一个entity,它具有一些IO的操作。

新增了Selector类,用于管理Channel

模型就是每一个客户端是一个Channel,都交给一个Selector管理,selector判断3种情况:

1.accept 有新的客户端请求connection

2.read 客户端请求read operation

3.write 客户端请求 write operator

分别处理。书上提到seletctor采用的是epoll模型,但我觉得它应该是采用select模型。

这样子,就是一个线程处理了所有客户端请求了。

jdk 1.7下,NIO库有修改,就称为NIO2

NIO2提供了AsynchronousServerSocketChannel,

AsynchronousSocketChannel

回调接口

CompletionHandler

其实是参考了nodejs的回调函数。

每当有新的客户端请求,请求成功后就调用回调类CompletionHandler,去读取客户端AsynchronousSocketChannel发过来的数据,当读完之后,又有一个回调类,专门负责客户端读写操作。反正就是读写完后回调自己,看还有没有其他事情干。

回调函数反正现在是觉得编写起来很别扭。以后得熟悉怎么搞。参考别人nodejs是怎么做的。

我觉得NIO2才是采用了epoll模型。因为就我简单的认知,epoll是一个事件驱动的模型,回调就是事件驱动的。

后续章节,讨论了NIO的不足,而Netty做了修正

第一,跨平台。Linux下原生NIO库的程序,跑的好好的,window下就可能出问题。你的程序要在不同平台上测试,都OK才OK。

Netty修复了这个问题,真正的跨平台。

第二,NIO底层是采用ByteBuffer类来收发网络数据的。但是jdk不提供该类的数组类,有些操作就不方便了。

Netty编写了一个自己的ByteBuffer类,提供需要的功能。

第三,数据分割聚合Scattering and gathering

jdk7和jdk6 update 才提供了这两个功能,使得channel的数据分割成多个ByteBuffer,或者聚合到一个Channel上。低版本的jdk若要实现这些功能,容易导致内存泄漏。

神奇的是,Netty修复了这个问题,使得不在乎jdk版本了。

第四,epll模型的bug

这个bug就是selcector一直在查看Channel状态,就是while(true),导致CPU一直在跑,浪费了系统resource。

神奇的是,Netty也规避了这个问题。

Netty如何修正问题,第一章没有介绍。

后续等待第二章吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: