Netty服务端启动核心流程
2021-08-18 10:08:01 0 举报
Netty服务端启动核心流程
作者其他创作
大纲/内容
childGroup.register(child)
newChannelPipeline
MultithreadEventLoopGroupsuper调用父类构造方法初始化
TailContext
AbstractBootstrap
EventLoopGroupworkerGroup处理业务
NioServerSocketChannel
死循环监听IO事件
入站事件会从链表 head 往后传递到最后一个入站的 handler,出站事件会从链表 tail 往前传递到最前一个出站的 handler,两种类型的 handler 互不干
pipeline.invokeHandlerAddedIfNeeded
processSelectedKeysOptimized
Selector
ServerBootstrapinit(channel)
pipeline.fireChannelRegistered
NioEventLoop.run
ChannelInitializer
HeadContext
AbstractNioChannel
SingleThreadEventExecutor.this.run()
绑定监听端口
获取SocketChannel
SingleThreadEventExecutor将注册任务放入队列异步执行
child.pipeline().addLast(childHandler);
doRegister
和服务端注册逻辑流程一样只是这一步就是只处理读写事件不处理连接事件了
注册到worGroup的逻辑和bossGroup注册连接事件逻辑一样
for循环
doBind
循环处理事件key
当客户端发消息时,产生读事件OP_READNioByteUnsafel
initChannel这个回调就是往管道中handler
调用socketChannerl中pipeline的所有handler的ChannelRead方法从pipeline的head节点开始调用
Pipeline
new EventExecutor[nThreads]初始化线程池对象children
childHandler就是服务端初始化时设置的ChannelInitializer
super(parent)AbstractChannel
包装成NioSocketChannel
从taskQueue中拿出之前注册的任务 异步执行
默认构造方法DefaultChannelPipeline
每个NioEventLoopGroup线程组中都有多个NioEventLoop
pipeline.fireChannelRead(readBuf.get(i))
往pipeline中添加ChannelInitializer
放入队列
startThread()
readBuf存放发生连接事件的所有SocketChannel
runAllTasks
初始化SocketChannel的Pipeline
pipeline.fireChannelRead(byteBuf)
unsafe.read();
initAndRegister服务端核心注册逻辑对NIO代码的封装
设置nThreads数量
bootstrap.bind
newChannelPipeline()
selector.select(timeoutMillis)
核心注册逻辑把ServerSocketChannel注册到eventLoop中的selector上,并且selector对客户端accept连接操作感兴趣
SocketUtils.accept(javaChannel())
构造方法初始设置感兴趣事件为读事件
还会回调服务端创建ServerBootstrap时设置的ChannelInitialize中的回调方法
当客户端有连接事件时就会发生OP_ACCEPT
连接OP_ACCEPTAbstractNioMessageChannel
ServerBootstrapAccepto.ChannelRead
ServerBootstrapAcceptor
ch.configureBlocking(false);
EventLoopGroupbossGroup处理连接
有事件时才会执行
super(parent);初始化Pipeline
执行run方法
初始化Pipeline
超时或有事件发生遍历事件集合set进程处理
p.addLast(new ChannelInitializer
sockerChannerl和ServerSocketChannel注册逻辑一样,注册完成后都会回调初始化时设置的ChannelInitializer方法把所有业务handler放入pipeline中
获取默认的
异步调用AbstractChannel
NettyServerHandler
config().group().register
configureBlocking(false)
processSelectedKeys()所有事件放入一个set集合
register0(promise)
客户端Client
eventLoop.execute(()-> register0(promise)
调用pipeline中的每个Handler的HandlerAdded
childGroup就是workGroup线程组
设置为非阻塞模式
填充线程池
创建服务端对象
init(channel)
从Head开始调用服务端Channel的pipeline中的所有handler
NioEventLoop
将连接的SocketChannel注册到workGroup的某一个EventLoop的Selector上
taskQueue.offer
pipeline.addLast添加一个新的
MultithreadEventLoopGroup从boss线程组获取一个线程处理channel的注册,注册到线程的select
channelFactory.newChannel()
父类构造方法
调用AbstractNioChannel
addTask(task)
回调方法,调用完成后删除ChannelInitializer
doReadMessages(readBuf)
通过反射工厂初始化ReflectiveChannelFactory
如果配置文件io.netty.eventLoopThread配置的线程大于1 就取配置的如果配置文件未配置 则获取当前服务器的cpu核心数的2倍
循环处理所有到来的读事件
监听端口
task中的run方法最终执行
调用pipeline中的每个Handler的ChannelRegistered
TaskQueue
channerl注册时调用调用完后删除该hanndler
ServerBootstrap链式编程设置参数
channel.pipeline()
初始化Channel设置监听事件
服务端初始
(EventLoop) super.next()
注册channel逻辑
0 条评论
回复 删除
下一页