netty 异步(asynchronous)与事件驱动(event-driven)
本章主要介绍java网络、介绍netty、netty核心模块
blocking i/o
传统的java版阻塞i/o编程,使用java原生API,要编写很多代码,并且这些api并没有经过装饰,所以比较臃肿。
示例:
1 | public class BlockingIoExample { |
试想一下,如果client数量有多少个,就有多少个线程,那么对于资源是极度浪费的,包括栈内存、堆内存、以及系统间线程的切换,以及内存的使用
non-blocking java NIO
java是在2002年的JDK1.4支持NIO
简介
- nio是使用setsockopt(),你自己可以配置sockets 读写请求,如果没数据这个将立即返回,如果有数据,则会堵塞。
- 可以通过注册一系列的非阻塞sockets 使用系统的事件提示API去决定是否有准备读写的数据
nio: new i/o
nio:non-blocking i/o
oio: old blocking i/o
选择器 selector
selector 是一个实现nio的关键因素,它使用了事件通知的API来表示,在一系列sockets中,哪些准备好了可以进行i/o事件,这样一个线程就可以通过selector监控处理多个sockets,这个模型提供给了一个更好的资源管理。
- 很多的连接可以通过一些线程去处理,因此可以减少堆内存溢出,减少多线程之间的切换
- 在没有nio处理的时候,这些线程可以处理其他任务
尽管nio的出现使得编写应用简单的多,但是想要正确并且安全的编写
introduce netty
design
多种传输格式使用统一的Api,包括阻塞与非阻塞。简单有力的线程模型、真正的无连接socket支持、链式逻辑部分重用支持
ease of use
大量的javadoc,以及很多例子、不要求支持jdk1.6以上
performance
更大的吞吐量、更小的时延远比传统的java Api好的多,并且通过pooling以及reuse减少资源的占用,最小的内存拷贝
robustness(强劲、结实)
不会由于慢、快以及超负载的连接导致outofMemoryError ,在传统nio高速网上排除不公平的读写速率
Security
完整的SSL/TLS 以及StartTLS支持。可用于限制环境、例如Applet 或者OSGI
Community-driven
非常快的迭代版本
asynchronous and event-Driven
异步
顾名思义,当你调用一个方法时,可以立即给你回复、如果这个事件没有完成,也会给你立即回复,然后一会儿当事件完成时通知你
事件驱动
一个问题与一个答案总是挂钩的(事务的处理逻辑),无论何时何地(当事件发生的时候(问题触发、事务触发))他都可以响应(答案)
netty 核心部分
channels
java NIO的基本构成,
一个(实体,例如硬件设备、文件、网络socket)打开的连接,一个或多个不同的I/o操作,例如读和写
可以认为channel 是一个进入、出去数据的载货车,当然,它可以关闭或打开,连接或断开Callbacks
回调方法,当事情发生了,会调用
Futures
future主要用于另外一种方式来通知应用,当操作完成的时候,相当于异步操作结果的占位对象,它可能在未来某个时间节点完成,并且提供完成的结果
netty 中的ChannelFuture提供额外的方法允许我们注册一个或者多个ChannelFutureListener 实例,当任务完成的时候,会进行这些监听器方法的调用,每一个outbound(往外发的数据)异步操作都会返回一个Future
- Event and handlers
基于时间触发后的处理可以包括:日志、数据转换、流控、应用逻辑
时间的类型:连接的active、inactive、数据读、用户事件、错误事件
出站的事件类型:打开或者关闭远程连接,写数据并且刷新到socket中