Vert.x 源码阅读
VertxImpl
sharedNetServers(Map<ServerID, NetServerInternal>)
- 解决多个
Verticle
实例监听同一个host
和port
的问题 - key为
ServerID
,当ServerID内的host
和port
都相同时,代表同一个ServerID - 可以参考文档:共享 TCP 服务端
- 解决多个
线程相关
ExecutorService
- VertxImpl#eventLoopGroup(EventLoopGroup)
- 源于transport的默认实现:
Transport#eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ioRatio)
- 本质为:
MultiThreadIoEventLoopGroup
,其children
数量为:2 * CPU核数,每个child是一个:SingleThreadIoEventLoop
- 线程前缀:
vert.x-eventloop-thread-
- 源于transport的默认实现:
- VertxImpl#acceptorEventLoopGroup(EventLoopGroup)
- 源于transport的默认实现:
Transport#eventLoopGroup(int type, int nThreads, ThreadFactory threadFactory, int ioRatio)
- 本质为:
MultiThreadIoEventLoopGroup
,其children
数量为:1,每个child是一个:SingleThreadIoEventLoop
- 线程前缀:
vert.x-acceptor-thread-
- 源于transport的默认实现:
- VertxImpl#virtualThreadExecutor(ExecutorService)
- 通过反射的方式获取到
VirtualThreadBuilder
- 本质为:
ThreadPerTaskExecutorService
- 线程前缀:
vert.x-virtual-thread-
- 通过反射的方式获取到
WorkerPool(包含一个ExecutorService和PoolMetrics)
- VertxImpl#workerPool
ExecutorService
本质为:ThreadPoolExecutor
- corePoolSize/maximumPoolSize默认为:2 * CPU核数
- 当使用
WORKER
的方式部署一个Verticle
时,如果没有指定workerPoolName
,默认是该WorkerPool
- VertxImpl#internalWorkerPool
ExecutorService
本质为:ThreadPoolExecutor
- corePoolSize/maximumPoolSize默认为:2 * CPU核数
- VertxImpl#virtualThreaWorkerPool
ExecutorService
本质为:ThreadPerTaskExecutorService- 其内部的
ExecutorService
和VertxImpl#virtualThreadExecutor
共享同一个实例引用
stickyEventLoop
- 本质为:
ThreadLocal<WeakReference<EventLoop>>
- 起到线程
亲和
作用,同一个线程调用stickyEventLoop()
时,尽量返回之前的线程 - 每次从
eventLoopGroup.next()
返回一个线程
ContextImpl
当调用Vertx#deployVerticle(...)
部署一个Verticle
时,被VertxImpl#getOrCreateContext()
创建,内部包含的重要变量:
threadingModel(ThreadingModel)
:可选值为:EVENT_LOOP
、WORKER
、VIRTUAL_THREAD
、EXTERNAL
eventLoop(EventLoopExecutor)
:TODOexecutor(EventExecutor)
:TODOworkerPool(WorkerPool)
:TODO
根据threadingModel
的不同,决定了eventLoop
、executor
、workerPool
使用不同的线程及线程池
ThreadModel
EVENT_LOOP
executor
- 本质为
EventLoopExecutor
,内部包含1个netty的EventLoop(SingleThreadIoEventLoop)
的引用 - 线程来自于:
VertxImpl#stickyEventLoop()
也即VertxImpl#eventLoopGroup.next()
- 本质为
eventLoop
- 和
executor
共享同一个实例引用
- 和
workerPool
- 线程来自于调用函数的参数或者
VertxImpl#workerPool
(当参数为空时)
- 线程来自于调用函数的参数或者
WORKER
executor
- 本质为:
WorkerExecutor
,内部包含1个WorkerPool
的引用 - 线程来自于调用函数的参数或者
VertxImpl#workerPool
(当参数为空时)
- 本质为:
eventLoop
- 同
EVENT_LOOP
下的eventLoop
- 同
workerPool
- 当进行部署时,如果指定了
workerPoolName
,则新创建一个WorkerPool
,否则使用默认的:VertxImpl#workerPool
workerPool
的线程池和executor
的线程池共享同一个实例引用
- 当进行部署时,如果指定了
VIRTUAL_THREAD
executor
- 本质为:
WorkerExecutor
,内部包含1个WorkerPool
的引用 - 线程来自于
VertxImpl#virtualThreaWorkerPool
- 本质为:
eventLoop
- 同
EVENT_LOOP
下的eventLoop
- 同
workerPool
- 线程来自于
VertxImpl#virtualThreaWorkerPool
workerPool
的线程池和executor
的线程池共享同一个实例引用
- 线程来自于
NetServerImpl
可以通过Vertx#createNetServer
创建,其实例也被HttpServerImpl#tcpServer
持有,可以内部实现基于Netty。当其bind(...)
被调用时,并非真正执行绑定,当且仅当vertx.sharedTcpServers()
不存在相同的绑定时,执行真正的Netty Bootstrap
的创建及绑定操作(可以参考文档:共享 TCP 服务端),主要成员包括:
worker(Handler<Channel>)
- 当
Channel
初始化时,将channel加入到NetServerImpl#channelGroup
中 - 为
Channel
配置Pipeline
- 当
listenContext(ContextInternal)
- 如果是在
VertxThread
线程(例如在Verticle#start()
函数)中调用了listen(...)
,则listenContext
为当前线程(或Verticle)的Context,否则会触发Vertx#getOrCreateContext
创建一个新的Context
- 如果是在
eventLoop(EventLoop)
:- 线程来自于
ContextInternal#nettyEventLoop()
也即ContextImpl#eventLoop#eventLoop
- 在执行
bind(...)
操作时eventLoop
也会被加入到channelBalancer
的workers(被用作Netty的Bootstrap
的子EventLoopGroup
)列表,也就是说:Verticle的线程会参与到Netty的子EventLoopGroup
中,当一个Channel
被创建时,Netty会从所有的子EventLoopGroup
选择一个EventLoop
,当进行初始化时,Vert.x会通过Channel
身上的EventLoop
,找到
- 线程来自于
channelGroup(ChannelGroup)
- 本质为:
DefaultChannelGroup
- 线程来自于
ContextInternal#nettyEventLoop()
也即ContextImpl#eventLoop#eventLoop
- 和
eventLoop
共享同一个实例引用 - 每一个
NetServerImpl
- 本质为:
handler(Handler<NetSocket>)
- 提供给上层逻辑的回调接口,上层逻辑在调用
NetServer#listen
之前必须先赋值 - 具体作用TODO
- 提供给上层逻辑的回调接口,上层逻辑在调用
exceptionHandler(Handler<Throwable>)
- 提供给上传逻辑的回调接口,HttpServerImpl的默认实现为:
t -> log.trace("Connection failure", t);
- 提供给上传逻辑的回调接口,HttpServerImpl的默认实现为:
channelBalancer(ServerChannelLoadBalancer)
- 继承自
ChannelInitializer<Channel>
,实现Channel
的初始化 - 被用作Netty的
Bootstrap
的childHandler
- 其内部成员:
workers(VertxEventLoopGroup)
被用作Netty的Bootstrap
的子EventLoopGroup
- 继承自