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

相关文章
相关标签/搜索