Netty介绍
Netty 是一个利用
Java
的高级网络的能力,
隐藏其背后的复杂性而提供一个易于使用
的
API
的客户端/
服务器框架。
Netty 是一个广泛使用的
Java
网络编程框架,在
2011
年获得了
Duke's Choice Award
。它活跃和 成长于用户社区,像大型公司 Facebook
和
Instagram
以及流行 开源项目如
Infinispan, HornetQ, Vert.x, Apache Cassandra 和
Elasticsearch
等,都利用其强大的对于网络抽象的核心代码。
有 了
Netty
, 就 可 以 实 现 自 己 的
HTTP
服 务 器 ,
FTP
服 务 器 ,
UDP
服 务 器 ,
RPC
服 务 器 WebSocket服务器,
Redis
的
Proxy
服务器,
MySQL
的
Proxy
服务器等等,也可以自定义编解码协议, 实现自己的特定协议的服务器。
Netty 与 Tomcat
Netty和
Tomcat
的区别就在于
通信协议
,
Tomcat
是基于
HTTP
协议的,他的实质是一个基于
HTTP 协议的web
容器,但是
Netty
不一样,能够通过
codec
自己来编码
/
解码字节流,支持多种通信协议,还能自定义协议,这就是Netty
和
tomcat
最大的不同。
BIO和NIO
BIO(阻塞型IO),读写socket时,要返回read/write必须先等请求消息来了/客户端收到消息,子线程才能进行下一个请求。
NIO(非阻塞型IO、事件驱动),使用BIO通信时,在高并发的环境下,BIO的线程数量会比较多,占用系统资源较多,等待处理的时间会比较长。这时使用NIO的话,它可以用一个线程把accept、读写操作和请求处理的逻辑全部完成。如果没有任务安排,它会将线程休眠直到下一个事件来了再被唤醒继续工作,这样的一个线程被称作NIO线程。
Netty特性
Netty的核心特性是
支持零拷贝的
bytebuf
缓冲对象
、
通用通信
api
和
可扩展的事件模型
;它支持多种传输服务并且支持HTTP
、
FTP
、二进制、文本、
WebSocket
等一系列常见协议,也支持自定义协议。
Netty的优势
并发高:
BIO
与
NIO
传输快:零拷贝(
ByteBuf
)
封装好:
API
简单,可扩展性强
其他:支持多种协议、用户基数大(使用广泛)、版本迭代快(社区活跃度高)。。。
Reactor线程模型
Netty的模型是基于
Reactor
线程模型,是典型的事件驱动模型。在网络编程中,事件指的是
read
、 write、
bind
、
connect
、
close
等动作。
Reactor
线程模型有很多种,
Netty
常用的是
Reactor
主从模型, 也可以基于Reactor
单线程模型和
Reactor
多线程模型进行灵活的配置。
Reactor单线程模型:一个Accept线程和一个NIO线程,NIO线程负责完成请求接收、IO读写、编解码、逻辑处理等工作
Reactor多线程模型:
多线程模型:相比于单线程模型,将非
IO
操作交由线程池处理。
Reactor主从模型:使用多个acceptor的NIO线程池,用于接受客户端的连接。其中mainReactor用于接收客户端请求并转发给subReactor。SubReactor(通常个数与cpu个数相等)负责通道的读写请求,非IO 请求(具体逻辑处理)的任务则会直接写入队列,等待 worker threads 进行处理。