Как происходит обработка HTTP запроса от клиента до получения ответа
Что проверяют
Видите ли вы путь запроса целиком, от браузера до вашего контроллера и обратно, и знаете ли, где он может застрять. Уточнение обычно одно из двух: чем фильтр отличается от интерсептора или сколько запросов Tomcat обработает одновременно.
Как отвечать
Ведите рассказ по слоям, сверху вниз:
- сеть: клиент резолвит имя через DNS, открывает TCP-соединение и делает TLS-рукопожатие. Соединение переиспользуется благодаря keep-alive, а в HTTP/2 по одному соединению идут несколько запросов параллельно;
- балансировщик или прокси: nginx или облачный балансировщик терминирует TLS, добавляет заголовки вроде
X-Forwarded-Forи выбирает экземпляр приложения; - контейнер сервлетов: в Spring Boot по умолчанию встроенный Tomcat. Коннектор принимает соединение, разбирает HTTP и отдаёт запрос потоку из пула (по умолчанию до 200 потоков,
server.tomcat.threads.max). Сspring.threads.virtual.enabled=trueна Java 21+ каждый запрос идёт в виртуальном потоке; - цепочка фильтров: сервлетные
Filter, среди нихSecurityFilterChainSpring Security. Здесь аутентификация, CORS, логирование; DispatcherServlet: черезHandlerMappingнаходит метод контроллера,HandlerInterceptorотрабатывает до и после,HttpMessageConverter(обычно Jackson) превращает JSON в объект, срабатывает валидация@Valid;- ваш код: контроллер, сервис, репозиторий, транзакция, запрос в базу;
- ответ: объект сериализуется тем же конвертером, исключения перехватывает
@ControllerAdvice, контейнер пишет статус, заголовки и тело в сокет.
Где спотыкаются
Путают фильтр и интерсептор. Фильтр живёт на уровне сервлет-контейнера и видит любой запрос, включая статику. Интерсептор работает внутри Spring MVC и знает, какой метод контроллера вызовется.
Считают, что поток держится на каждое соединение. В NIO-коннекторе Tomcat соединения ждут без потока, поток занят только на время обработки запроса. Поэтому медленная база забивает пул потоков, а не лимит соединений.
Сводят ответ к «REST и SOAP». Это стили API поверх HTTP, к пути запроса через сервер они почти не относятся.