《Netty 高性能网络编程》3.1 EventLoopGroup 与线程归属
本节回答 linkd-v2 上线前的三个问题:boss 与 worker 各开多少线程、一个 Channel 为什么终身只属于一个 EventLoop、group.next() 如何分配连接。用探针打印 channel.eventLoop() 与线程名,给出 10 核机器的真实分配、io.netty.eventLoopThreads 的效果,以及多连接共享 EventLoop 的延迟代价。
tag
本节回答 linkd-v2 上线前的三个问题:boss 与 worker 各开多少线程、一个 Channel 为什么终身只属于一个 EventLoop、group.next() 如何分配连接。用探针打印 channel.eventLoop() 与线程名,给出 10 核机器的真实分配、io.netty.eventLoopThreads 的效果,以及多连接共享 EventLoop 的延迟代价。
ChannelOption 是强类型常量,作用在监听或连接 channel 上。本节拆开 SO_BACKLOG、TCP_NODELAY、SO_KEEPALIVE、CONNECT_TIMEOUT_MILLIS、ALLOCATOR、RCVBUF_ALLOCATOR、WRITE_BUFFER_WATER_MARK 与 AUTO_READ,给出 linkd-v2 参数表和打印 config 的方法。
Channel 从注册到注销经历 registered、active、read、inactive、unregistered 五个阶段,ChannelFuture 串起异步结果与监听器。用 linkd-v2 LifecycleLoggingHandler 与 RegistryHandler 演示事件顺序、closeFuture 关闭、CLOSE 监听器和连接失败处理,说明 sync() 死锁边界。
ServerBootstrap 与 Bootstrap 是两条启动路径:一条接受连接,一条发起连接。拆开 group、childHandler、option、childOption、bind 与 connect 的分工,说明 boss/worker 职责和 ChannelInitializer 每连接执行一次的语义,给出 linkd-v2 LinkdServer 启动与 sync() 线程边界。
本节搭 linkd-v2 四模块 Maven 工程:父 POM 固定 netty.version=4.2.19.Final 与 maven.compiler.release=25,模块保持单向依赖,入口 LinkdV2Main 用 System.Logger 打印协议常量,并给出 mvn -q -DskipTests package 的构建结果与 netty-all 聚合 POM 的验证方法。
本节把卷一 linkd 的 EventLoop、Connection、Handler、BufferPool、FrameDecoder 逐个映射到 Netty 的 EventLoopGroup、Channel、Pipeline、ByteBufAllocator、ByteToMessageDecoder,用对照表和最小 Echo 说明哪些手写逻辑被 Netty 接管,哪些责任仍留在业务代码里。
本节把 Netty 放回一次真实请求的路径里:从 JDK NIO 的 Selector 到 HTTP 协议处理,说明它封装了事件分发、半包与写队列,没封装路由、认证和业务语义;并对比 Tomcat、Jetty、OkHttp 的层次差异,给出 linkd-v2 的四模块划分与 9090 到 9093 的端口分工。
《Netty 高性能网络编程》全书导航:给出协议实现、性能排查、生产网关三条学习路径,十五章分组表与每章首节入口,linkd-v2 四个模块的推进与验收状态,以及 50 篇的阅读顺序、依赖关系、每组能力的自测检查点和附录入口,方便按目标跳读。
交代本书的读者对象与前置知识,列出 Temurin 25.0.5+8、Maven 3.9.12、Netty 4.2.19.Final 的环境清单和 Apple M1 Pro 机器口径,说明 linkd-v2 的四道门禁、端口 9090/9091/9092/9093、代码与输出约定,以及每节内容的验证步骤和常见误解。
从卷一手写 NIO 的 linkd 留下的四个缺口切入,说明为什么还要学 Netty:给出 EventLoop、Channel、Pipeline、ByteBuf 与手写结构的对应关系,交代三卷本定位、Netty 4.2.19.Final 与 JDK 25 的版本口径,以及全书主线 linkd-v2 的验收产出。