Создание приложения чата Node.js с помощью Socket.IO в Облачной службе Azure (классическая)

Подсказка

Socket.IO теперь изначально поддерживается в Azure. Чтобы масштабировать приложение Socket.IO для обработки тысяч подключений, приходится сталкиваться с многочисленными трудностями. Теперь, когда Azure изначально поддерживает Socket.IO, вы можете разрешить Azure обрабатывать масштабируемость и доступность. Узнайте больше о том, как получить любое Socket.IO приложение, работающее в Azure, с помощью нескольких строк кода.

Это важно

Облачные службы (классическая версия) переведены в разряд устаревших для всех клиентов с 1 сентября 2024 года. Все существующие запущенные развертывания будут остановлены и завершены корпорацией Майкрософт, и данные будут окончательно потеряны начиная с октября 2024 года. Для новых развертываний следует использовать Облачные службы Azure с расширенной поддержкой. Это новая модель развертывания на основе Azure Resource Manager.

Socket.IO обеспечивает связь в режиме реального времени между клиентами и сервером Node.js. В этом руководстве описано, как разместить приложения чата на основе Socket.IO в Azure. См. дополнительные сведения о socket.io.

На снимке экрана ниже показано готовое приложение:

! [Окно браузера, отображающее службу, размещенную в Azure][завершенное приложение]

Предпосылки

Убедитесь, что следующие продукты и версии установлены для успешного завершения примера, описанного в этой статье.

Создание проекта облачной службы

Ниже описано, как создать проект облачной службы, на котором размещено приложение Socket.IO.

  1. В меню Пуск или на начальном экране найдите Windows PowerShell. Щелкните правой кнопкой мыши Windows PowerShell и выберите Запуск от имени администратора.

    Значок Azure PowerShell

  2. Сначала создайте каталог c:\node.

    PS C:\> md node
    
  3. Перейдите в каталог c:\node.

    PS C:\> cd node
    
  4. Введите указанные ниже команды для создания нового решения с именем chatapp и рабочей роли с именем WorkerRole1:

    PS C:\node> New-AzureServiceProject chatapp
    PS C:\Node> Add-AzureNodeWorkerRole
    

    Вы увидите следующий ответ:

    Выходные значения параметров new-azureservice и add-azurenodeworkerrolecmdlets

Загрузка примера разговора

В этом проекте мы используем пример чата из [репозитория GitHub Socket.IO]. Выполните следующие действия, чтобы скачать пример и добавить его в ранее созданный проект.

  1. Создайте локальную копию репозитория с помощью кнопки Клонировать . Можно также загрузить проект при помощи кнопки ZIP .

    Просмотр окна браузера https://github.com/LearnBoost/socket.io/tree/master/examples/chat с выделенным значком загрузки ZIP-архива

  2. Перемещайтесь по структуре каталога локального репозитория, пока не доберетесь до каталога examples\chat. Скопируйте содержимое этого каталога в ранее созданный каталог C:\node\chatapp\WorkerRole1.

    Обозреватель, показывающий содержимое каталога examples\chat, извлеченного из архива

    Выделенные элементы на предыдущем снимке экрана — это файлы, скопированные из каталога examples\chat .

  3. Удалите из каталога C:\node\chatapp\WorkerRole1 файл server.js и переименуйте файл app.js в server.js. Этот шаг удаляет файл server.js по умолчанию, созданный ранее командлетом Add-AzureNodeWorkerRole, и заменяет его файлом приложения из примера чата.

Изменение Server.js и установка модулей

Прежде чем тестировать приложение в эмуляторе Azure, необходимо внести небольшие изменения. Выполните следующие действия над файлом server.js:

  1. Откройте файл server.js в Visual Studio или в любом текстовом редакторе.

  2. Найдите раздел зависимостей модуля в начале server.js и измените строку, содержащую sio = require('../../lib/socket.io') на sio = require('socket.io') следующим образом:

    var express = require('express')
      , stylus = require('stylus')
      , nib = require('nib')
    //, sio = require('..//..//lib//socket.io'); //Original
      , sio = require('socket.io');                //Updated
      var port = process.env.PORT || 3000;         //Updated
    
  3. Чтобы убедиться, что приложение прослушивает правильный порт, откройте server.js в Блокноте или избранном редакторе, а затем измените следующую строку, заменив 3000 на process.env.port следующим образом:

    //app.listen(3000, function () {            //Original
    app.listen(process.env.port, function () {  //Updated
      var addr = app.address();
      console.log('   app listening on http://' + addr.address + ':' + addr.port);
    });
    

