Netty源碼分析之開篇

Netty是什麼

Netty是Java的一種能提供異步事件驅動網絡編程框架,Netty提供了簡潔強大的API,能極大提升開發穩定可靠網絡服務器和客戶端程序的效率。java

如何使用

以建立一個服務端舉例說明編程

public class TimeServer {

    public void bind(int port) throws Exception {
	// 1.配置服務端的NIO線程組
	EventLoopGroup bossGroup = new NioEventLoopGroup();
	EventLoopGroup workerGroup = new NioEventLoopGroup();
	try {
	    ServerBootstrap b = new ServerBootstrap();
		//2.配置參數
	    b.group(bossGroup, workerGroup)
		    .channel(NioServerSocketChannel.class)
		    .option(ChannelOption.SO_BACKLOG, 1024)
		    .childHandler(new ChildChannelHandler());
	    // 3.綁定端口,同步等待成功
	    ChannelFuture f = b.bind(port).sync();

	    //4. 等待服務端關閉
	    f.channel().closeFuture().sync();
	} finally {
	    //5.優雅退出,釋放線程池資源
	    bossGroup.shutdownGracefully();
	    workerGroup.shutdownGracefully();
	}
    }

    private class ChildChannelHandler extends ChannelInitializer<SocketChannel> {
	@Override
	protected void initChannel(SocketChannel arg0) throws Exception {
	    arg0.pipeline().addLast(new TimeServerHandler());
	}

    }

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
	int port = 8080;
	if (args != null && args.length > 0) {
	    try {
		port = Integer.valueOf(args[0]);
	    } catch (NumberFormatException e) {
		// 採用默認值
	    }
	}
	new TimeServer().bind(port);
    }
}

從上面的代碼例子來看啓動服務端有5個步驟服務器

  • 1.配置服務端的NIO線程組,這裏配置2個線程組,bossGroup線程組接收客戶端的鏈接,workerGroup線程組處理鏈接上的的客戶端的讀寫等處理。
  • 2.配置參數,這裏配置了NioServerSocketChannel渠道處理io事件,配置Accept隊列大小爲1024(這裏的大小是somaxconn和配置BACKLOG取最小值)。
  • 3.綁定端口。
  • 4.阻塞等待服務端關閉。
  • 5.優雅退出,釋放線程池資源。

爲何不使用Java原生NIO編程

Netty網絡框架目前普遍的應用在各個領域中,那麼爲何不用Java原生的NIO來開發呢。具體緣由以下:網絡

  • 1.Java原生NIO的API複雜,使用麻煩。
  • 2.對開發人員的要求高,列如須要熟悉Java多線程知識,網絡協議知識等。
  • 3.使用Java原生NIO須要開發人員本身解決半包問題,網絡中斷問題,網絡擁塞問題及Java NIO中的epoll bug致使的Selector空輪詢問題,還要本身編寫經常使用的協議編碼解碼(和諧)器。

Netty線程模型

Netty的客戶端就是單線程的NIO模型這裏就不討論,Netty的服務端的線程模型以下多線程

如上圖AcceptorSelector線程的職責就是輪詢客戶端鏈接事件,若是輪詢到客戶端鏈接,將鏈接後的IO操做委託給IOSelector線程池操做。框架

Netty同時支持Reactor的單線程、多線程和主從多線程模型可經過配置線程個數和是否共享線程來實現。異步

Netty官方demo推薦使用主從多線程模型,試想若是IOSelector和AcceptorSelector使用同一個Selector來輪詢,若是單個Selector處理大量的客戶端的Acceptor和IO事件,出現某個操做很是損耗性能,將直接拖垮整個系統的Acceptor和IO事件處理能力。ide

相關文章
相關標籤/搜索