-
Запустить программу (приложен скомпилированный jar файл). Для запуска обязательно должен быть доступен файл конфига ./resources/server.properties.
-
Выбрать настройки сервера. Выбранные настройки можно сохранить, тогда они перезапишутся в соответствующем конфиг файле.
-
Логирование стоит включить только для удобства проверки единичных тестовых запросов! Очень негативно сказывается на производительности!
-
Нажать Run, сервер запустится. В противном случае покажется сообщение с ошибкой.
-
Также есть возможность перезапустить сервер или обновить кэш по соответствующим кнопкам.
Была выбрана следующая архитектура веб-сервера:
-
Главный поток веб-сервера использует неблокирующий ввод/вывод NIO для чтения новых запросов и записи ответов. Новый запрос ставится в очередь на обработку.
-
Создается несколько потоков, которые обрабатывают очередь из запросов. Эмпирически я подобрал, что хорошая производительность получается с использованием 4 таких потоков, но естесственно это сильно зависит от системы и юз кейса. Обработка запроса подразумевает парсинг запроса, нахождение запрашиваемого контента и формирование корректного ответа, который далее отправляется в главный поток для передачи обратно.
-
Поиск и чтение файлов осуществляется отдельным ответственным за это классом, который может закэшировать файлы в памяти. По умолчание кэширование включено, но можно отключить. Файлы имеющие расширение отличное от .jpg, .jpeg, .html, .js будут не доступны для сервера и рассматриваться как несуществующие, даже если они находятся в рабочей папке сервера.
Проводил проверку как на Windows, так и на Ubuntu. Полноценного тестирование не проводил, возможно, есть какие то глюки или баги =)