Зачем нужен Tomcat
Что проверяют
Понимаете ли вы, что происходит между HTTP-запросом и вашим контроллером и какое место Tomcat занимает в современном Java-стеке. Следом обычно спрашивают, чем Tomcat отличается от полноценного сервера приложений и сколько запросов он обрабатывает одновременно.
Как отвечать
Tomcat это контейнер сервлетов: он реализует часть спецификаций Jakarta EE (Servlet, JSP, Expression Language, WebSocket), принимает HTTP-соединения и передаёт запросы в код приложения.
- Connector (Coyote): слушает порт, разбирает HTTP/1.1 и HTTP/2, берёт поток из пула. По умолчанию пул до 200 потоков, в Spring Boot это
server.tomcat.threads.max; - Catalina: собственно контейнер. Прогоняет запрос через цепочку
Filter, вызывает нужный сервлет и управляет его жизненным циклом:init()один раз,service()на каждый запрос,destroy()при остановке; - Jasper: компилирует JSP в сервлеты. В новых проектах встречается редко;
- конфигурация:
server.xmlдля коннекторов и хостов,web.xmlдля приложения, хотя с Servlet 3.0 его заменяют аннотации.
Главное для собеседования: в Spring Boot приложение со spring-boot-starter-web запускает встроенный Tomcat внутри jar, и весь Spring MVC работает через один сервлет, DispatcherServlet. Отдельный Tomcat с деплоем WAR в webapps сегодня встречается в основном в легаси.
Назовите версии и пространство имён. Tomcat 9 работает с javax.servlet, начиная с Tomcat 10 пакеты переехали в jakarta.servlet. Spring Boot 3 использует Tomcat 10.1, Spring Boot 4 перешёл на Tomcat 11. На Java 21 можно включить виртуальные потоки через spring.threads.virtual.enabled=true, тогда блокирующий вызов не занимает поток платформы.
Где спотыкаются
Называют Tomcat полноценным сервером приложений. EJB, JMS и распределённых транзакций в нём нет, это задачи WildFly или Payara.
Кладут старый WAR с javax.servlet в Tomcat 10 и удивляются, что приложение не стартует. Нужна миграция пакетов.
Не связывают пул потоков с блокирующим кодом. Медленная база или внешний сервис занимают все 200 потоков, и сервис перестаёт отвечать при почти нулевой загрузке CPU.