← Назад к вопросам
Для чего использовать Jetty вместо Netty в запросе
1.7 Middle🔥 151 комментариев
#Spring Boot и Spring Data
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Jetty vs Netty — различия и когда что использовать
Это два разных типа серверов: Jetty — это полнофункциональный HTTP-сервер для веб-приложений, Netty — это низкоуровневый framework для сетевых приложений.
Jetty — HTTP сервер приложений
Назначение
Jetty — это полнофункциональный сервер приложений, предназначенный для развертывания веб-приложений (servlet-контейнер).
Особенности
- Встроенный сервер (можно запустить как jar)
- Полная поддержка Servlet API
- Поддержка JSP
- Встроенная поддержка WebSocket
- Готовые конфигурации для веб-приложений
- HTTP/1.1, HTTP/2
Использование Jetty
// Jetty - полнофункциональный веб-сервер
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
public class JettyExample {
public static void main(String[] args) throws Exception {
// Создаем серверный сокет
Server server = new Server(8080);
// Добавляем сервлеты
ServletContextHandler context = new ServletContextHandler();
context.addServlet(MyServlet.class, "/api/*");
server.setHandler(context);
// Запускаем
server.start();
server.join();
}
}
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
resp.getWriter().println("Hello from Jetty");
}
}
Netty — фреймворк для сетевых приложений
Назначение
Netty — низкоуровневый асинхронный фреймворк для построения высоконагруженных сетевых приложений.
Особенности
- Асинхронное I/O (NIO)
- Полный контроль над протоколом
- Поддержка множества протоколов (HTTP, WebSocket, TCP, UDP, DNS и т.д.)
- Экстремальная производительность
- Не содержит HTTP-сервер "из коробки" - нужно все программировать
Использование Netty
// Netty - низкоуровневый фреймворк
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.*;
public class NettyExample {
public static void main(String[] args) throws Exception {
// Event loop для обработки
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
// Добавляем обработчики
ch.pipeline().addLast(
new HttpServerCodec(),
new HttpObjectAggregator(1024 * 1024),
new SimpleChannelInboundHandler<FullHttpRequest>() {
@Override
protected void channelRead0(
ChannelHandlerContext ctx,
FullHttpRequest request) throws Exception {
// Обрабатываем запрос
ByteBuf content = Unpooled.copiedBuffer(
"Hello from Netty",
CharsetUtil.UTF_8);
FullHttpResponse response = new DefaultFullHttpResponse(
HttpVersion.HTTP_1_1,
HttpResponseStatus.OK,
content);
response.headers().set(
HttpHeaderNames.CONTENT_TYPE,
"text/plain");
ctx.writeAndFlush(response);
}
}
);
}
});
// Запускаем
ChannelFuture future = bootstrap.bind(8080).sync();
future.channel().closeFuture().sync();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
}
Сравнение
| Параметр | Jetty | Netty |
|---|---|---|
| Тип | HTTP Servlet контейнер | Сетевой фреймворк |
| Use Case | Веб-приложения | Микросервисы, RPC, WebSocket, чат |
| Легкость | Высокая (конфигурация из коробки) | Низкая (надо писать все сам) |
| Производительность | Хорошая | Экстремальная |
| Асинхронность | Стандартная | Полностью асинхронная |
| Контроль | Ограниченный | Полный |
| Learning curve | Простая | Крутая |
| Из коробки | HTTP, Servlet, JSP | Ничего, только базовый I/O |
Когда использовать Jetty
1. Веб-приложение (Spring Boot, Jersey)
// Spring Boot по умолчанию использует Tomcat, но можно использовать Jetty
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
// Jetty автоматически запустится и обработает /api/users
@RestController
public class UserController {
@GetMapping("/api/users")
public List<User> getUsers() {
return List.of(new User(1, "Alice"));
}
}
2. Встроенный HTTP сервер
public class EmbeddedJettyServer {
public static void main(String[] args) throws Exception {
Server server = new Server(8080);
// Просто статические файлы
ResourceHandler handler = new ResourceHandler();
handler.setResourceBase(".");
server.setHandler(handler);
server.start();
}
}
Когда использовать Netty
1. Высоконагруженный чат
// Netty идеален для WebSocket чатов
public class ChatServer {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(
new HttpServerCodec(),
new HttpObjectAggregator(65536),
new WebSocketServerProtocolHandler("/ws"),
new ChatMessageHandler()
);
}
});
ChannelFuture future = bootstrap.bind(8080).sync();
System.out.println("Chat server started on port 8080");
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully();
}
}
}
2. Асинхронный RPC сервис
// Netty для пользовательского двоичного протокола
public class RpcServer {
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(group)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(
new RpcRequestDecoder(),
new RpcResponseEncoder(),
new RpcServerHandler()
);
}
});
ChannelFuture future = bootstrap.bind(9090).sync();
System.out.println("RPC server started on port 9090");
future.channel().closeFuture().sync();
} finally {
group.shutdownGracefully();
}
}
}
3. Микросервис с собственным протоколом
// Например, обработка бинарного протокола
public class CustomProtocolServer {
public static void main(String[] args) throws Exception {
// Можешь определить любой протокол
// Jetty не подходит для этого
}
}
В чем суть вопроса про "запрос"
Если вопрос про обработку одного HTTP запроса:
// Jetty - для полноценного вебсервера
Server server = new Server(8080);
// Обрабатывает GET, POST, PUT, DELETE автоматически
// Netty - для полного контроля над запросом
pipeline.addLast(new HttpServerCodec()); // сам парсим HTTP
pipeline.addLast(new FullHttpRequestHandler()); // сам обрабатываем
Вывод
Используй Jetty если:
- Пишешь веб-приложение (Spring, Jersey)
- Нужна сервлет-совместимость
- Не нужна экстремальная производительность
- Хочется быстро запустить сервер
Используй Netty если:
- Пишешь микросервис с собственным протоколом
- Нужна экстремальная производительность
- Необходимо обрабатывать миллионы соединений
- Нужен полный контроль над сетевым стеком
- Пишешь чат, game server, или любое другое real-time приложение