Skip to content

Alex-e/nettyServer

Repository files navigation

nettyServer

Задание:

Необходимо реализовать http-сервер на фреймворке netty (http://netty.io/), со следующим функционалом:

  1. По запросу на http://somedomain/hello отдает «Hello World» через 10 секунд
  2. По запросу на http://somedomain/redirect?url= происходит переадресация на указанный url
  3. По запросу на http://somedomain/status выдается статистика:
  • общее количество запросов
  • количество уникальных запросов (по одному на IP)
  • счетчик запросов на каждый IP в виде таблицы с колонкам и IP, кол-во запросов, время последнего запроса
  • количество переадресаций по url'ам в виде таблицы, с колонками url, кол-во переадресация
  • количество соединений, открытых в данный момент
  • в виде таблицы лог из 16 последних обработанных соединений, колонки src_ip, URI, timestamp, sent_bytes, received_bytes, speed (bytes/sec)

Все это (вместе с особенностями имплементации в текстовом виде) выложить на github, приложить к этому:

  • скриншоты как выглядят станицы /status в рабочем приложении
  • скриншот результата выполнения команды ab – c 100 – n 10000 http://somedomain/status
  • еще один скриншот станицы /status, но уже после выполнение команды ab из предыдущего пункта

Реализация:

После сборки проекта при помощи Maven в папке target появится netty_server_executable.jar в котором уже прописан classpath к библиотеке netty в папке dependency-jars. Таким образом он сразу готов к запуску(java -jar netty_server_executable.jar).

Сервер запускается через MainClass с указанием номера порта(по умолчанию 8080). После запуска MainClass прослушивает консоль для получения команды остановки сервера "stop"/"s".

Обработка запросов реализована с использованием двух custom Handlers.

  1. StatisticsHandler - Shared(singleton) handler через который проходят все запросы - учитывает статистику. При запросе на страницу статистики сервера, оборачивает все данные в 1 объект и отправлет его через AttributeMap для HttpHandler.

  2. HttpHandler - обрабатывает FullHttpRequest запросы созданные аггрегатором из двух запросов (хедера и тела). Каждый экземпляр HttpHandler ведет лог своего соеднинения и перед отключением от канала оборачивает его в объект и отправляет StatisticsHandler через AttributeMap. received bytes - учтены байты из хедера и тела запроса. speed - использует разницу времени между подключением handler к каналу и времени перед отключением. При учете скорости считаются принятые и отправленные байты. При обработке запроса создает экземпляр наследника интерфейса UriHandler который генерирует нужный ответ.

UriHandlers - семейство классов каждый из которых может обработать только 1 тип запроса.

Лог реализован созданием класса наследника от ConcurrentLinkedQueue и перегрузкой его метода add(E e) чтобы содержать не более 16 значений.

Failed requests в ab возникает из-за разной длинны возвращаемого документа.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages