in zuul-core/src/main/java/com/netflix/zuul/netty/server/Server.java [364:418]
private void initializeTransport() {
// TODO - try our own impl of ChooserFactory that load-balances across the eventloops using leastconns algo?
EventExecutorChooserFactory chooserFactory;
if (USE_LEASTCONNS_FOR_EVENTLOOPS.get()) {
chooserFactory = new LeastConnsEventLoopChooserFactory(eventLoopGroupMetrics);
} else {
chooserFactory = DefaultEventExecutorChooserFactory.INSTANCE;
}
ThreadFactory workerThreadFactory = new CategorizedThreadFactory(name + "-ClientToZuulWorker");
Executor workerExecutor = new ThreadPerTaskExecutor(workerThreadFactory);
Map<ChannelOption<?>, Object> extraOptions = new HashMap<>();
boolean useNio = FORCE_NIO.get();
boolean useIoUring = FORCE_IO_URING.get();
if (useIoUring && ioUringIsAvailable()) {
channelType = IOUringServerSocketChannel.class;
defaultOutboundChannelType.set(IOUringSocketChannel.class);
clientToProxyBossPool = new IOUringEventLoopGroup(
acceptorThreads, new CategorizedThreadFactory(name + "-ClientToZuulAcceptor"));
clientToProxyWorkerPool = new IOUringEventLoopGroup(workerThreads, workerExecutor);
} else if (!useNio && epollIsAvailable()) {
channelType = EpollServerSocketChannel.class;
defaultOutboundChannelType.set(EpollSocketChannel.class);
extraOptions.put(EpollChannelOption.TCP_DEFER_ACCEPT, -1);
clientToProxyBossPool = new EpollEventLoopGroup(
acceptorThreads, new CategorizedThreadFactory(name + "-ClientToZuulAcceptor"));
clientToProxyWorkerPool = new EpollEventLoopGroup(
workerThreads, workerExecutor, chooserFactory, DefaultSelectStrategyFactory.INSTANCE);
} else if (!useNio && kqueueIsAvailable()) {
channelType = KQueueServerSocketChannel.class;
defaultOutboundChannelType.set(KQueueSocketChannel.class);
clientToProxyBossPool = new KQueueEventLoopGroup(
acceptorThreads, new CategorizedThreadFactory(name + "-ClientToZuulAcceptor"));
clientToProxyWorkerPool = new KQueueEventLoopGroup(
workerThreads, workerExecutor, chooserFactory, DefaultSelectStrategyFactory.INSTANCE);
} else {
channelType = NioServerSocketChannel.class;
defaultOutboundChannelType.set(NioSocketChannel.class);
NioEventLoopGroup elg = new NioEventLoopGroup(
workerThreads,
workerExecutor,
chooserFactory,
SelectorProvider.provider(),
DefaultSelectStrategyFactory.INSTANCE);
elg.setIoRatio(90);
clientToProxyBossPool = new NioEventLoopGroup(
acceptorThreads, new CategorizedThreadFactory(name + "-ClientToZuulAcceptor"));
clientToProxyWorkerPool = elg;
}
transportChannelOptions = Collections.unmodifiableMap(extraOptions);
postEventLoopCreationHook(clientToProxyBossPool, clientToProxyWorkerPool);
}