学习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如何修正问题,第一章没有介绍。
后续等待第二章吧
本来想看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如何修正问题,第一章没有介绍。
后续等待第二章吧
相关文章推荐
- leetcode 119.Pascal's Triangle II-杨辉三角形
- 数组足够大加零声明char*
- 第八周作业
- UESTC 1215 (思维题 旋转)
- Node.js缓冲器
- 输入一个字符串,计算字符串中子串出现的次数
- 个人工作总结5
- 修改textField的placeholder的字体颜色、大小
- Tomcat项目部署方式
- 关于用ObjectInputStream遍历读取文件中的对象,如何判断到达文件末尾
- 数据挖掘工作指南(1)
- pickle序列化
- iOS 拨打电话三种方式总结
- 网络互联
- 在Linux中安装sqldeveloper
- 网络编程_简单客户端和服务器实现
- Java enum的用法详解
- Node.js开发入门(十一)——MongoDB与Mongoose
- FFmpeg-20160418-snapshot-bin
- 任何关于IOS app《地点闹钟》的问题欢迎在这里留言~