Netty - 传输
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
Channel
Netty 傳輸API的核心是:interface Channel,被用于所有的I/O操作。類層次結構:
- Interface:ServerChannel
- Class:AbstractChannel
- HasA:ChannelPipeline ChannelConfig
Netty的Channel實現(xiàn)是線程安全的。 (1)為什么繼承Comparable? 因為Channel獨一無二,為了保證順序。
ChannelPipeline
持有所有將應用于入站和出站數(shù)據(jù)以及事件的 ChannelHandler 實例(實現(xiàn)了應用程序用于處理狀態(tài)變化以及數(shù)據(jù)處理的邏輯)。 可以理解為一種攔截過濾器模式,多個ChannelHandler被鏈接到一起,其中一個handler的輸出將作為下一個handler的輸入。使用一個特性,可以構建出很靈活的應用程序,可以根據(jù)需要添加或者移除ChannelHandler。類層次結構:
ChannelHandler
作用:
- 將數(shù)據(jù)從一種格式轉換為另一種格式
- 提供異常的通知
- 提供Channel變?yōu)榛顒拥幕蛘叻腔顒拥耐ㄖ?/li>
- 提供當Channel注冊到EventLoop或者從EventLoop注銷時的通知
- 提供有關用戶自定義事件的通知
傳輸 - NIO 非阻塞 I/O io.netty.channel.socket.nio
使用java.nio.channels包作為基礎 - 基于選擇器的方式。 零拷貝(zero-copy):只有在使用NIO和Epoll傳輸時才可使用的特性。可以快速高效將數(shù)據(jù)從文件系統(tǒng)移動到網絡接口,而不需要將其從內核空間復制到用戶空間。對于數(shù)據(jù)加密或者壓縮的文件系統(tǒng)不可用----只能傳輸文件的原始內容。
傳輸 - Epoll 用于Linux的本地非阻塞傳輸 io.netty.channel.epoll
由JNI驅動的epoll()和非阻塞IO。這個傳輸支持只有在Linux上可用的多種特性,如SO_REUSEPORT,比NIO傳輸更快,非阻塞。 如何啟用? 將NioEventLoopGroup替換為EpollEventLoopGroup,將NioServerSockertChannel替換為EpollServerSocketChannel。
傳輸 - OIO 舊的阻塞 I/O io.netty.channel.socket.oio
使用java.net作為基礎 - 使用阻塞流。
傳輸 - Local io.netty.channel.local
可以在VM內部通過管道進行通信進行通信的本地傳輸。
傳輸 - Embedded io.netty.channel.embeded
Embedded傳輸,允許使用ChannelHandler而又不需要一個真正的基于網絡的傳輸(常用來測試ChannelHandler的實現(xiàn))。
傳輸最佳實踐
- 非阻塞代碼庫或一個常規(guī)的起點,推薦 -> NIO(Linux上使用epoll)
- 阻塞代碼庫,推薦 -> OIO
- 在同一個JVM內部的通信,推薦 -> Local
- 測試ChannelHandler的實現(xiàn),推薦 -> Embedded
轉載于:https://my.oschina.net/javamaster/blog/2996249
總結
以上是生活随笔為你收集整理的Netty - 传输的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大三前端实习生2018总结
- 下一篇: [SHOI2008]小约翰的游戏