YUE-IM
YUE-IM — это сервис для обмена мгновенными сообщениями, разработанный с использованием Java и основанный на фреймворках netty и akka. Он предоставляет упрощённый API, что значительно снижает сложность разработки и делает его удобным для вторичного использования.
Система выбирает netty в качестве сервера доступа, учитывая его репутацию как наиболее известного сетевого серверного фреймворка в Java, его производительность, поддержку различных протоколов и доступность документации. Для связи между кластерами система использует akka. Основная проблема, которую необходимо решить при обмене сообщениями в кластере, заключается в том, как доставить сообщение до целевого клиента на конкретном узле. Большинство существующих открытых проектов для обмена мгновенными сообщениями обычно используют очереди сообщений или Redis для межузловой связи. Некоторые проекты поддерживают общую систему маршрутизации и кэширования для обеспечения связи между узлами. В отличие от них, система YUE-IM использует akka для реализации связи между узлами, используя широковещательную рассылку, ответные сообщения и кэширование маршрутов на каждом узле для обеспечения взаимодействия между ними. Это позволяет избежать использования дополнительных систем или промежуточных компонентов, снижая тем самым ненужное потребление ресурсов и количество сетевых передач. Akka представляет собой набор инструментов и среду выполнения, которые облегчают создание параллельных приложений и распределённых систем на JVM. После изучения akka автор проекта решил разработать приложение на основе этого инструмента. Для связи между узлами кластера используется протокол Protobuf, который повышает эффективность передачи данных.
├── imui # Пример проекта для тестирования интерфейса пользователя
├── yueim-common # Интерфейс определения, общие конфигурации и зависимости
├── yueim-manager # Пример проекта, детекторный узел, может быть запущен
├── push-sample # Пример проекта: узел сервера обмена мгновенными сообщениями, должен быть запущен
└── push-server # Фреймворк для обмена мгновенными сообщениями, зависимости
TCP-соединение:
Сообщение состоит из типа сообщения, символа «#» и тела сообщения в формате JSON.
WebSocket-соединение
yueim-sample: локальный запуск ImApplication, доступ к index.html в папке imui для использования демоверсии. Проект полностью разработан и готов к размещению в другом репозитории. Демонстрационный проект включает в себя функции личного и группового общения (поддержка мультимедиа и истории сообщений относится к бизнес-логике и должна быть реализована самостоятельно).
Изображения ./doc/2020-09-27_222117.png и ./doc/2020-03-27_222200.png.
Доступ к manage.html в manageui для просмотра. Если разработчик хочет создать собственный сервис обмена мгновенными сообщениями на основе этой системы, большая часть работы будет заключаться в реализации обработчиков команд CmdHandler.
/**
* Обработчик перед отправкой сообщения, например, для проверки на наличие чувствительных слов.
* @param msgType тип сообщения
* @param message тело сообщения
* @param msgId уникальный идентификатор сообщения, сгенерированный алгоритмом снежинки
* @return если возвращает false, последующие обработчики не будут выполняться
*/
boolean preMessage(int msgType, byte[] message, long msgId);
/**
* Обработчик для обработки сообщения на сервере.
* @param ctx контекст службы обмена сообщениями
* @param msgType тип сообщения
* @param message тело сообщения
* @param msgId уникальный идентификатор сообщения, сгенерированный алгоритмом снежинки
*/
void onMessage(ImContext ctx, int msgType, byte[] message, long msgId);
/**
* Обработчик после обработки сообщения (вызывается асинхронно после ответа клиенту и не влияет на обработку сообщения).
* @param ctx контекст службы обмена сообщениями
* @param msgType тип сообщения
* @param message тело сообщения
* @param msgId уникальный идентификатор сообщения, сгенерированный алгоритмом снежинки
*/
void postMessage(ImContext ctx, int msgType, byte[] message,long msgId);
В обработчиках можно вызывать несколько методов ImContext для отправки сообщений:
/**
* Официальное соединение между клиентом и сервером, которое можно вызвать после успешного входа в систему.
* @param userId идентификатор пользователя
* @param device идентификатор устройства
*/
public void connect(String userId,String device);
/**
* Отправка одноточечного сообщения.
* @param msgId уникальный идентификатор сообщения
* @param msg содержимое сообщения
* @param msgType тип сообщения
* @param to получатель
*/
public void sendPointMsg(long msgId,String msg,int msgType,String to);
/**
* Отправка группового сообщения.
* @param msgId уникальный идентификатор сообщения
* @param msg содержимое сообщения
* @param msgType тип сообщения
* @param groupId идентификатор группы
*/
public void sendGroupMessage(long msgId,String msg,int msgType,String groupId);
/**
* Сервер отправляет сообщение подключённому устройству.
* @param msgType тип сообщения
* @param msg содержимое сообщения
*/
public void sendToClient(int msgType,String msg)
Процесс реализации:
<dependency>
<groupId>com.yueya</groupId>
<artifactId>yueim-server</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
akka {
remote {
netty.tcp {
hostname = "127.0.0.1" // IP-адрес узла
port = 2551 //порт для связи в кластере
}
}
cluster {
roles = ["worker"]
``` {
netty{
порт = 8088 // порт для подключения терминала
режим = websocket // режим работы сервиса: tcp — узел на протоколе TCP; websocket — узел на протоколе WebSocket
heart_beat = true // включение проверки активности соединения, проверка каждые 20 секунд, отключение при трёх подряд неудачных проверках
}
zookeeper{
ip = 127.0.0.1 // IP-адрес ZooKeeper
}
# cluster,single
node{
режим = cluster // режим работы узла: cluster — кластерный режим; single — одиночный режим
}
}
5. Если необходимо изменить структуру протокола сообщений, нужно внести изменения в соответствующие классы в yueim-server:
>
для протокола TCP — класс TcpMsgDecoder;
>
для протокола WebSocket — класс WebSocketServerHandler.
7. Отправка сообщений через rest-api:
* Реализовать RestMsgListener (можно обрабатывать полученные сообщения rest-api), и передать его в imsetting при инициализации. Интерфейс службы будет предоставлять услуги на узле WebSocket.
#### Служба restapi
Адреса отправки личных сообщений: ip:port/api/sendPoint — запрос POST с произвольным содержимым сообщения;
адреса отправки групповых сообщений: ip:port/api/sendGroup — запрос POST с произвольным содержимым сообщения.
#### Пример проекта
Проект по адресу отличается от sample (фронтенд написан довольно просто, не обращайте внимания): http://47.102.218.172:8099/im/login.html. Для тестирования можно использовать следующие учётные данные: admin/123456; test/123456.
Если вам нужно больше тестовых аккаунтов, вы можете войти в систему с учётными данными admin/123456 на http://47.102.218.172:8099/#/user/login и добавить пользователей в разделе управления пользователями.
#### Инструкция по установке
1. Обратитесь к файлу pom.xml проекта yueim-node, настройте и выполните команду package. Это создаст пакет tar.gz.
2. Распакуйте файл xxx.tar.gz.
3. Запустите соответствующий скрипт запуска из каталога bin в зависимости от операционной системы.
#### Участие в проекте
1. Fork этого репозитория.
2. Создайте ветку Feat_xxx.
3. Отправьте код.
4. Создайте Pull Request.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )