netty學習總結(一)

netty是什麼?

netty是一個異步的,事件驅動的網絡編程框架。html

netty的技術基礎

netty是對Java NIOJava線程池技術的封裝java

netty解決了什麼問題

使用Java IO進行網絡編程,通常一個用戶一個線程,沒法處理海量用戶
使用Java NIO進行網絡編程,編程複雜性過高,若是沒有深厚的NIO網絡編程基礎,寫出的程序可能還不如Java IO寫的程序
至於Java AIO,目前尚未弄清楚其與netty孰優孰劣react

netty架構

netty架構是基於Reactor和責任鏈模式進行設計的。編程

reactor

關於reactor的原理,參考「【NIO系列】——之Reactor模型
netty的reactor是多reactor多線程模型,其中reactor在netty中以eventloop的形式出現。bootstrap

責任鏈模式

netty經過popeline將handler組裝起來,經過向pipeline裏添加handler來監聽處理髮生的事件。api

netty服務端編程模式

// 用於監聽客戶端連接的eventloop池,通常只有一個eventloop
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
// 用於處理客戶端IO的eventloop池
NioEventLoopGroup workGroup = new NioEventLoopGroup();
// 輔助類,幫助初始化服務器
ServerBootStrap bootstrap = new ServerBootStrap();
bootstrap.group(bossGroup, workGroup) // bossGroup和workGroup能夠是同一個
        .channel(NioServerSocketChannel.class) // 設置服務端監聽套接字的channel類型
        .option(ChannelOption.SO_BACKLOG, 1024) // 設置監聽套接字的參數
        .handler(new LoggingHandler()) // 設置監聽套接字的handler
        .childHandler(new ChannelInitializer<SocketChannel>(){
            // 設置客戶端套接字的handler
            public void initChannle(SocketChannel ch){
                // 向pipleline中添加handler,用於處理客戶端IO
                ch.pipeline().addLast(...); 
            }
        });
int port = 8080;
try{
    ChannelFuture f = bootstrap.bind(port).sync();
    f.channel().closeFuture().sync();
}catch(IOException e){
    e.printStacktrac();
}finally{
    bossGroup.shutdownGracefully();
    workGroup.shutdownGracefully();
}

netty客戶端編程模型

// 用於處理與服務端IO的eventloop池
NioEventLoopGroup group = new NioEventLoopGroup();
// 輔助類,幫助初始化客戶端
BootStrap bootstrap = new BootStrap();
bootstrap.group(group)
        .channel(NioSocketChannel.class) // 設置客戶端套接字的channel類型
        .option(ChannelOption.NO_DELAY, true) // 設置客戶端套接字的參數
        .handler(new ChannelInitializer<SocketChannel>(){
            // 設置客戶端套接字的handler
            public void initChannel(SocketChannel ch){
                // 向pipleline中添加handler,用於處理客戶端IO
                ch.pipeline().addLast(...); 
            }
        });
String host = "127.0.0.1";
int port = 8080;
try{
    ChannelFuture f = bootstrap.connect(host, port).sync();
    f.channel().closeFuture().sync();
}catch(IOException e){
    e.printStacktrac();
}finally{
    group.shutdownGracefully();
}

buffer

netty認爲Java NIO的Buffer太難用了,所以本身實現了一套Buffer。相比於Java NIO的netty的buffer不只易用,並且還支持自動擴容。緩存

netty的buffer能夠抽象爲三個指針readIndex, writeIndex, limit.
讀buffer增長readIndex,寫buffer會增長writeIndex,若是寫的數據量超過limit,則會增長buffer容量。netty buffer也支持隨機讀寫服務器

netty中buffer通常經過Unpooled工具類建立,有三大類buffer:網絡

  1. 在JVM堆上分配的buffer。優勢是分配快速,易於回收,缺點是最終仍是要將數據複製到直接緩存中
  2. 直接緩衝區,直接經過系統調用malloc分配的內存,優勢是減小數據移動,缺點是分配慢,回收麻煩
  3. 組合緩衝區,即將不一樣種類的buffer進行封裝,訪問時就像訪問一個buffer,能夠經過這個方式對緩衝區進行劃分,可是會增長訪問時間

handler

handler分爲處理入站事件的handler和出站事件的handler。經過實現相應的方法來監聽相應的事件
netty也提供了一些adapter類來減小開發者的工做量。多線程

入站handler

入站事件通常是由外部觸發的,如收到數據。
基類爲ChannelInboundHandler

出棧handler

出站事件由內部觸發,如寫數據
基類爲ChannelOutboundHandler

相關文章
相關標籤/搜索