1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/zjz0812-heart-netty

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Netty-сервер сердцебиения

Springboot 2.0.8 интегрирован с Netty 4, используя Protobuf в качестве формата обмена данными для ping. Protobuf более компактный по сравнению с JSON и требует меньше ресурсов. Это делает его подходящим для использования в сторонних приложениях для мониторинга сердцебиения.

Сценарии применения

Один из возможных сценариев использования — мониторинг сердцебиения серверов в корпоративной среде. В такой среде может быть несколько серверов, каждый из которых выполняет свою функцию: a, b, c, d и т. д. Иногда количество пользователей или другие факторы могут привести к сбоям в работе серверов. Большинство таких сбоев обнаруживаются через систему управления сетью, но поскольку проекты обычно развертываются на нескольких машинах, система управления не всегда может быстро определить проблему. Время обнаружения может занять до получаса, а иногда пользователи даже вынуждены сообщать о проблемах по телефону. Для компании такие сбои могут иметь серьёзные последствия.

После внедрения системы мониторинга сердцебиения можно в реальном времени отслеживать состояние более 100 машин и их пинг. Также можно использовать периодические запросы к HTTP-интерфейсу для проверки работоспособности приложения. Однако использование HTTP-запросов требует ресурсов, поэтому предпочтительнее использовать ping или авторизацию на основе protobuff.

Среда разработки

  • JDK 8+;
  • IntelliJ IDEA;
  • springboot 2.0.8.RELEASE;
  • Netty4.1.6.Final;
  • protobuf-java3.3.0;
  • Redis;
  • Thymeleaf шаблоны;
  • Echarts диаграммы;
  • Tomcat8.5.

Описание проекта

  1. Реализованные функции:

    • авторизация клиента на основе protoBuff;
    • мониторинг сердцебиения на основе protoBuff;
    • восстановление после разрыва соединения;
    • вычисление значения пинга (с точностью до микросекунд);
    • другие модули для дочерних сервисов (уже включены в проект).
    • для удобства тестирования проект поддерживает кросс-доменный доступ.
  2. Описание:

Netty — это клиент-серверный фреймворк NIO, который позволяет быстро и легко разрабатывать сетевые приложения, такие как протоколы серверов и клиентов. Он значительно упрощает разработку TCP и UDP сокетов и других сетевых приложений. «Быстро» и «легко» не означает, что конечное приложение будет страдать от проблем с поддержкой или производительностью. Netty тщательно спроектирован и предлагает широкий спектр протоколов, таких как FTP, SMTP, HTTP и различные двоичные и текстовые протоколы. Таким образом, Netty успешно нашёл способ разработки приложений, которые являются одновременно лёгкими в разработке, производительными, стабильными и гибкими.

Несколько распространённых классов:

  • ServerBootstrap — класс-помощник для серверов Netty;
  • NioEventLoopGroup — группа многопоточных событийных циклов, обрабатывающих операции ввода-вывода. Обычно серверу требуется две группы NioEventLoopGroup: одна для мониторинга TCP-соединений, другая для обработки событий ввода-вывода. Для первой достаточно одного потока, для второй рекомендуется два потока на каждое ядро процессора. Клиенту достаточно одной группы;
  • NioServerSocketChannel — используется главным образом для приёма соединений на сервере;
  • NioSocketChannel — используется главным образом для получения соединений на клиенте;
  • ChannelInboundHandlerAdapter — класс, в котором можно переопределить различные методы обработки событий, включая channelRead() и exceptionCaught();
  • SimpleChannelInboundHandler — класс, в котором также можно переопределить методы обработки событий. Этот класс подходит для работы с определёнными типами сообщений. Если вы создаёте собственный тип сообщения, то этот класс может оказаться более удобным;
  • ChannelPipeline — содержит различные обработчики, включая декодеры, кодировщики и другие пользовательские обработчики. IdleStateHandler должен быть первым в списке, а кодировщик и декодер должны быть перед другими обработчиками. Загрузка происходит в порядке очереди;
  • ChannelHandlerContext — writeAndFlush и channel().writeAndFlush() имеют различия. Первый ищет OutputboundHandler в текущем handler и передаёт ему выполнение, второй начинает выполнение с последнего обработчика. Наиболее часто встречающееся применение — когда клиент или сервер отправляют сообщение, но оно не доходит до адресата из-за неправильного порядка загрузки обработчиков в pipeline;
  • ChannelInitializer — используется для инициализации SocketChannel на клиенте и сервере. При инициализации загружается ChannelPipeline;
  • Bootstrap — класс-помощник для подключения клиентов;
  • idleStateHandler — Netty позволяет использовать IdleStateHandler для реализации управления соединениями. Когда соединение неактивно в течение длительного времени (без отправки или получения сообщений), срабатывает событие, которое можно использовать для реализации механизма сердцебиения.

Описанных выше классов достаточно для выполнения 80% повседневных задач. Остальное — написание собственной бизнес-логики.

