2021.08-netty源码分析
2021-08-10 14:47:02 0 举报
登录查看完整内容
Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。它广泛用于云计算、物联网、游戏等领域。在2021年8月,我们对Netty进行了源码分析,深入探讨了其核心组件、事件循环机制、编解码器设计等方面。通过这次分析,我们更好地理解了Netty如何实现高性能、低延迟和高扩展性,为我们在实际项目中使用Netty提供了宝贵的经验和参考。
作者其他创作
大纲/内容
SelectedSelectionKeySetSelector
PowerOfTwoEventExecutorChooser
chooser=newChooser
任务(通过for死循环)NioEventLoop.run()
SelectionKey k = findKey(sel)
SelectorTuple
pipeline.invokeHandlerAddedIfNeeded()
runAllTasks()
1
addTask(task)
outboundBuffer=ChannelOutboundBuffer
group
NioEventLoop
ChannelFuture
newContext
SucceededChannelFuture
NioServerSocketChannel
操作指针
new Runnable()
实例化
channel
SingleThreadEventLoop.register
网口
直接内存
返回线程对象
移除任务
super
pipeline.fireChannelActive()
调用JDK
用户态
内核态
ServerBootstrap
processSelectedKey
executor.execute(new Runnable() { @Override public void run() { SingleThreadEventExecutor.this.run(); ... ... } });
添加任务
afterRunningAllTasks()
executo=ThreadPerTaskExecutorr
NioMessageUnsafe
else
4
k.interestOps(ops)k.attach(att)
父类初始化
NioMessageUnsafe=newUnsafe()
应用
SelectionKey.selector()
Server源码分析
pipeline.fireChannelRegistered();
head =HeadContext
添加handler()
3
ServerSocketChannel
init
SelectStrategyFactory
if (inEventLoop)
任务队列中删除
RejectedExecutionHandler
添加到队列
runAllTasks(timeoutNanos)
register
selectAgain
execute
newChannel
DefaultEventExecutorChooserFactory
JDK
绑定
ReflectiveChannelFactory
if (k == null)
promise.channel().unsafe()
if (selectedKeys != null)
GenericEventExecutorChooser
VoidChannelPromise
MultithreadEventExecutorGroup
生成任务队列LinkedBlockingQueue
读取复制
runAllTasksFrom()
循环调用
addLast0
EventLoop=chooser.next();EventLoop.register()
register0
safeExecute
startThread()
fetchFromScheduledTaskQueue()
doRegister
ChannelPipeline.addLast
DefaultChannelHandlerContext
线程数=0
super=SingleThreadEventLooptailTasks=newTaskQueue
请求
config()
PendingHandlerAddedTask
零拷贝原理
k = ((AbstractSelector)sel).font color=\"#f44336\
返回指针(不复制)
new NioServerSocketChannelConfig
channel.pipeline()
doBeginRead
注册
pollTaskFrom
doBind
根据线程数生成EventExecutor数组
pipeline().fireChannelActive()
AdaptiveRecvByteBufAllocator
SingleThreadEventExecutor.execute
options0
selector多路复用器
ThreadPerTaskExecutor
provider.openSelector
callHandlerAdded0
bind
包装
task
返回写入
本地的端口
startThread(); addTask(task);
unsafe.read()
addLast
AbstractNioMessageChannel
processSelectedKeysOptimized循环处理所有selectedKeys
DefaultChannelConfig
initAndRegister
SelectorProvider.provider()
SelectableChannel.configureBlocking(false)
isActive()
SelectorProvider
if (eventLoop.inEventLoop()) AbstractNioChannel.AbstractUnsafe
SelectedSelectionKeySet
pollTask()
EventExecutor=NioEventLoopGroup.newChild
AbstractNioChannel
doStartThread()
DefaultChannelPipeline=newChannelPipeline()
MultithreadEventLoopGroup
任务运行
DefaultThreadFactory
parentGroup
if (k != null)
eventLoop.execute(new Runnable() { @Override public void run() { register0(promise); } });
!=0
pipeline.fireChannelRead
processSelectedKeysPlain(selector.selectedKeys())
pipeline.fireChannelReadComplete()
safeExecute(task)
unsafe()获取的是NioMessageUnsafe
ChannelPipeline
2
taskQueue.offer
javaChannel().register
beginRead()
EventExecutorChooser
eventLoop().unwrappedSelector()
设置非阻塞
EventLoopGroupregister
DefaultSelectStrategyFactory
new NioEventLoopGroup
ServerSocketChannel=provider.openServerSocketChannel
DefaultChannelPipeline
callHandlerCallbackLater
executor
newSocket(SelectorProvider)
DefaultChannelPromise
threadFactory.newThread(command).start()
JDK生成线程池
processSelectedKeys();
tail =TailContext
实例化配置
next()
PendingHandlerRemovedTask
ServerBootstrapConfig
unsafe().forceFlush()
NioEventLoop 是EventLoop实现
else if (config().isAutoRead())
if (firstRegistration)
unsafe.finishConnect()
AbstractBootstrapConfig
收藏
收藏
0 条评论
回复 删除
下一页