什么是Netty
Netty是Java的网络框架,提供一个简易的API给我们开发客户端/服务器.
Java网络处理几种方式
-
使用JAVA API原生的socket方式处理
这种方式为阻塞式,缺点很明显.每次只能处理一个连接.为了处理多个并行的客户端,我们需要分配每一个新的Thread给每个新的客户端,来支持同步和长连接.在任何时间点多线程可能处于休眠状态,这时候如果不进行输入或者输出数据就会浪费大量的资源.
JAVA NIO - JAVA NIO
NIO旧时意思是New Input/Output,现在为Nonblocking I/O. - SELECTOR
SELECTOR
如图所以,和JAVA NIO区别是Selector最终决定哪个socket准备执行I/O.通过这种方式,一个线程可以同时处理多个并发链接.(一个Selector由一个线程处理,但是具体实施可以使用多个线程.).这种模式把资源更好地使用,因为- 可以用较少的线程处理更多的连接,意味着更少的开销在内存和上下文切换上.
- 当没有I/O处理时,县城可以被重定向到其他任务上.
Netty的特点:
- 设计
- 针对多种传输类型的统一接口 - 阻塞和非阻塞
- 简单但更强大的线程模型
- 真正的无连接的数据报套接字支持
- 链接逻辑支持复用
- 易用性
- 大量的 Javadoc 和 代码实例
- 除了在 JDK 1.6 + 额外的限制。(一些特征是只支持在Java 1.7 +。可选的功能可能
有额外的限制。)
- 性能
- 消除由于慢,快,或重载连接产生的 OutOfMemoryError
- 消除经常发现在 NIO 在高速网络中的应用中的不公平的读/写比
- 安全
- 完整的 SSL / TLS 和 StartTLS 的支持
- 运行在受限的环境例如 Applet 或 OSGI
- 社区
- 发布的更早和更频繁
- 社区驱动
构成部分
-
Channel
Channel的意思是渠道,是NIO基本结构.可以把它看成一种连接作用的组件,是数据传输的一种工具.
-
Callback
Callback意思是回调,提供一个方法给另一种方法引用,另一种方法可以在自己需求的情况下(比如需要解码),调用callback方法.
-
Future
Future提供了另外一种通知应用操作已经完成的操作.这个对象作为一个异步操作结果的占位符,它将在将来的某个时候完成并提供结果.
Netty中,提供了ChannelFuture,ChannelFuture提供了多个附件方法允许一个或者多个ChannelFutureListener实例.我们可以通ChannelFutureListener的监听机制不需要手动检查操作是否完成.
每一个Netty的outbound I/O操作都会返回一个ChannelFuture,这样才不会阻塞.这就是Netty所谓的"自底向上的异步和事件驱动".
-
Event和Handler
如图所示,其实每个处理器实例就是一个回调,用来执行对各种事件的处理.
Netty通过触发事件从应用程序中抽象出Selector,而EventLoop分配给每个Channel来处理所有的时间,包括
- 注册事件
- 调度handler
- 安排其他的动作
EventLoop本身只有一个线程驱动,它给一个Channel处理所有的I/O事件,并且在它的生命周期内是不会变的.
网友评论