25 Октября 2020

Spring, RabbitMQ и Keycloak для создания чата

Сейчас сложно себе представить требования к API, которые бы не включали в себя поддержку разного рода пушей. Взаимодействие с сервером уже давное не происходит в формате вопрос-ответ. Пользователи хотят видеть, что кто-то сейчас пишет комментарий, кто-то подключился к чату. Хотят получать состояние сразу, как только оно станет доступным, а не когда они спросят об изменениях.

Spring в этом плане по идеологии мне очень напоминает продукты компании SAP AG. Вроде как все все есть и все пользуются, но когда начинаешь использовать, выясняется что в 2020 году в spring так и не осилили свой сервер авторизации к примеру вот тут можно прочитать почему они считают что это нормально.

То же самое касается поддержки websocket, из-за того, что фактически нет своего сервера авторизации, использование spring-security не очевидно. Есть статьи на stackowerflow и очень размытая официальная документация, которая не помогает понять что поддерживает spring-websocket и зачем вообще его нужно использоваться.

Я не исключаю, что официальная документация не помогает только мне. В любом случае, решил собрать проект чата с поддержкой комнат и личных сообщений пользвателю, авторизация в чате будет с помощью jwt-токена, а генерировать токены для пользователей будет keycloak.

В проекте использованы следующие зависимости:

  • spring-shell — используется для создания клиента чтобы не зависить от браузеров и была возможность использовать отладку;
  • keykloak — будет использоваться в качестве сервера авторизации;
  • rabbitmq — будет использоваться в качестве брокера для хранения сообщений пользоватею и для рассылки сообщений в группу
  • spring-websocket — нужен для реализации логики авторизации и для того чтобы не показывать rabbitmq;

В статье расскажу как настроить каждый компонент. Обмен сообщениям будет реализован с помощью протокола STOMP, [пример того, как это работает выложен на github] ().