netty源码启动流程
2022-08-25 15:17:25 1 举报
netty源码启动流程
作者其他创作
大纲/内容
ServerBootstrapAccpetor.channelRead()
客户端连接
client
从head开始调用serverSocketChannel pipeline里所有的inboundHandler
pipeline.invokeHandlerAddedIfNeeded()
1、channel 类似于流,每个 channel 对应一个 buffer缓冲区,buffer 底层就是个数组2、channel 会注册到 selector 上,由 selector 根据 channel 读写事件的发生将其交由某个空闲的线程处理3、NIO 的 Buffer 和 channel 都是既可以读也可以写
数据
启动创建
thread
startTread()
HeadContext
ChannelInitializer
buffer
绑定网络监听端口
当channel注册时会调用
pipeline.fireChannelRead(readBuffer.get(i))
同步阻塞模型,一个客户端连接对应一个处理线程
childHandler就是netty服务端初始代码我们自己写的ChannelInitializer
runAllTasks()
发数据
config().group().register(channel)
socket缓冲
SelectionKey
直接内存操作数据,一次读写数据需要拷贝2次零拷贝不是说没有拷贝,主要是说减少了用户空间和内存空间的数据相互拷贝
Pipeline
ServerBootstrapAcceptor
unsafe.read(nioByteUnsafe)
NioEventLoop.run()
super(parent)
register0(promise)
NIO
从bossGroup里拿一个线程处理channel的注册将其注册到线程自己的selector上
task
连接过来的socketChannel注册到workGroup里的一个现线程的selector上
注册
当timeoutMillis超时或有事件发生会break处理
直接调用SocketChannel的pipeline里所有handler的channelRead方法
引用
就绪事件列表rdlist
selector(多路复用器)
Server
processSelectedKeys()
socketChannel pipeline
sockchannel
readBuf里放的是OP_ACCEPT事件连接过来的所有的SocketChannel
堆内存操作数据,一次读写数据需要拷贝4次
9000
直接内存
server
child.pipeline().addLast(childHandler)
selector.select(timeoutMillis)
TailContext
NettyServerHandler
select(wakenUp.getAndSet(false))
拷贝
childGroup.register(child)
调用pipeline里每个handler的handlerAdded方法
ServerBootstrap
SocketUtils.accept(javaChannel())
ChannelInitializer在管道中加入
next().register(channel)
channel注册完返回的SelectionKey与channel绑定
serverSocketChannel pipeline
for循环处理selectedKeys里所有的key
processSelectedKeysOptimized()
ch.configureBlocking(false)
channel注册时调用调用完会删除改handle
获取SocketChannel
调用pipeline里每个handler的channelRegistered方法
NettyServer
newChannelPipeline()
JVM内存
当客户端往服务端发送数据SocketChannel则会发生OP_READ事件
NioEventLoopGroup workerGroup处理通信
BIO
监听
执行doBind()方法
initChannel(ctx)
addTask(task)
pipeline.fireChannelRegistered()
task线程放入TaskQueue异步执行
unsafe.read(nioMessageUnsafe)
doReadMessages(readBuf)
ServerSocketChannel
将channel感兴趣的事件设置为OP_READ
方法内执行initAndRegister()获取ChannelFuture
SocketChannel注册逻辑和ServerSocketChannel注册逻辑一样,注册完会调用SocketChannel里的ChannelInitializer把我们自己写的handler全部放入pipeline
初始化SocketChannel的pipeline
数据的引用
创建channelchannelFactory.newChannel()
OP_READ | OP_ACCEPT
ServerBootstrap.init(channel)
doRegister()
NioEventLoopGroup bossGroup处理客户端连接
运行TaskQueue异步队列任务
将SocketChannel封装成NioSocketChannel
客户端连接触发OP_ACCEPT事件
pipeline.fireChannelRead(byteBuf)
初始化channel的管道
taskQueue.offer(task)
注册channel到selector
死循环执行监听IO事件
死循环执行
Server操作系统物理内存
bind(9000)
0 条评论
下一页