Процесс реализации сервера сердцебиения

  1. Клиент отправляет ping-сообщение серверу каждые 5 секунд, если в течение этого времени не было операций записи. Используется пользовательский формат сообщения, содержащий поля для аутентификации (auth), пинга и понга для различных типов операций. Во время первого подключения в ChannelInboundHandlerAdapter устанавливается соединение. Клиент отправляет сообщение auth для авторизации. Сервер отвечает сообщением auth_ack, подтверждающим успешную авторизацию. Без этого ответа клиент разрывает соединение и освобождает канал.
  2. Если клиент не получает ответ pong от сервера в следующий раз, когда он должен отправить ping, счётчик неудачных попыток сердцебиения увеличивается на 1.
  3. Каждый раз, когда клиент получает ответ pong от сервера, счётчик неудачных попыток сбрасывается.
  4. Если три попытки подряд не приводят к получению ответа pong, клиент разрывает текущее соединение и пытается восстановить его через 5 секунд. Процесс повторяется до успешного восстановления соединения.
  5. После 10 секунд бездействия сервер увеличивает счётчик неудачных попыток на 1.
  6. Как только сервер получает сообщение ping от клиента, счётчик неудачных попыток обнуляется.
  7. Если сервер не получает три последовательных сообщения ping от клиента, он закрывает канал и ожидает повторного подключения клиента.

Проверка сердцебиения:

  • Когда клиент превышает три попытки без получения ответа pong от сервера, клиент активно разрывает текущее подключение и пытается повторно подключиться к серверу.
  • Когда сервер превышает три попытки без получения сообщения ping от клиента, сервер активно закрывает канал клиента и ожидает повторного подключения.

Значение пинга рассчитывается на основе данных, полученных от клиента. Клиент отправляет сообщение ping, затем сервер записывает текущее время. Когда сервер отвечает на сообщение клиента, снова записывается текущее время. Разница между двумя значениями времени делится пополам, чтобы получить значение пинга. Затем это значение сохраняется в Redis. Первоначально планировалось реализовать механизм на основе времени сервера, но это могло привести к ошибкам из-за разницы во времени между серверами. Поэтому было решено использовать данные, полученные от клиента.

Для визуализации данных о сердцебиении используется Echarts. Данные сохраняются в Redis для доступа к последним значениям пинга.

Обратите внимание, что клиентская часть проекта основана на Springboot и использует NettyClient в качестве конструктора. Класс не управляется Spring, так как это необходимо для корректной работы при повторном подключении. Вместо этого используется метод implements ApplicationContextAware. Важно установить для класса значение lazy-init=false, иначе при запуске проекта ApplicationContext будет нулевым. Использование метода

Проект представляет собой агрегатный проект, разделённый на модули: server, client и common.

Поскольку Netty 4 не поддерживает генерацию clientId, необходимо вручную указать его. Это позволяет привязать канал при каждом установлении соединения. В проекте уже интегрирован класс инструментов по умолчанию. Позже будет разработан метод распределённой генерации идентификатора, а пока что идентификатор задаётся вручную. Это облегчает отслеживание вашего хоста.

После загрузки проекта выполните следующие шаги:

  1. Упакуйте проект.
  2. Разверните файл server.jar на рабочем сервере. По умолчанию веб-мониторинг работает через порт 10003, а порт Netty — 19999. Измените адрес Redis и запустите сервер.
  3. После упаковки клиента добавьте его в свой проект. Подробности приведены ниже.

Включение в другие системы

  • Включите в другую систему с помощью кода: NettyClient client = new NettyClient(); client.run();

  • Добавьте в проект Spring с помощью кода: @Component public class ClientStart implements ApplicationListener { public Logger log = LoggerFactory.getLogger(this.getClass());

    @Override public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) { NettyClient client = new NettyClient(); try { client.run(); } catch (Exception e) { e.printStackTrace(); } } }

  • Добавьте в Spring Boot с помощью кода: @SpringBootApplication public class ClientApplication { public static void main(String[] args) throws Exception { SpringApplication.run(ClientApplication.class, args); NettyClient client = new NettyClient();//加入启动 client.run(); } }

Мониторинг переднего плана осуществляется с использованием функции JavaScript для периодического запроса данных с сервера каждые 5 секунд и динамического обновления значений Echarts. Если вы не знакомы с используемой структурой шаблонов, не беспокойтесь, проект уже поддерживает междоменные операции. Вы можете напрямую открыть страницу monitor.html в папке netty-server/resources, чтобы увидеть страницу мониторинга.

Также можно получить доступ к странице мониторинга через бэкэнд: http://localhost:10003/monitor.do

После запуска сервера, когда клиент подключается, страница мониторинга отображает сердцебиение одной машины. Аналогично, если несколько клиентов подключаются, страница мониторинга может отображать состояние всех подключённых клиентов.

На полноэкранном режиме по умолчанию отображается максимум два графика мониторинга, которые адаптированы к различным разрешениям экрана.

График одного экземпляра подключения клиента:

График нескольких экземпляров подключения клиентов:

Спасибо за вашу поддержку!

Изображение в этом разделе не переведено.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

На основе netty4, protoBuff, сервер netty с функцией сердцебиения поддерживает аутентификацию, повторное подключение после обрыва связи, разработку других бизнес-модулей, а также обеспечивает графическое наблюдение в реальном времени. Может быть сразу запущен в работу. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/zjz0812-heart-netty.git
git@api.gitlife.ru:oschina-mirror/zjz0812-heart-netty.git
oschina-mirror
zjz0812-heart-netty
zjz0812-heart-netty
master