Netty學(xué)習(xí)之?dāng)?shù)據(jù)傳輸
前言
在前面的小節(jié)中,我們簡略地學(xué)習(xí)了Netty及Netty的核心組件,在本小節(jié)中,我們來學(xué)習(xí)一個重要但是不太好歸類的內(nèi)容,Netty的數(shù)據(jù)傳輸方式。
數(shù)據(jù)傳輸
在Netty中,Channel可以說是非常重要的一個組件了,數(shù)據(jù)之間的傳遞正是通過Channel來完成的。
在Netty中,Channel是線程安全的,所以一個Channel可以被其他線程引用,也可以在多線程環(huán)境下使用。
在Netty中,支持不同類型的傳輸方式,它們支持的協(xié)議不同,所以使用的時候需要選擇合適的類型
- NIO,使用Java中的NIO包,非阻塞,基于選擇器,Linux版本的JDK默認(rèn)就是使用Epoll
- Epoll,使用JNI調(diào)用Epoll(),非阻塞,只有在支持Epoll的Linux內(nèi)核中才能使用
- OIO,使用傳統(tǒng)的OIO,基于阻塞形式的流
- Local,在同一個VM中使用管線進(jìn)行通信
- Embedded,嵌入式,不需要真實的網(wǎng)絡(luò)環(huán)境,一般用于測試用途
零拷貝,零拷貝是一種只能在NIO和Epoll傳輸方式中使用的特性,允許開發(fā)者快速地,高效地將數(shù)據(jù)從文件系統(tǒng)移動到網(wǎng)絡(luò)接口,而不需要將其從內(nèi)核空間拷貝至用戶空間,能夠極大地提高如FTP、HTTP等的效率,但是并不是所有的OS都支持,而且不能在加密的文件系統(tǒng)中使用,當(dāng)然,傳輸加密了的數(shù)據(jù)塊還是可以的。
總結(jié)
本小節(jié)的內(nèi)容比較簡單,主要是Netty的不同類型的數(shù)據(jù)傳輸方式,由于不同的OS對不同的傳輸方式支持程度不同,所以在使用的時候,需要根據(jù)情況選擇,如果是Linux環(huán)境,并且內(nèi)核支持Epoll,最佳的選擇就是Epoll啦。