Jetty Java объяснение и применение сервера

Jetty java что это

Jetty java что это

Jetty – это легковесный HTTP-сервер и контейнер сервлетов для Java, который поддерживает спецификации Servlet, JSP и WebSocket. Он занимает минимальный объём памяти и позволяет запускать веб-приложения без необходимости полноценного контейнера типа Tomcat. Jetty подходит для интеграции как в крупные корпоративные проекты, так и в локальные приложения для тестирования.

Jetty часто используется для разработки микросервисов, где важна возможность быстро запускать отдельные модули без сложной настройки сервера. Благодаря встроенной поддержке асинхронной обработки запросов он справляется с высокой нагрузкой при минимальных задержках, что особенно важно для API и real-time сервисов.

Для запуска Jetty достаточно скачать дистрибутив с официального сайта и сконфигурировать порт в файле start.ini. Сервлеты можно разворачивать как в виде готового WAR-файла, так и напрямую через Java-код, создавая встроенный сервер. Настройка SSL и управление логами реализуются через XML-конфигурацию или программно, что облегчает интеграцию в существующую инфраструктуру.

Jetty поддерживает расширяемую архитектуру, позволяя подключать фильтры, слушатели и обработчики событий без изменения исходного кода сервера. Это делает его гибким инструментом для тестирования, прототипирования и развёртывания веб-приложений с различными требованиями к безопасности и производительности.

Установка Jetty и запуск первого веб-приложения

Установка Jetty и запуск первого веб-приложения

Скачайте последнюю стабильную версию Jetty с официального сайта https://www.eclipse.org/jetty/download.html. Для большинства проектов подходит дистрибутив jetty-distribution, включающий сервер, библиотеки и примеры конфигураций. Распакуйте архив в удобное место на диске и убедитесь, что установлен Java JDK версии 11 или выше.

Для запуска сервера откройте терминал в папке jetty-home и выполните команду java -jar start.jar. По умолчанию Jetty поднимает сервер на порту 8080, проверка доступности осуществляется через http://localhost:8080. Для изменения порта откройте файл start.ini и отредактируйте строку jetty.port=8080 на нужное значение.

Чтобы развернуть первое веб-приложение, создайте папку webapps в директории Jetty и поместите в неё WAR-файл приложения. Jetty автоматически подхватит приложение при старте сервера. Для встроенного подхода в Java-коде используйте Server и ServletContextHandler:

Server server = new Server(8080);

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath(«/app»);

server.setHandler(context);

server.start();

server.join();

Jetty поддерживает горячую перезагрузку изменений в WAR-файлах, что позволяет тестировать приложение без перезапуска сервера. Для ведения логов используйте конфигурацию logging.properties или подключение сторонних библиотек вроде Logback, чтобы отслеживать обращения к сервлетам и ошибки при старте.

Настройка портов и конфигурация сетевых соединений

Настройка портов и конфигурация сетевых соединений

Jetty позволяет гибко управлять портами и сетевыми интерфейсами, обеспечивая корректную работу серверов в разных средах. Основной порт задаётся в файле start.ini с помощью строки jetty.port=8080. Для использования нескольких портов создаются дополнительные Connector объекты.

Пример конфигурации нескольких портов в Java:

  1. HTTP-коннектор на порту 8080:
    ServerConnector http = new ServerConnector(server);
    http.setPort(8080);
    server.addConnector(http);
  2. HTTPS-коннектор на порту 8443 с SSL:
    SslContextFactory.Server ssl = new SslContextFactory.Server();
    ssl.setKeyStorePath("/path/to/keystore");
    ssl.setKeyStorePassword("password");
    ServerConnector https = new ServerConnector(server, ssl);
    https.setPort(8443);
    server.addConnector(https);

Для ограничения соединений используется setIdleTimeout, задающий максимальное время бездействия, и setAcceptQueueSize, определяющий длину очереди подключений:

  • http.setIdleTimeout(30000);
  • http.setAcceptQueueSize(50);

Jetty поддерживает привязку к конкретному IP-адресу через setHost:

  • http.setHost(«192.168.1.100»);

Для динамического изменения портов без редактирования start.ini рекомендуется создавать коннекторы программно в Java-коде и использовать конфигурационные файлы YAML или XML для централизованного управления настройками сетевых интерфейсов.

Развертывание сервлетов и веб-приложений на Jetty

Развертывание сервлетов и веб-приложений на Jetty

Jetty поддерживает два подхода к развертыванию веб-приложений: через WAR-файлы и программное создание сервлетов в Java-коде. Для WAR-файлов достаточно разместить их в директории webapps, после чего Jetty автоматически развернёт приложение при старте сервера.

Для программного развертывания используйте ServletContextHandler и ServletHolder. Пример:

Server server = new Server(8080);

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath(«/myapp»);

ServletHolder servlet = new ServletHolder(new MyServlet());

ServletHolder servlet = new ServletHolder(new MyServlet());undefined

