1. 程式人生 > >netty初步,與各個版本的比較

netty初步,與各個版本的比較

1.入門文件
如果是入門的話,官網的文件已經相當好了。裡面的例子程式得仔細閱讀,這裡就不再重複轉載了。參見http://netty.io/wiki/user-guide.html

2.為什麼需要netty
2.1 主要是scalibity和performance

2.2 另外Netty In Action有一些說明,筆記如下:

2.2.1 傳統的非同步程式設計有2種模式:callback和Future

2.2.2 3種API比較
BIO: N個連線N個Thread
NIO: N個連線1個Selector-->1個Thread
NIO2:CompletionHandler避免了Selector的輪詢(JDK7)

這張圖是BIO和NIO的比較。


2.2.3 JDK的問題:
1.跨平臺:linux上OK,windows上卻出問題
2.ByteBuffer無法擴充套件
3.scattering gathering可能有記憶體洩露(直到java6的後期update版本或者Java7才解決)
4.epoll bug,可導致CPU 100%。  https://github.com/netty/netty/issues/327
Netty解決了以上4點問題。


3.Netty3,4,5 API不同點

本文寫作時,各版本的最新版如下:
netty3 3.9.0
netty4 4.0.18
netty5 5.0.0 Alpha1


3.1 ChannelHandler的變化
首先有一些術語需要理解,請參見下面的表格和3張圖,從中可以看到netty3,4,5之間的很大的不同。

收訊息 上行,入站 InputStream.read(byte[])
發訊息 下行,出站 OutputStream.write(byte[]), Socket.connect(SocketAddress), Socket.close()


Netty3使用了上行下行的概念


Netty4使用了入站出站的概念


Netty5則乾脆取消了兩者的劃分,統一為一個概念


Netty3: ChannelHandler有兩個子介面ChannelUpstreamHandler,ChannelDownstreamHandler,
上行和下行,這裡的上行和下行和我們一般理解上的上下行不太一樣,為何如此可以參考上面的3張圖。
相應的類有SimpleChannelUpstreamHandler,SimpleChannelDownstreamHandler,以及一個同時實現兩個介面的SimpleChannelHandler




Netty4: 介面變成了ChannelInboundHandler ChannelOutboundHandler,可能是為了避免原來的上下行造成誤解,所以改成入站和出站了。
相應的類有ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter,我們只要選擇一個繼承就可以了。




Netty5: 取消了進站、出站的劃分,統一為繼承ChannelHandlerAdapter,原來的ChannelInboundHandlerAdapter,ChannelOutboundHandlerAdapter被廢棄。



ChannelHandler的API,從中可以看到netty3,4,5之間的很大的不同。


3.2 BootStrap的變化

3.2.1 netty4構造ServerBootstrap時採用了構建者模式,使得程式碼更優雅。
Java程式碼  收藏程式碼
  1. EventLoopGroup bossGroup = new NioEventLoopGroup();  
  2. EventLoopGroup workerGroup = new NioEventLoopGroup();  
  3. ServerBootstrap b = new ServerBootstrap();  
  4. b.group(bossGroup, workerGroup)  
  5.  .channel(NioServerSocketChannel.class)  
  6.  .childHandler(new ChannelInitializer<SocketChannel>() {  
  7.     @Override
  8.     publicvoid initChannel(SocketChannel ch) throws Exception {  
  9.         ch.pipeline().addLast(new DiscardServerHandler());  
  10.     }  
  11. })  
  12.  .option(ChannelOption.SO_BACKLOG, 128)  
  13.  .childOption(ChannelOption.SO_KEEPALIVE, true);  

