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

OSCHINA-MIRROR/yueyakk-yue-im

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

YUE-IM

Введение

YUE-IM — это сервис для обмена мгновенными сообщениями, разработанный с использованием Java и основанный на фреймворках netty и akka. Он предоставляет упрощённый API, что значительно снижает сложность разработки и делает его удобным для вторичного использования.

Основные характеристики:

  1. Поддержка протоколов WebSocket и TCP для коммуникации, а также настраиваемых типов сообщений и форматов их содержимого.
  2. Возможность развёртывания как на одном компьютере, так и в кластере.
  3. Упрощённый API для разработчиков, позволяющий легко создавать вторичные приложения.
  4. Благодаря возможностям akka, кластерный режим требует простой настройки (с использованием zookeeper для обнаружения узлов-семян) и поддерживает самоорганизацию, при этом обмен сообщениями между узлами не зависит от других очередей сообщений или промежуточных компонентов.
  5. Поддержка одновременного подключения нескольких устройств к одному аккаунту и одновременного получения сообщений на всех подключённых устройствах.
  6. Поддержка отправки личных и групповых сообщений через REST-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)

Процесс реализации:

  1. Создайте новый проект Maven.
  2. Добавьте зависимость от модуля yueim-server и реализуйте собственный обработчик сообщений.
<dependency>
    <groupId>com.yueya</groupId>
    <artifactId>yueim-server</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
  1. Инициализируйте и запустите службу (запустите zookeeper для кластерного режима). ClusterNodeApp.start("akka.conf",setting) перед запуском службы необходимо инициализировать настройки. Akka.conf — это файл конфигурации узла, который можно скопировать из примера проекта yueim-node. Setting — класс бизнес-конфигурации: Разработчику необходимо реализовать следующие интерфейсы: BusinessInfoProvider — предоставить интерфейс для поиска идентификаторов друзей и членов группы. Setting.setHandlerMap(Map<String, CmdHandler>) — установить соответствие между типами сообщений (обратите внимание, что типы сообщений 0–10 зарезервированы системой и не должны использоваться) и обработчиками сообщений. Ключевые настройки описаны в примере проекта yueim-node:
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 )

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

Введение

YUE-IM — это фреймворк для разработки асинхронных служб мгновенных сообщений, реализованный на Java с использованием Netty и Akka. Поддерживает как одиночное, так и распределённое развёртывание, а также предоставляет очень простой API, что значительно снижает сложность разработки и облегчает пользователям создание дополнительных функций. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

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

Участники

все

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

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