context.addServlet(servlet, «/api/*»);

server.setHandler(context);

server.start();

server.join();

Для статических ресурсов создайте ResourceHandler и добавьте его в HandlerList:

ResourceHandler resources = new ResourceHandler();

resources.setDirectoriesListed(true);

resources.setResourceBase(«/path/to/static»);

HandlerList handlers = new HandlerList();

handlers.setHandlers(new Handler[] { resources, context });

server.setHandler(handlers);

Jetty поддерживает горячее обновление приложений. Для этого можно включить HotDeployScanner, который отслеживает изменения в директории webapps и автоматически перезапускает приложения без остановки сервера.

Использование SSL и настройка защищённого соединения

Использование SSL и настройка защищённого соединения

Jetty предоставляет встроенную поддержку SSL через SslContextFactory.Server, позволяя настроить защищённое соединение по HTTPS. Для работы требуется ключевой магазин (keystore) с сертификатом, который можно создать командой:

keytool -genkey -alias jetty -keyalg RSA -keystore keystore.jks -keysize 2048

Пример создания HTTPS-коннектора в Java:

Server server = new Server();

SslContextFactory.Server sslContext = new SslContextFactory.Server();

sslContext.setKeyStorePath(«/path/to/keystore.jks»);

sslContext.setKeyStorePassword(«password»);

ServerConnector https = new ServerConnector(server, sslContext);

https.setPort(8443);

server.addConnector(https);

server.start();

Для удобства настройки можно использовать таблицу соответствия параметров:

Параметр Назначение Пример значения
setKeyStorePath Путь к keystore /home/user/jetty/keystore.jks
setKeyStorePassword Пароль keystore password
setKeyManagerPassword Пароль ключа внутри keystore keypass
setTrustStorePath Путь к truststore для проверки клиентских сертификатов /home/user/jetty/truststore.jks
setTrustStorePassword Пароль truststore trustpass

Для усиления безопасности рекомендуется включать только современные протоколы TLS и ограничивать список поддерживаемых шифров через методы setIncludeProtocols и setIncludeCipherSuites. Jetty также позволяет принудительно перенаправлять HTTP-запросы на HTTPS с помощью RewriteHandler.

Мониторинг состояния сервера и логирование запросов

Мониторинг состояния сервера и логирование запросов

Jetty поддерживает мониторинг через JMX, позволяя отслеживать состояние серверных компонентов, активные соединения и использование ресурсов. Для включения JMX добавьте jetty-jmx.jar в classpath и подключите MBeanContainer к серверу:

MBeanContainer mbContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer());

server.addBean(mbContainer);

Для логирования HTTP-запросов используется RequestLog. Настройка через NCSARequestLog позволяет сохранять все обращения в формате, совместимом с веб-серверами:

NCSARequestLog requestLog = new NCSARequestLog(«/var/log/jetty/yyyy_mm_dd.request.log»);

requestLog.setAppend(true);

requestLog.setExtended(false);

RequestLogHandler logHandler = new RequestLogHandler();

logHandler.setRequestLog(requestLog);

HandlerCollection handlers = new HandlerCollection();

handlers.setHandlers(new Handler[] { logHandler, server.getHandler() });

server.setHandler(handlers);

Jetty позволяет разделять логи по контекстам приложений и настроить ротацию файлов через setRetainDays. Для анализа производительности можно использовать StatisticsHandler, который собирает данные о времени обработки запросов, количестве активных потоков и ошибках.

Встраивание Jetty в Java-приложение для локального сервера

Встраивание Jetty в Java-приложение для локального сервера

Jetty можно встроить напрямую в Java-приложение, создавая локальный сервер без необходимости отдельного запуска. Для этого подключите зависимости jetty-server и jetty-servlet через Maven или Gradle.

Пример минимальной конфигурации встроенного сервера:

Server server = new Server(8080);

ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

context.setContextPath(«/»);

context.addServlet(new ServletHolder(new MyServlet()), «/api/*»);

server.setHandler(context);

server.start();

server.join();

Для обслуживания статических файлов добавьте ResourceHandler:

ResourceHandler resourceHandler = new ResourceHandler();

resourceHandler.setResourceBase(«src/main/resources/static»);

HandlerList handlers = new HandlerList();

handlers.setHandlers(new Handler[]{resourceHandler, context});

server.setHandler(handlers);

Встроенный Jetty удобен для локального тестирования API, демонстрационных проектов и инструментов администрирования. Для управления жизненным циклом сервера используйте методы start(), stop() и join(), обеспечивая корректное завершение потоков и освобождение портов.

Вопрос-ответ:

Что такое Jetty и чем он отличается от других Java-серверов?

Jetty — это лёгкий HTTP-сервер и контейнер сервлетов для Java, поддерживающий спецификации Servlet, JSP и WebSocket. В отличие от более тяжёлых серверов типа Tomcat, Jetty занимает меньше памяти и быстрее запускается. Он подходит для встроенных решений, микросервисов и тестирования веб-приложений, позволяя разворачивать приложения без сложной конфигурации.

Как развернуть веб-приложение на Jetty?

Веб-приложения можно разворачивать через WAR-файл, помещённый в директорию webapps, либо программно в Java-коде с помощью ServletContextHandler и ServletHolder. Для статических ресурсов используется ResourceHandler. Jetty поддерживает горячую перезагрузку приложений, что позволяет тестировать изменения без перезапуска сервера.

Каким образом настроить защищённое соединение через SSL в Jetty?

Для настройки HTTPS создаётся объект SslContextFactory.Server с указанием пути к keystore и пароля. Создаётся ServerConnector с SSL, который добавляется к серверу. Для усиления безопасности рекомендуется включать современные протоколы TLS и ограничивать поддерживаемые шифры через методы setIncludeProtocols и setIncludeCipherSuites. Также можно настроить принудительное перенаправление HTTP на HTTPS.

Как контролировать состояние сервера и отслеживать запросы в Jetty?

Для мониторинга состояния используется JMX через MBeanContainer, позволяющий получать данные о соединениях, потоках и нагрузке. HTTP-запросы логируются с помощью RequestLog или NCSARequestLog, а StatisticsHandler собирает показатели времени обработки запросов и ошибок. Настройка ротации и разделения логов позволяет вести отдельные записи для каждого приложения.

Ссылка на основную публикацию