Netty核心原理
2022-08-28 15:32:44 32 举报
Netty核心原理
作者其他创作
大纲/内容
small(512Byte~8KB)
提供者
③
调用channel.unsafe().register()
8KB
Client
javaChannel().register()
调用AbstractBootstrap.initAndRegister()
Acceptor
Handler3
Sub Reactor ThreadPool(IO Pool)
hander()
next
NIO线程池
Context/HandlerHead
7、Selector轮询就绪的Key
client
NioEventLoop
ReflectiveChannelFactory
connect
findContextOutbound
ChannelPipeline
Accepter监听
Arena2
Handler2
初始化
Buffer
Thread
在同一个线程中处理
doConnect
Registry
调用父类的next()方法,获取一个可用的NioEventLoop
ChannelInitializer
PoolThreadCache
6、handleAccept()处理新的客户端接入
read/encode
Netty的服务端
Context
11、异步写ByteBuffer到SocketChannel
MultithreadEventExecutorGroup
prev
8、向Selector注册监听读操作SelectionKey.OP_READ9、handleRead()异步读请求消息到ByteBuffer
ServerBootstrap
调用doBind方法
Dispatcher
Shake-hand
newChannel()
Handler1
Consumer
doBind()
EventLoop2
2 handle(Req)
Client3
parent=NioEventLoopGroupaddTaskWakesUp=falsethread=threadFactory.newThreadthreadProperties = new DefaultThreadProperties(thread);taskQueue=new TaskQueue();
拷贝完成
调用group().register(channel)将channel注册到EventLoop中
MultithreadEventLoopGroup
Page
New Thread1
NioEventLoopGroup
Context.invokeConnectConnect
Server
②
channelRegistered()
Client1
发送聊天表情发送文字登录登出送鲜花
调用doBind()方法
accept
512Byte、1KB、2KB、4KB
Service
建立NioSocketChannel连接后
channelInactive()
ChatClientHandler
Context/HandlerTail
head.fireChannelActive
Channel
...
返回成功提示
Session
tiny
NioServer
基于Netty手写实现RPC
IP.port Impl实现类
New Thread2
doResolveAndConnect
AbstractBootstrap
调用startThread启动thread
WebBrowser
调用MultithreadEventLoopGroup.register
1 connect
进程受阻于select调用,等待可能多个套接口中的任一个变为可读
认证鉴权派遣
Reactor
调用MultithreadEventLoopGroup.register()
SLA
regiseter()
业务逻辑(消息记录保存、分发)当前在线人数的统计
RpcConsumer
0
Handler
head
channelRegistered后的Pipeline内容
无数据包准备好
构造器
9、判断连接是否完成,完成执行步骤10
在AbstractUnsafe.register中:AbstractChannel.this.eventLoop=eventLoop
New Thread4
queue:
auth
TCP底层
IP port对外发布
保存线程执行状态
调用eventLoop.execute
调用
Arena3
invoke()动态代理的方法
SingleThreadEventExecutor
3 connect
编码和解码
Reactor Thread
初始化Selector
writedecode
把所有服务进行一个登记的功能
NioSocketChannel
read
IoHandler
16MB
normal(8KB~16MB)
8KB、16KB、32KB
workerGroup池
channelUnregistered()
5、向Reactor线程的多路复用器注册OP_CONNECT事件
SubPage
一个接口的实现
调用bind()方法
注册中心就是一个Map
Client2
N × 16Byte
4、将 ServerSocketChannel注册到Selector,监听SelectionKey.OP_ACCEPT
chunkhandle
channel bindready
InboundHandler
NIO-Thread...
channelActive()
Head
handler
将返回值传回去
Reactor ThreadPool
Acceptor线程池
newSocket()
newChannelInitizer
Acceptor线程
Context.connect
Context.invokeChannelActive
bossGroup池
OutboundHandler
tiny(0~512Byte)
Context/Handlerhead
Handler5
内核
handler.channelActvie
create(Class接口)
recvfrom
AbstractChannel
Pipeline.fireChannelActive
Pipeline.connect
11、handleRead()异步读请求消息到ByteBuffer
AbstractNioUnsafe
无感知的本地调用
small
NIO-Thread2
RMI
SingleThreadEventLoop
Chunk
initAndRegister
6、创建Selector,启动线程
NioServerSocketChannel
NioClient
bind()
encode
调用SingleThreadEventLoop.register参数:final Channel channelfinal ChannelPromise promise
应用进程
business
13、异步写ByteBuffer到SocketChannel
4、判断连接结果,如果连接成功,调到步骤10,否则执行步骤5
head.connect
系统调用
3、异步连接服务端
ch.configureBlocking(false);
TailContext
Handler...
sizeClass:
2 connect
协议来控制规定前1个字节
init()
EventLoop1
Main Reactor ThreadPool(Accept Pool)
Context.fireChannelActive
tail
tail.invokeChannelActive
7、设置新建客户端连接的Socket
拷贝数据包
调用channel.unsafe().register
Context/Handlertail
ServerBootstrap.init()方法中
SocketChannel
ServerBootstrapAcceptor
write/decode
nThreads=0executor=nullselectorProvider=SelectorProvider.provider()reject=RejectedExecutionHandlers.reject()
分配EventLoop
EventLoop3
处理数据包
handler.connect
④
远程调用 RPC
用户什么协议请求过来的HTTP、WS、自定义(IMP)
CPU
4 connect
readencode
将数据从内核拷贝到用户空间
1、打开 ServerSocketChannel
Promise
10、向多路复用器注册读事件OP_READ
head.invokeConnectConnect
1、打开 SocketChannel
New Thread3
AbstractChannel$AbstractUnsafe
NIO-Thread1
normal
Netty的客户端
EventLoop4
tail.channelActive
DefaultChannelPipeline
Handler4
provider=selectorProvider;selector=openSelector();
Netty代码实现客户端
doResolveAndConnect0
DEFAULT_EVENT_LOOP_THREADS=CPU核数*2executor=nullargs=selectorProvider
2、设置SocketChannel为非阻塞模式,同时设置TCP参数
网络请求,调用远程服务
数据拷贝到应用缓冲区期间进程阻塞
login
12、decode请求消息
负责注册跟回调
server
代理
Protocol序列化(JDK)JSONMsgPack
2、绑定监听地址 InetSocketAddress
unsafe.connect
10、decode请求
调用SingleThreadEventLoop.register()参数:final Channel channelfinal ChannelPromise promise
Provider
HeadContext
消费者
执行完之后要调用哪个回调方法callback
8、handerConnect()
3、创建Selector,启动线程
Channel.connect
等待数据
MemoryRegionCache
集成Spring
Dubbo
3 Send Response to peer
数据包准备好
①
cxt-next
返回可读条件
Arena4
size:
huge
write
select
5、Selector轮询就绪的Key
Future
accepter
512Byte
decode
RpcProxy
proxy
DefaultChannelHandlerContext
Arena1
0 条评论
回复 删除
下一页