Netty核心源码分析
Posted 还是那个徐东强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netty核心源码分析相关的知识,希望对你有一定的参考价值。
前言:分析Netty服务端的核心源码,主要从下面三个角度来解析。
1.服务端的启动流程。
2.接受请求流程。
3.监听读事件。
(源码是从下载git上netty源码分支4.1,启动类为example/echo/EchoServer)
由于上面三点篇幅较长,所以拆成两篇,本文主要解析服务端的启动流程。
本篇Netty服务端的启动流程,目录如下:
1.介绍主从Reactor多线程模型。
2.创建NioEventLoopGroup。
3.ServerBootstrap初始化配置阶段。
4.启动服务。
介绍Netty的线程模型
开始介绍Netty的源码前,首先来了解下其线程模型,以便更好的来解读源码。
Netty是在基于主从Reactor多线程模型做的一定的改进,比如主从Reactor都可以是多个。
什么是主从Reactor多线程模型呢?
我们知道最简单的nio,单线程,开启一个selector多路复用器,负责监听accept事件&IO读写事件以及业务处理,只要任意一步卡住,都会影响其他的动作,吞吐量完全不行。
那么将上面的三快都拆分到不同的线程来处理,比如Reactor主线程(独立的selector)只负责监听accept,创建通道后直接丢给Reactor子线程,这样即使read&write阻塞,也不会影响Reactor主线程的接收请求。
Reactor子线程负责监听通道的read&write事件,业务处理丢给业务线程池来处理,即使某个业务特别耗时,也不影响Reactor子线程来读写通道数据。
同时Reactor主线程和Reactor子线程都可以是多个,横向扩展其接受请求和读写的能力。
接下来,我们来看服务端的启动源码。
创建NioEventLoopGroup
1EventLoopGroup bossGroup = new NioEventLoopGroup(1);
2EventLoopGroup workerGroup = new NioEventLoopGroup();
首先来分析这两行代码:看结构图
boosGroup即为Reactor主线程组,workerGroup为Reactor子线程组;每个NioEventLoopGroup中都由NioEventLoop组成(数量可指定,不指定时是核数*2)。 以上是关于Netty核心源码分析的主要内容,如果未能解决你的问题,请参考以下文章 Netty-源码分析ByteBuf-slice和retainedSlice使用细节 Netty源码分析-AdaptiveRecvByteBufAllocator
MultithreadEventLoopGroup中指定NioEventLoop的数量。