Сохранив изменения в server.js, выполните следующие действия, чтобы установить необходимые модули, а затем проверьте приложение в эмуляторе Azure:

  1. В Azure PowerShell измените каталоги на каталог C:\node\chatapp\WorkerRole1 и выполните следующую команду, чтобы установить модули, необходимые для этого приложения:

    PS C:\node\chatapp\WorkerRole1> npm install
    

    Эта команда устанавливает модули, перечисленные в файле package.json. После завершения команды вы увидите выходные данные, аналогичные следующему снимку экрана:

    Выходные данные команды npm install

  2. Так как этот пример изначально был частью репозитория Socket.IO GitHub и напрямую ссылался на библиотеку Socket.IO по относительному пути, Socket.IO не ссылался в файле package.json, поэтому ее необходимо установить, выполнив следующую команду:

    PS C:\node\chatapp\WorkerRole1> npm install socket.io --save
    

Тестирование и развертывание

  1. Запустите эмулятор, выполнив следующую команду:

    PS C:\node\chatapp\WorkerRole1> Start-AzureEmulator -Launch
    

    Примечание.

    Если вы столкнулись с проблемами при запуске эмулятора, например: Start-AzureEmulator: произошла неожиданная ошибка. Подробные сведения: произошла непредвиденная ошибка. Коммуникационный объект System.ServiceModel.Channels.ServiceChannel нельзя использовать для связи, так как он находится в состоянии Faulted.

    Переустановите AzureAuthoringTools версии 2.7.1 и AzureComputeEmulator версии 2.7 (убедитесь, что версии совпадают).

  2. Откройте веб-браузер и перейдите по адресу http://127.0.0.1.

  3. В открывшемся окне окна браузера введите псевдоним и нажмите клавишу Enter. Этот шаг позволяет публиковать сообщения в виде определенного псевдонима. Чтобы проверить функциональные возможности нескольких пользователей, откройте больше окон браузера с помощью одного URL-адреса и введите разные псевдонимы.

    Два окна браузера с сообщениями чата от пользователей User1 и User2

  4. После проверки приложения остановите эмулятор, выполнив следующую команду:

    PS C:\node\chatapp\WorkerRole1> Stop-AzureEmulator
    
  5. Чтобы развернуть приложение в Azure, воспользуйтесь командлетом Publish-AzureServiceProject . Рассмотрим пример.

    PS C:\node\chatapp\WorkerRole1> Publish-AzureServiceProject -ServiceName mychatapp -Location "East US" -Launch
    

    Это важно

    Обязательно используйте уникальное имя, иначе произойдет сбой в процессе публикации. После завершения развертывания откроется браузер с переходом к развернутой службе.

    Если появляется сообщение о том, что предоставленного названия подписки в импортированном профиле публикации нет, то перед развертыванием в Azurе необходимо загрузить и импортировать профиль публикации для вашей подписки. См. раздел Развертывание приложения в Azure в статье Построение и развертывание приложения Node.js в облачной службе Azure.

    ! [Окно браузера, отображающее службу, размещенную в Azure][завершенное приложение]

    Примечание.

    Если появляется сообщение о том, что предоставленного названия подписки в импортированном профиле публикации нет, то перед развертыванием в Azurе необходимо загрузить и импортировать профиль публикации для вашей подписки. См. раздел Развертывание приложения в Azure в статье Построение и развертывание приложения Node.js в облачной службе Azure.

Теперь ваше приложение выполняется на платформе Azure и может передавать сообщения чата между различными клиентами с использованием Socket.IO.

Примечание.

Для упрощения, этот пример ограничен чатами между пользователями, подключенными к одному сеансу. Это означает, что если облачная служба создает два экземпляра рабочей роли, пользователи смогут общаться только с другими пользователями, подключенными к тому же экземпляру рабочей роли. Чтобы масштабировать приложение для работы с несколькими экземплярами роли, можно использовать технологию Service Bus, которая позволяет передавать состояние хранилища Socket.IO между несколькими экземплярами. Примеры см. в репозитории пакета Azure SDK для Node.js на GitHub использования очередей и тем служебной шины.

Дальнейшие действия

Из этого руководства вы узнали, как создать базовое приложение чата, размещенное в облачной службе Azure. Чтобы узнать, как разместить это приложение на веб-сайте Azure, см. Создание чат-приложения Node.js с Socket.IO на Azure Web Site.

Дополнительные сведения см. также в центре по разработке для Node.js.