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、EXTERNALeventLoop(EventLoopExecutor):TODOexecutor(EventExecutor):TODOworkerPool(WorkerPool):TODO
根据threadingModel的不同,决定了eventLoop、executor、workerPool使用不同的线程及线程池
ThreadModel
EVENT_LOOPexecutor- 本质为
EventLoopExecutor,内部包含1个netty的EventLoop(SingleThreadIoEventLoop)的引用 - 线程来自于:
VertxImpl#stickyEventLoop()也即VertxImpl#eventLoopGroup.next()
- 本质为
eventLoop- 和
executor共享同一个实例引用
- 和
workerPool- 线程来自于调用函数的参数或者
VertxImpl#workerPool(当参数为空时)
- 线程来自于调用函数的参数或者
WORKERexecutor- 本质为:
WorkerExecutor,内部包含1个WorkerPool的引用 - 线程来自于调用函数的参数或者
VertxImpl#workerPool(当参数为空时)
- 本质为:
eventLoop- 同
EVENT_LOOP下的eventLoop
- 同
workerPool- 当进行部署时,如果指定了
workerPoolName,则新创建一个WorkerPool,否则使用默认的:VertxImpl#workerPool workerPool的线程池和executor的线程池共享同一个实例引用
- 当进行部署时,如果指定了
VIRTUAL_THREADexecutor- 本质为:
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
- 继承自