Netty和Tomcat
Netty和Tomcat
| 特性 | Netty | Tomcat |
|---|---|---|
| 定位 | 网络编程框架 | Servlet容器 / Web服务器 |
| 核心模型 | 异步事件驱动 | 基于Servlet规范的请求-响应 |
| 协议支持 | 灵活。可构建HTTP、WebSocket及任何自定义协议。 | 固定。主要面向HTTP/1.x, HTTP/2,并通过升级支持WebSocket。 |
| 使用方式 | 编程组装协议栈和业务逻辑。 | 配置和部署符合Servlet规范的Web应用(WAR包)。 |
| 开箱即用 | 否,需要开发。 | 是,下载即可运行Web项目。 |
| 性能 | 极致的性能优化,更少的抽象层。 | 性能优秀,但存在Servlet规范带来的抽象层开销。 |
| 典型场景 | 游戏服务器、IoT、RPC框架、微服务网关、需要自定义协议的任何场景。 | 传统的Web应用、RESTful API服务、基于Spring MVC等Web框架的应用。 |
- Netty 是一个基于NIO的网络应用开发框架,它可以用来实现HTTP服务器、WebSocket服务器以及任何自定义协议的服务器/客户端。
- Tomcat 是一个主要基于NIO Connector实现的、符合Servlet规范的HTTP Web服务器和Servlet容器。它本身就是一个成熟的产品,主要用于部署和运行Web应用程序。
简单来说:如果你想从零开始构建一个特定协议的服务器,或者对性能有极致要求,用Netty。如果你想快速部署一个遵循标准规范的Web应用,用Tomcat。
- Netty是一个可以实现各种协议服务器的框架,Tomcat是一个已经实现HTTP协议的模板服务器
线程模型对比
| 角色 | Tomcat (NIO) | Netty | 职责简述 |
|---|---|---|---|
| 接收连接 | Acceptor (1个或多个) | Boss Group (1个或多个线程) | 接受客户端TCP连接 |
| 轮询IO事件 | Poller (1个或多个) | Worker Group (核心) | 轮询Selector,处理读写就绪事件 |
| 执行业务 | Worker (线程池) | Worker Group中的同一线程 或 自定义业务线程池 | 实际处理业务逻辑(解码、编码、业务计算) |
最大的区别在于:
- Tomcat:Poller(IO轮询) 和 Worker(业务执行)是分开的线程池。
- Netty:Worker Group 中的线程 既做IO轮询,又执行业务逻辑(除非你手动添加
BusinessExecutorGroup)。
如果你想在 Netty 中实现 Tomcat 的“分离模式”,需要这样做:
// 模拟 Tomcat 的模型
EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 相当于 Acceptor
EventLoopGroup workerGroup = new NioEventLoopGroup(4); // 相当于 Poller + 默认Worker
// 创建一个独立的业务线程池(模拟 Tomcat 的 Worker 线程池)
ExecutorService businessExecutor = Executors.newCachedThreadPool();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new ChannelInboundHandlerAdapter() {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
// 主动把业务抛给独立线程池,模拟 Tomcat
businessExecutor.submit(() -> {
// 执行耗时业务(比如查询数据库)
heavyBusinessLogic();
ctx.writeAndFlush(msg);
});
}
});
}
});
浙公网安备 33010602011771号