netty服务端ServerBootstrap 启动的时候,默认有两个eventloop分别是
bossGroup和 workGroup. (其实大部分人这么叫的.并没有明确这个名字).
一般服务端启动的时候会使用下面的代码
1 NioEventLoopGroup bossGroup1 = new NioEventLoopGroup(1);//boss 2 NioEventLoopGroup workerGroup = new NioEventLoopGroup();//worker 3 4 try { 5 ServerBootstrap b = new ServerBootstrap(); 6 ((ServerBootstrap)((ServerBootstrap)((ServerBootstrap)b.group(bossGroup1, workerGroup).channel(NioServerSocketChannel.class)).option(ChannelOption.SO_BACKLOG, Integer.valueOf(100))).handler(new LoggingHandler(LogLevel.INFO))).childHandler(new ChannelInitializer() { 7 public void initChannel(SocketChannel ch) throws Exception { 8 ChannelPipeline p = ch.pipeline(); 9 if(sslCtx != null) { 10 p.addLast(new ChannelHandler[]{sslCtx.newHandler(ch.alloc())}); 11 } 12 13 p.addLast(new ChannelHandler[]{new EchoServerHandler()}); 14 } 15 }); 16 ChannelFuture f = b.bind(PORT).sync(); 17 f.channel().closeFuture().sync();
其中boss用来监控tcp链接,worker用来处理io事件. 具体的说,boss执行 server.accept()操作 .worker处理事件的读写到业务逻辑处理等后续操作.
NioEventLoopGroup 和NioEventLoop 都可以.但是前者使用的是线程池. 其实bossgroup如果服务端开启的是一个端口(大部分都是一个),单线程即可.
worker大部分情况需要多线程处理了 .因为 一个eventloop绑定了一个selector,事件都是通过selector轮询处理的. 一万个情况让一个select处理和让100个selector处理
肯定是多线程效率要高一些(因为有io).
那么下面就讨论一下 ,eventloopgroup的默认线程个数.
请看下面代码
//----开始调用--- NioEventLoopGroup workerGroup = new NioEventLoopGroup(); //默认调用方法 public NioEventLoopGroup() { this(0); } //-----链1 public NioEventLoopGroup(int nEventLoops, Executor executor) { this(nEventLoops, executor, SelectorProvider.provider()); } //------连2 public NioEventLoopGroup(int nEventLoops, Executor executor, SelectorProvider selectorProvider) { super(nEventLoops, executor, new Object[]{selectorProvider}); } //连3------ /** * @see {@link MultithreadEventExecutorGroup#MultithreadEventExecutorGroup(int, Executor, Object...)} */ protected MultithreadEventLoopGroup(int nEventLoops, Executor executor, Object... args) { super(nEventLoops == 0 ? DEFAULT_EVENT_LOOP_THREADS : nEventLoops, executor, args); } //---------连4 private static final int DEFAULT_EVENT_LOOP_THREADS; static { DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2)); if (logger.isDebugEnabled()) { logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS); } }
跟踪一下就可以发现
其实默认线程数是 cpu核心数的2倍. 但是也可以通过
-Dio.netty.eventLoopThreads 参数在服务端启动的时候指定 .