Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
prorok
7 лет назад

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-запросов, ни секунды ожидания. Поздравляю, вы получили первое реалтайм сообщение. На этом все, дальнейшие премудрости в следующих статьях.

617
4.513 GOLOS
На Golos с October 2017
Комментарии (2)
Сортировать по:
Сначала старые