先看定義:linux
Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients. It greatly simplifies and streamlines network programming such as TCP and UDP socket server.redis
可見Netty就是基於NIO的網絡(Socket)客戶端服務端實現框架,它簡化了TCP/UDP客戶端服務端編程,開發人員再也不關注底層的Socket讀取和寫入,並且Netty提供了很多的handler(如http、mqtt、redis協議等)實現,簡化了基於網絡協議的編程複雜度。算法
傳統的IO基於流(Stream),讀寫都是阻塞的,在讀取寫入Socket數據過程當中,線程什麼都不能作,而NIO裏面有個Selector,由它來監聽全部Channel相關的文件描述符(在linux中,設備、Socket鏈接等都對應文件描述符)狀態,這樣其餘線程(業務開發的工做線程)就能夠釋放出來,不被阻塞掉(若是涉及IO,能夠走Future異步處理),固然真正讀取數據的時候Channel對應的IO線程(在NIO中爲NioEventLoop)仍是阻塞讀寫的,但數據被保存到了Buffer中,後面的處理都是面向Buffer,再也不是面向流的了。編程
NioEventLoop主要包含兩部分操做:後端
Netty容許在非NIO線程中寫消息,若是當前線程是Channel對應的NIO線程則直接寫,若是不是,則寫消息操做會被封裝成一個WriteTask,而後再由NioEventLoop的runAllTasks()按期處理promise
相關代碼(見AbstractChannelHandlerContext.class):bash
private void write(Object msg, boolean flush, ChannelPromise promise) {
AbstractChannelHandlerContext next = findContextOutbound();
final Object m = pipeline.touch(msg, next);
EventExecutor executor = next.executor();
if (executor.inEventLoop()) {
if (flush) {
next.invokeWriteAndFlush(m, promise);
} else {
next.invokeWrite(m, promise);
}
} else {
AbstractWriteTask task;
if (flush) {
task = WriteAndFlushTask.newInstance(next, m, promise);
} else {
task = WriteTask.newInstance(next, m, promise);
}
safeExecute(executor, task, promise, m);
}
}
複製代碼
歷史文章:
網絡