而netty3則是用最平常的setter。
Java程式碼  收藏程式碼
  1. ChannelFactory factory = new NioServerSocketChannelFactory(  
  2.     Executors.newCachedThreadPool(),  
  3.     Executors.newCachedThreadPool());  
  4. ServerBootstrap bootstrap = new ServerBootstrap(factory);  
  5. bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  6.     public ChannelPipeline getPipeline() {  
  7.           return Channels.pipeline(new DiscardServerHandler());  
  8.     }  
  9. });  
  10. bootstrap.setOption("child.tcpNoDelay"true);  
  11. bootstrap.setOption("child.keepAlive"true);  


3.2.2 對比一下netty3和4,我們發現netty4因為採用了泛型的寫法(.channel(NioServerSocketChannel.class)),所以NioServerSocketChannelFactory就不需要透露給使用者了,這個工廠也被取消了。

3.2.3 另外netty4引入了ChannelOption的常量定義,注意這個類是泛型的(ChannelOption<T>),用了這個技巧從而可以確保賦值安全,使得SO_BACKLOG只能傳一個int進來,SO_KEEPALIVE只能傳一個boolean進來。
Java程式碼  收藏程式碼
  1. publicstaticfinal ChannelOption<Integer> SO_BACKLOG  
  2. publicstaticfinal ChannelOption<Boolean> SO_KEEPALIVE  


Bootstrap的API,netty4相比netty3有比較大的變化,而netty5和netty4比則基本相同。

作為初步,暫時先分析到這裡。其餘不同點有待以後繼續分析。

相關推薦

netty初步各個版本比較

1.入門文件 如果是入門的話,官網的文件已經相當好了。裡面的例子程式得仔細閱讀,這裡就不再重複轉載了。參見http://netty.io/wiki/user-guide.html 2.為什麼需要netty 2.1 主要是scalibity和performance 2.2 另外Netty In Action有一

JBoss、Tomcat、JBoss EAP、JBoss AS、wildflyJBoss EAP安裝部署JBoss各個版本下載JBoss允許遠端訪問

感謝: https://www.cnblogs.com/invlong/p/5983334.html https://blog.csdn.net/mooncarp/article/details/78431849 https://blog.csdn.net/zmh458/article/

Linux安裝JDKTomcatJDK版本替換的方法

一,JDK,Tomcat下載 從Orcale官網下載與系統匹配的jdk版本。Orcale官網  可以在首頁下方的歷史倉庫中選擇自己想要的jdk 找到倉庫入口下載自己想要的Tomcat: 將下載下來的jdk和Tomcat上傳到伺服器中home目錄下進

JDK各個版本比較 JDK5~JDK10

某天早上,看新聞頭條,一條訊息引起了我的注意,JDK10問世!我的天哪,公司開發好像還在用JDK6,難道落伍那麼多了嗎!!為了弄清楚各個版本之間的關係,特地羅列了一下。  JDK5 自動裝箱與拆箱: 列舉 靜態匯入,如:import staticjava.lang.Sy

子類的定義組合的比較

在面向物件程式設計中,類B可以繼承自另外一個類A。我們將A稱為父類(superclass),將B稱為子類(subclass)。B的例項從A繼承了所有的例項方法。類B可以定義自己的例項方法,有些方法可以過載類A中的同名方法,如果B的方法過載了A中的方法,B中的過載方法可能會呼叫A中的過載方法,這種做法

Android 解決apk覆蓋安裝的時候出現安裝失敗版本部相容的問題

當你的apk覆蓋安裝的時候出現下圖所示的情況, 然後點選安裝, 解決方案: 1.你需要檢查你的新舊apk所使用的簽名檔案是否是同一個。 2.檢查你的簽名檔案是否是釋出版本,debug 簽名的應用程式不能在 Android Market 上釋出,它

檢視Eclipse版本各個版本區別

檢視Eclipse版本號的方法:1、找到eclipse安裝目錄。2、進入readme資料夾,開啟readme_eclipse.html。3、readme_eclipse.html呈現的第二行即數字版本號,如:Release 4.4.0Last revised June 5,

NIO原理剖析Netty初步----淺談高性能服務器開發(一)

