面试记录 2026-10-11
题目:Netty 中用了哪些设计模式?
难度:difficulty/high
标签:spring/netty, difficulty/high
评分:⭐⭐☆☆☆(2/5)
我的回答
NGINX 首先使用的单例模式,它使用多个过滤器来处理过多的请求。另外它使用了责任链设计模式。还有工厂设计模式,创建 netty 对象的时候。
点评
优点:
- 提到了责任链模式(Netty 的 Pipeline 确实是责任链)
- 提到了工厂模式(Bootstrap 构建 Netty 对象)
不足:
- ❌ 严重错误:把"Netty"说成了"NGINX",这是两个完全不同的框架(NGINX 是 C 语言写的 Web 服务器,Netty 是 Java NIO 框架)
- 漏掉了观察者模式(ChannelHandler/EventLoop 的事件驱动机制)
- 漏掉了策略模式(传输层选择 TCP/UDP、解码器策略)
- 漏掉了模板方法模式(SimpleChannelInboundHandler 定义了 handle 模板)
- 漏掉了外观模式(ChannelPipeline 简化了复杂的事件处理链)
- 漏掉了建造者模式(Bootstrap 的构建过程)
补充:
- Netty 核心设计模式:责任链(Pipeline)、观察者(ChannelHandler)、策略(传输层)、模板方法(Handler 模板)、外观(Pipeline 简化操作)
- 重要区分:Netty 是 Java NIO 框架,NGINX 是 C 语言 Web 服务器
完整讲解
第一部分:知识重点剖析
核心考点定位:考察对 Netty 架构设计的理解,以及能否把设计模式与 Netty 的实际实现对应。
知识点拆解:
- 责任链模式(Netty 核心):
- ChannelPipeline:每个 Channel 都有一条 Pipeline,由多个 ChannelHandler 组成
- 请求沿着 Pipeline 向上传递(Inbound),响应沿着 Pipeline 向下传递(Outbound)
- 每个 Handler 可以处理特定事件,然后决定是否传递给下一个 Handler
- 观察者模式(事件驱动):
- EventLoop:每个 EventLoop 处理多个 Channel 的事件
- ChannelHandler:实现事件回调(channelRead、exceptionCaught 等)
- 事件驱动架构,解耦了事件产生和处理
- 策略模式(灵活选择):
- 传输层选择:NioSocketChannel(TCP)、NioDatagramChannel(UDP)
- 编解码器:ByteBufDecoder、MessageToByteEncoder 等
- 运行时选择不同的实现
- 模板方法模式(抽象处理流程):
- SimpleChannelInboundHandler:定义了 channelRead0 模板,子类实现具体处理
- ChannelDuplexHandler:定义了 inbound/outbound 两套模板
- 外观模式(简化复杂操作):
- ChannelPipeline:简化了事件处理的复杂性
- Bootstrap:简化了 Netty 服务的启动过程
- 建造者模式(构建复杂对象):
- Bootstrap:通过 builder 模式配置 Netty 服务
- 链式调用设置参数,最后 build() 创建实例
- 单例模式(谨慎使用):
- EventLoopGroup:通常每个服务创建一组 EventLoopGroup
- 不是严格的单例,但可以复用
第二部分:考察方向与延伸递进
考察方向:
- 深度:Netty 源码中对设计模式的具体实现类
- 广度:设计模式之间的对比和适用边界
- 应用:业务开发中如何借鉴 Netty 的设计思路
延伸递进面试题:
- Netty 的 Pipeline 和 Servlet 的 FilterChain 有什么区别?
- 解答要点:Pipeline 是双向的(Inbound/Outbound),FilterChain 是单向的;Pipeline 支持 handler 的添加/移除,FilterChain 是固定的;Pipeline 的事件驱动更灵活
- Netty 的 EventLoop 模型和 Reactor 模型有什么关系?
- 解答要点:EventLoop 是 Reactor 模型的具体实现;BossGroup 接收连接,WorkerGroup 处理 IO 事件;每个 EventLoop 是单线程的,无锁化设计
- Netty 如何扩展自定义 Handler?
- 解答要点:继承 ChannelInboundHandlerAdapter 或 ChannelOutboundHandlerAdapter;实现感兴趣的事件回调;通过 pipeline.addLast() 添加
第三部分:面试者参考回答(300-600 字口语化)
面试官您好,Netty 是设计模式的应用典范,我按结构型、行为型、创建型三类来讲。
结构型模式:
- 责任链模式(Netty 核心):ChannelPipeline 由多个 ChannelHandler 组成,请求沿着 Pipeline 向上传递,响应向下传递。每个 Handler 可以处理特定事件,决定是否传递给下一个 Handler
- 外观模式:ChannelPipeline 简化了事件处理的复杂性,Bootstrap 简化了 Netty 服务的启动过程
行为型模式:
- 观察者模式:EventLoop 处理多个 Channel 的事件,ChannelHandler 实现事件回调(channelRead、exceptionCaught 等),事件驱动架构解耦了事件产生和处理
- 模板方法:SimpleChannelInboundHandler 定义了 channelRead0 模板,子类实现具体处理;ChannelDuplexHandler 定义了 inbound/outbound 两套模板
- 策略模式:传输层选择(NioSocketChannel/NioDatagramChannel)、编解码器(ByteBufDecoder/MessageToByteEncoder),运行时选择不同的实现
创建型模式:
- 建造者模式:Bootstrap 通过 builder 模式配置 Netty 服务,链式调用设置参数,最后 build() 创建实例
- 单例模式:EventLoopGroup 通常每个服务创建一组,可以复用
关键区分点:
- Netty vs NGINX:Netty 是 Java NIO 框架,NGINX 是 C 语言 Web 服务器,完全不同的框架
- 责任链 vs 管道:Netty 的 Pipeline 是双向的责任链,支持动态添加/移除 Handler
实际工程借鉴:我在开发 RPC 框架时会借鉴 Netty 的设计——用 Pipeline 处理协议解析、编解码、业务处理;用 EventLoop 实现无锁化的高并发处理;用 Builder 模式简化客户端配置。