В веб-приложениях на базе Spring Boot пакет spring-boot включает встроенный веб-сервер, включая tomcat, jetty, undertow и netty.
Введение в распространённые веб-контейнеры
Кот
Tomcat в настоящее время включён в проект Apache, официальная ссылка —Вход по гиперссылке виден. Tomcat — это мейнстримный Java-веб-сервер, поэтому он очень стабилен и зрел, а сообщество активно и богато документацией и ресурсами. Tomcat поддерживает протоколы Http, Http/2, AJP, WebSocket и поддерживает Servlet 6.0
Мол
Jetty — сервер, предоставляемый Eclipse, официальная ссылка —Вход по гиперссылке виден. Он легче, чем Tomcat, и имеет собственную асинхронную поддержку. Jetty поддерживает протоколы Http, Http/2, Http/3, AJP, WebSocket и поддерживает Servlet 6.0
Нетти
Netty — это временно ориентированный асинхронный сетевой фреймворк, широко используемый в высокопроизводительных веб-приложениях, особенно серверных приложениях, обрабатывающих большое количество одновременных соединений; официальная связь —Вход по гиперссылке виден. Netty поддерживает почти все протоколы, включая SSL/TLS, HTTP, HTTP/2, HTTP/3, WebSockets, DNS, SPDY, SMTP и другие
Отлив прибоя
Undertow — сервер, предоставляемый JBoos, официальный адрес —Вход по гиперссылке виден. Undertow характеризуется лёгкостью, высокой производительностью и локальным потреблением ресурсов, а также поддерживает встроенные приложения и микросервисы. Undertow поддерживает протоколы Http, Http/2, WebSocket и поддерживает Servlet 4.0
Apache Tomcat
Apache Tomcat — это широко используемый веб-сервер и контейнер сервлетов. Он является выбором по умолчанию для традиционных приложений Spring Boot благодаря своей надёжности, простоте использования и совместимости с API Servlet.
Ключевые особенности:
На основе сервлетов: Tomcat построен на основе API Servlet, что делает его идеальным для традиционных приложений Spring MVC. Блокировка ввода-вывода: Tomcat работает по модели одного потока на запрос, то есть каждый входящий запрос обрабатывается отдельным потоком. Простота настройки: Tomcat легко настроить и настроить с помощью Spring Boot, что делает его идеальным для широкого спектра веб-приложений.
Внутренняя архитектура
Коннекторы: Управление сетевыми соединениями, прием и обработка HTTP-запросов. Контейнер: отвечает за управление жизненным циклом сервлета, включая загрузку, инициализацию и вызов. Модель потока: Tomcat использует пулы потоков, где каждый запрос обрабатывается отдельным потоком в пуле. Эта модель проста, но может вызвать проблемы с масштабируемостью при высокой нагрузке из-за конкуренции потоков и накладных расходов памяти.
Пример сценария: обработка параллельных запросов
Рассмотрим ситуацию, когда на сервер Tomcat поступает пять параллельных запросов:
Один поток на каждый запрос: Tomcat назначает отдельный поток каждому из пяти запросов из своего пула потоков. Блокировка ввода-вывода: каждый поток обрабатывает свои запросы синхронно, блокируя, если требуются операции ввода/вывода, например, вызовы базы данных.
Управление ресурсами: если в пуле потоков достаточно свободных потоков, все пять запросов обрабатываются одновременно. Если нет, другие запросы будут ждать в очереди, пока поток не станет доступен.
Заслуга:
Просто и понятно. Идеально подходит для традиционных веб-приложений. Зрелый, стабильный и с широкой поддержкой сообщества.
Недостаток:
Ограниченная масштабируемость при высокой нагрузке из-за накладных расходов потоков. Большее потребление памяти на запрос.
Нетти
Netty — это высокопроизводительный, асинхронный веб-фреймворк, управляемый событиями. Это стандартный фреймворк для Spring WebFlux, который предназначен для адаптивного программирования.
Ключевые особенности:
Event-Driven: Netty использует архитектуру, управляемую событиями, что делает её удобной для эффективной обработки большого объёма одновременных соединений. Неблокирующий ввод-вывод: Netty использует неблокирующий ввод-вывод, что позволяет обрабатывать множество соединений с меньшим количеством потоков. Масштабируемость: Разработано для приложений с высокой параллельностью, низкой задержкой и высокой пропускной способностью.
Внутренняя архитектура
Цикл событий: Основным компонентом Netty является цикл событий, который управляет операциями ввода-вывода асинхронно. Группа циклов событий содержит одну или несколько циклов событий. Канал: представляет соединение, например входящий HTTP-запрос, и связан с циклом событий. Модель потоков: Netty использует небольшое количество потоков для обработки большого количества соединений. Каждый цикл событий работает в одном потоке и обрабатывает несколько каналов, что делает его высокомасштабируемым.
Пример сценария: обработка параллельных запросов
Рассмотрим сценарий, когда на сервер Netty поступает пять параллельных запросов:
Event-Driven Model: Netty распределяет пять запросов в своей цикле событий. Неблокирующий ввод-вывод: операция не блокирует поток событийного цикла. Вместо этого операции ввода-вывода выполняются асинхронно, что позволяет одному потоку эффективно управлять несколькими соединениями.
Масштабируемость: Благодаря своей неблокирующей природе Netty может обрабатывать большое количество соединений с относительно небольшим числом потоков.
Заслуга:
Очень эффективно для задач с высокой нагрузкой на I/O. Превосходная масштабируемость и производительность при высокой параллелности. Идеально подходит для реактивного программирования и современных веб-приложений.
Недостаток:
Её сложнее понять и настроить. По сравнению с традиционными приложениями на основе сервлета, требуется другая модель программирования (реактивная).
заключение
Netty и Tomcat обслуживают разные направления в области серверных фреймворков. Netty — это высокогибкий базовый фреймворк, разработанный для кастомных сетевых протоколов и высокопроизводительных сценариев; Tomcat — проверенный выбор для веб-приложений на Java, соответствующих стандартам Java EE и Jakarta EE. Выбор между двумя вариантами зависит от конкретных потребностей проекта — будь то создание веб-сервера с индивидуальными протоколами или традиционное веб-приложение.
Ссылка:
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Вход по гиперссылке виден.
Вход по гиперссылке виден. |