← Назад к вопросам

Для чего использовать 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();
        }
    }
}

Сравнение

ПараметрJettyNetty
Тип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 приложение
Для чего использовать Jetty вместо Netty в запросе | PrepBro