返回 創建 基於 register 訪問 io操作 nbsp info class 除特別註明外,本站所有文章均為原創,轉載請註明地址 在博主不長的工作經歷中,NIO用的並不多,由於使用原生的Java NIO編程的復雜性,大多數時候我們會選擇Netty,m

sql server 2008 r2各個版本的區別選擇

排序。 分析 新的 name 精華 倉庫 CA web應用 下載 轉自:https://blog.csdn.net/kasama1953/article/details/52522921 目前已知的SQL Server 2008 R2的版本有: 企業版、標準版、工作組版

MBPWindows相比較MBP好在哪

優勢 開發 喜歡 很難 年輕人 分享 mac proc 來源 說到MacBook Pro,大家並不陌生,他跟Windows相比較,到底有何種優勢呢?因為所用的用戶群體不一樣,所以很難說哪個更好更受歡迎。首先劃定一個範圍參考,Windows使用群體主要專註的領域:辦公、工程、

貪心演算法遞迴演算法動態規劃演算法比較總結

一般實際生活中我們遇到的演算法分為四類: 一>判定性問題 二>最優化問題 三>構造性問題 四>計算性問題 而今天所要總結的演算法就是著重解決 最優化問題 《演算法之道》對三種演算法進行了歸納總結,如下表所示: 分

初步物件封裝構造方法

一,理解面對物件的思想 物件是已知的事物 物件會執行的動作 物件本身已知的事物被稱為 實際變數(instance variable) 物件可以執行的動作成為 方法(methods) 就是說: 如果你如果想洗衣服的話,面向過程就是你需要執行一系類的過程,裝衣服,放盆子裡,到洗衣

SQL Server 2008R2各個版本如何檢視是否啟用剩餘可用日期?

SELECT create_date AS 'SQL Server Installed Date', Expiry_date AS 'SQL Server Expiry Date', DATEDIFF(dd,create_date, GETDATE()) 'No_of_Days_Used'

Windows Server 2016版本系統比較

  一、效能和可擴性  特徵描述 Windows Server 2012/2012 R2 標準版和資料中心 Windows Server 2016 標準版和資料中心

氣泡排序的實現和優化及其插入選擇排序的比較

備註:這裡使用的插入排序和選擇排序都是經過優化後的詳細優化請檢視上一條部落格,編譯器使用DEV-C++ 氣泡排序演算法的運作如下:(從後往前) 1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數

springboot的pom中找不到mysql-connector-java以及springbootspringcloud版本衝突

我springboot選用了2.0.5.RELEASE <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta

圖解十分鐘在centos上安裝各個版本mysql(5.65.75.8)

授之以魚不如授之以漁,一下是安裝各個版本mysql的步驟,雖然比直接給步驟麻煩點,但是以後安裝一個可用的本地mysql應該夠用了。我只測試過(5.7,我看了下5.6文件,官網安裝命令不一樣,其他步驟差不多) 前提條件:因為系統原因把,先檢查 1:先檢查是否安裝了32位的libnuma 

sql server和my sql 命令(語句)的區別sql servermysql的比較

  sql與mysql的比較 1、連線字串 sql  :Initial Catalog(database)=x;  --資料庫名稱       Data S

C語言筆試題之——BOOLintfloat指標型別的變數a “零”的比較

Bool型: if(a) if(!a) BOOL型,沒什麼好講的,無非就是true或false判斷 int型: if(0 == a) if(0 != a) float型: const float EPSILON=0.000001; if(abs(a)<=E

Eclipse 中svn 分支主幹 合併同步(比較好理解的)

Eclipse 中svn的合併與同步: 1、 從主幹拉取到分支: 然後一直下一步,到完成就OK了。 2、 從分支程式碼合併到主幹: 2.1、先將本地需要提交更新的程式碼提交更新到svn分支去 2.2、將本地路徑切換到需要合併程式碼的主幹去(就是切換工作空間,切換到主幹工作