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

OSCHINA-MIRROR/cookeem-CookIM

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
README_CN.md 8.9 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 16:31 69a6b0a

Отладка и запуск сервиса:

$ sbt "run-main com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551"

Запуск сервиса в рабочем режиме:

$ java -classpath "target/scala-2.11/CookIM-assembly-0.2.0-SNAPSHOT.jar" com.cookeem.chat.CookIM -h localhost -w 8081 -a 2552 -s localhost:2551

Эти команды запускают веб-сервис, который слушает порт 8081. Система Akka также слушает порт 2552.


Вернуться к содержанию

Запуск браузера и посещение веб-адреса 8081:

http://localhost:8081

Демонстрация запускает два сервиса CookIM, доступ к которым осуществляется через порты 8080 и 8081 соответственно. Пользователи могут получить доступ к разным сервисам CookIM через разные браузеры. В браузере пользователи отправляют сообщения через WebSocket в кластер Akka, где сообщения распределяются между соответствующими узлами. Это обеспечивает обмен сообщениями между различными сервисами.


Вернуться к содержанию

Архитектура

Общая архитектура сервиса CookIM:

Сервис CookIM состоит из трёх частей:

  • Akka HTTP используется для предоставления веб-сервиса, к которому браузер подключается через WebSocket.
  • Akka Stream обрабатывает сообщения, полученные через WebSocket после их отправки браузером. Когда сообщение получено, оно помещается в поток chatService для обработки. Если сообщение содержит JWT (Javascript web token), то поток проверяет его. Если проверка проходит успешно, сообщение отправляется в ChatSessionActor.
  • Кластер Akka используется для распределения сообщений между узлами кластера. CookIM использует DistributedPubSub от Akka Cluster. Когда пользователь присоединяется к сеансу, он подписывается на соответствующий сеанс. Когда пользователь отправляет сообщение в сеанс, сообщение публикуется в Actor, связанном с сеансом. Другие участники сеанса могут получать эти сообщения.

Вернуться к содержанию

Граф потока WebSocket:

После получения сообщения через WebSocket, Akka HTTP помещает его в поток chatService, где происходит обработка. Поток chatService использует следующие шаги:

  1. flowFromWS принимает сообщения через WebSocket и декодирует JWT, содержащийся в сообщении.
  2. Сообщения, которые не проходят проверку JWT, фильтруются через filterFailure. Сообщения, прошедшие проверку, фильтруются через filterSuccess.
  3. builder.materializedValue представляет материализованное значение потока Akka. При создании потока автоматически отправляется сообщение connectedWs. connectedWs преобразует сообщение в UserOnline и отправляет его через ChatSinkActor в ChatSessionActor.
  4. ChatActorSink отправляет сообщения в ChatSessionActor и, когда поток завершается, отправляет сообщение UserOffline в downstream.
  5. ChatSource получает сообщения от ChatSessionActor и отправляет их в flowAcceptBack.
  6. flowAcceptBack обеспечивает поддержку соединения.
  7. flowReject и flowAcceptBack объединяют сообщения и отправляют их обратно через WebSocket как Message.

Вернуться к содержанию

Описание базы данных MongoDB:

Таблица users содержит информацию о пользователях:

Поле Описание
login Логин (адрес электронной почты)
nickname Никнейм
password Пароль (SHA1)
gender Пол: 0 — неизвестно, 1 — мужской, 2 — женский
avatar Путь к изображению (например, /upload/avatar/201610/26/xxxx.JPG)
lastLogin Дата последнего входа (timestamp)
loginCount Количество входов
sessionsStatus Список состояний связанных сеансов
friends Список друзей
dateline Дата регистрации (timestamp)

Таблица sessions содержит информацию о сеансах (групповых или личных чатах):

Поле Описание
createuid Идентификатор создателя
ouid Идентификатор получателя (только для личных чатов)
sessionIcon Значок сеанса (для групповых чатов)
sessionType Тип сеанса: 0 — личный чат, 1 — групповой чат
publicType Видимость: 0 — только по приглашению, 1 — открыто
sessionName Название группы
dateline Дата создания (timestamp)
usersStatus Массив идентификаторов пользователей, связанных с сеансом
lastMsgid Последний отправленный идентификатор сообщения
lastUpdate Последнее обновление (timestamp)

Таблица messages содержит сообщения, отправленные в сеансе:

Поле Описание
uid Идентификатор отправителя
sessionid Идентификатор сеанса
msgType Тип сообщения
content Содержание сообщения
fileInfo Информация о файле (если есть)
dateline Дата отправки (timestamp)

Таблица onlines содержит информацию об онлайн-пользователях:

Поле Описание
id Уникальный идентификатор
uid Идентификатор пользователя
dateline Время обновления (timestamp)

Таблица notifications содержит уведомления, отправленные пользователям:

Поле Описание
noticeType Тип уведомления («joinFriend», «removeFriend», «inviteSession»)
senduid Идентификатор отправителя
recvuid Идентификатор получателя
sessionid Связанный идентификатор сеанса
isRead Прочитано (0 — нет, 1 — да)
dateline Время обновления (timestamp)

Вернуться к содержанию

Типы сообщений:

Существует два канала WebSocket: ws-push и ws-chat.

ws-push отправляет уведомления пользователям, когда они не находятся в сеансе.

/ws-push channel:

Вверх: подписка на push-уведомления: {userToken: «xxx»}.

Вниз: acceptMsg: {uid: «xxx», nickname: «xxx», avatar: «xxx», sessionid: «xxx», sessionName: «xxx», sessionIcon: «xxx», msgType: «accept», content: «xxx», dateline: «xxx»}, rejectMsg: {uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "reject", content: "xxx", dateline: "xxx"}, keepAlive: {uid: "", nickname: "", avatar: "", sessionid: "", sessionName: "", sessionIcon: "", msgType: "keepalive", content: "", dateline: "xxx"} и textMsg: {uid: "xxx", nickname: "xxx", avatar: "xxx", sessionid: "xxx", sessionName: "xxx", sessionIcon: "xxx", msgType: "text", content: "xxx", dateline: "xxx"}.

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/cookeem-CookIM.git
git@api.gitlife.ru:oschina-mirror/cookeem-CookIM.git
oschina-mirror
cookeem-CookIM
cookeem-CookIM
master