У веб-додатках на базі 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, який призначений для адаптивного програмування.
Ключові особливості:
Подійно-керований: Netty використовує архітектуру, орієнтовану на події, що робить її зручною для ефективної обробки великої кількості одночасних з'єднань. Неблокуючий ввод/вивод: Netty використовує неблокуючий ввод/вихід, що дозволяє обробляти багато з'єднань з меншою кількістю потоків. Масштабованість: Розроблено для високої паралелізації, низької затримки та високої пропускної здатності.
Внутрішня архітектура
Цикл події: Основним компонентом Netty є цикл події, який асинхронно керує операціями вводу/виводу. Група циклів подій містить один або кілька циклів події. Канал: Представляє з'єднання, наприклад вхідний HTTP-запит, і пов'язаний із циклом події. Модель потоку: Netty використовує невелику кількість потоків для обробки великої кількості з'єднань. Кожен цикл подій працює в одному потоці і обробляє кілька каналів, що робить його дуже масштабованим.
Приклад сценарію: обробка паралельних запитів
Розглянемо сценарій, коли на сервер Netty надходить п'ять паралельних запитів:
Подійно-орієнтована модель: Netty розповсюджує п'ять запитів у своєму циклі подій. Неблокуючий ввод/вивод: операція не блокує потік циклу події. Натомість операції введення/виведення виконуються асинхронно, що дозволяє одному потоку ефективно керувати кількома з'єднаннями.
Масштабованість: Завдяки своїй неблокуючій природі Netty може обробляти велику кількість з'єднань із відносно невеликою кількістю потоків.
Заслуга:
Дуже ефективна для завдань, що потребують багато I/O. Відмінна масштабованість і продуктивність при великій паралелі. Ідеально підходить для реактивного програмування та сучасних веб-додатків.
Недолік:
Це складніше зрозуміти та налаштувати. Порівняно з традиційними застосунками на основі сервлетів, потрібна інша модель програмування (реактивна).
висновок
Netty та Tomcat обслуговують різні сфери серверних фреймворків. Netty — це дуже гнучкий базовий фреймворк, розроблений для власних мережевих протоколів і високопродуктивних сценаріїв; Tomcat є перевіреним вибором для веб-додатків на Java, які відповідають стандартам Java EE та Jakarta EE. Вибір між двома залежать від конкретних потреб проєкту, чи то створення веб-сервера з власними протоколами, чи традиційного веб-додатку.
Посилання:
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно.
Вхід за гіперпосиланням видно. |