Centrifugo - обмен сообщениями в реальном времени
В этой статье я немного расскажу о сервере обмена сообщениями в реальном времени под названием Centrifugo. Данная программа имеет множество библиотек под разные языки программирования, поэтому интеграция данного сервера возможна практически в любой проект.
Centrifugo запускается как отдельная служба и способен держать длительные (постоянные) подключения с вашим приложением, например в браузере или же в приложении на iOS или Android. Таким образом становится возможным передавать мнгновенно сообщение пользователю, если что-то произошло (кто-то лайкнул фотографию, отвалился процесс на сервере или кто-то отправил сообщние). В принципе, Вы можете написать на основе Centrifugo свой чат. Но основная задумка проекта в том, что бы именно отправлять сообщения в одну сторону. Сообщение можно отправить как всем пользователям, подключенным к вашему серверу, так и тем кто подписан на определенный канал, либо вообще конкретно какому-то клиенту. Об этом подробнее я расскажу в следующих статьях. Здесь я опишу самые первые шаги: как установить и запустить службу, как установить подключение с сервером и получать первые сообщения в режиме real-time.
Итак, первое, что сделаем, это выделим под это дело поддомен, куда будут отправиться запросы. Про то, как это сделать, рассказывать не буду, но в качестве опорной точки скажу, что, предположим, папка, куда будет смотреть сервер, обрабатывающий веб запросы, находится по следующему пути /var/www/centrifugo.domain.ru
Далее заходим на страницу проекта на github и ищем подходящую нам версию программы. Кто хочет, может скачать себе сначала на компьютер, потом на сервер. Я делаю так, захожу в папку /var/www/ и в консоли пишу
wget https://github.com/centrifugal/centrifugo/releases/download/v1.7.4/centrifugo-1.7.4-linux-amd64.zip
- ссылка на архив на указанной выше странице.
Затем распаковываем архив командой unzip centrifugo-1.7.4-linux-amd64.zip
. У нас появилась папка centrifugo-1.7.4-linux-amd64, а в ней файл centrifugo. Переименовываем папку на centrifugo.domain.ru Заходим в папку.
На следующем шаге мы запускаем в консоли следующую команду:
./centrifugo genconfig
- так мы генерируем конфигурационный файл config.json, в котором создастся единственное значение - "secret" : "some_secret_key"
. Затем откройте созданный файл и добавьте следующие параметры:
"admin_password":"123456",
"admin_secret":"secret123456"
Значения ключей могут быть любыми. Далее в примерах будут использоваться именно эти значения.
Теперь можно запустить Centrifugo
./centrifugo --web --config=config.json
Делаем мы это с ключом --web
, что бы можно было зайти в админку, откуда будут отправлены первые сообщения.
Так же можно сделать установку программы как демона. Есть deb пакеты для большинства популярных ОС (https://packagecloud.io/FZambia/centrifugo). Но так как мы уже запустили службу, то переустанавливать не будем.
Собственно, после этого часть функционала уже работает. Заходим по адресу centrifugo.domain.ru:8000 На появившейся странице необходимо ввести пароль. Вводим 123456. Входим, теперь нам доступна админка и отладочная информация в ней. Если у вас не открывается страница или не получается войти, значит вы что-то сделали не так. Прочтите начало статьи еще раз.
Теперь подходим к самому интересному - получение сообщений на клиенте. В нашем случае это будет браузер. Для этого нам потребуется подключить одну библиотеку на js, а так же установить другую библиотеку в проект. У меня будет пример на php. В принципе без php можно обойтись и получить сообщение, работая на чистом js. Но так как наиболее используемым сценарием работы является получение и отправка сообщений, обработанных сервером, то включим в пример и серверную часть. С неё и начнем.
Устанавливать либу будем с помощью composer. Добавляем в файл композера
"require": {
"sl4mmer/phpcent":"dev-master",
}
Затем запускаем php composer.phar update
Ждем пока установится. После чего можем писать код. В методе, который будет выводить страницу, в которую начнут приходить сообщения необходимо передать метку времени timestamp и token - который генерируется на основе некоторых параметров. В простейшем случае на user и на timestamp.
$client = new \phpcent\Client("http://localhost:8000");
$timestamp = time();
$token = $client->setSecret('секретный ключ из файла конфига (some_secret_key)')
->generateClientToken('пользователь, например "Vasya"', $timestamp );
В шаблоне пишем подключаем следующие библиотеки:
<script src="//cdn.jsdelivr.net/sockjs/1.1/sockjs.min.js"></script>
<script src="centrifuge.js"></script>
Закачиваем в проект файл центрифуги
Далее пишем следующий код:
<script>
window.onload = function() {
var centrifuge = new Centrifuge({
url: "http://centrifugo.domain.ru:8000/connection"
user: "Vasya",
timestamp: timestamp, // переменная $timestamp из php файла
token: token // переменная $token из php файла
});
// "news" - название канала, на который подписан пользователь
centrifuge.subscribe("news", function(message) {
// вставляю в блок c информацией пришедшее сообщение
$(".info-msg").prepend(message.data.msg + '<br>').show();
// скрываю пришедшее сообщение
setTimeout(function() {
$(".info--msg").text('').hide();
}, 5000);
}
centrifuge.connect();
}
</script>
Теперь заходим в админку центрифуги, выбираем в меню Actions, в поля формы:
Method: publish,
Channel: news,
Data: {"msg":"lalalalala"}
и нажимаем Submit - сообщение отправлено и тут же получено в шаблоне. Никаких ajax-запросов, ни секунды ожидания. Поздравляю, вы получили первое реалтайм сообщение. На этом все, дальнейшие премудрости в следующих статьях.