Приложение Node.js на базе библиотеки Socket.io в Windows Azure
Библиотека Socket.io обеспечивает взаимодействие в режиме реального времени между сервером node.js и клиентами. В этом руководстве рассказывается, как разместить чат-клиент на базе socket.io в Windows Azure. Более подробную информацию Socket.io см. на веб-сайте https://socket.io/.
Примечание. В примере к этому руководству показано использование API Socket.IO в Windows Azure. Для простоты в данном примере работает только один объект рабочей роли Windows Azure. Не следует использовать этот код в реальных условиях, так как настоящие приложения используют не менее двух объектов каждой роли в соответствии с «Соглашением об уровне обслуживания Windows Azure». Чтобы расширить данное приложение для нескольких объектов ролей, применяйте технологию Service Bus, которая разделяет состояние хранения socket.io между несколькими объектами. Примеры можно найти в сценариях использования Service Bus Queues and Topics в разделе «Windows Azure SDK для репозитория Node.js в GitHub».
Снимок экрана готового приложения приведен ниже.
Цели
О чем пойдет речь в данном руководстве:
- Особенности использования библиотеки Socket.io в Windows Azure.
- Создание приложения с рабочей ролью Windows Azure.
Ключевые технологии
- Облачные приложения Windows Azure.
- Библиотека Node.js Socket.IO.
Настройка
Предполагается, что вы уже установили пакет Windows Azure SDK для Node.js, а также загрузили и установили настройки публикации для своей подписки Windows Azure. Если вы еще не выполнили эти операции, прочитайте руководство «Веб-приложение на базе Node.js».
Разделы руководства
- Особенности Windows Azure
- Пример размещения чат-клиента в рабочей роли
- Заключение и дальнейшие действия
Особенности Windows Azure
Размещенное в Windows Azure приложение имеет доступ только к портам, указанным в файле ServiceDefinition.csdef. По умолчанию проекты, созданные с помощью командлета New-AzureService из Windows Azure SDK для Node.js, открывают порт 80. Однако при запуске проекта в эмуляторе Windows Azure может быть выбран другой порт, например 81. Убедитесь, что приложение всегда получает трафик на правильный порт, для чего воспользуйтесь переменной process.env.port, которая указывает номер нужного порта во время выполнения. Например:
app.listen(process.env.port);
Если приложение выполняется внутри веб-роли (созданной командлетом Add-AzureNodeWebRole), настройте Socket.io на использование транспортного протокола, отличного от WebSocket. Это связано с тем, что веб-роль работает на базе служб IIS7, которые в настоящее время не поддерживают WebSocket. Ниже приведен пример настройки Socket.io для использования длинного опроса.
io.configure(function () {
io.set("transports", ["xhr-polling"]);
io.set("polling duration", 10);
});
Примечание. В данном руководстве используется рабочая роль, а не рассмотренная выше веб-роль.
Пример размещения чат-клиента в рабочей роли
Далее приведена пошаговая процедура создания установочного пакета чат-клиента на базе Socket.io для выполнения в рабочей роли Windows Azure.
Создайте проект
Нажмите Start, откройте All Programs, Windows Azure, щелкните правой кнопкой мыши Windows Azure PowerShell и выберите Run As Administrator. Такой способ запуска среды Windows PowerShell гарантирует, что будут доступны все консольные инструменты Node. Запуск с расширенными правами позволяет избежать лишних действий при работе с эмулятором Windows Azure.
Создайте новую папку node на диске C и перейдите в c:\node:
Введите приведенные ниже команды, чтобы создать решение chatapp и рабочую роль WorkerRole1:
PS C:\node> New-AzureService chatapp
PS C:\node\chatapp> Add-AzureNodeWorkerRole
Ответ системы будет следующим:
Загрузите пример чат-клиента
В этом проекте используется чат-клиент из репозитория Socket.io в GitHub. Загрузите пример и добавьте его в свой проект, как описано ниже.
Щелкните кнопку ZIP для загрузки ZIP-архива проекта.
В Проводнике Windows щелкните правой кнопкой мыши загруженный ZIP-архив и выберите Extract All. Укажите папку для извлечения файлов и затем нажмите Extract. Откроется папка с распакованными файлами.
Перейдите по вложенным папкам к каталогу examples\chat. Скопируйте его содержимое в созданный ранее каталог C:\node\chatapp\WorkerRole1.
После завершения копирования папка WorkerRole1 будет содержать следующие элементы:
В каталоге C:\node\chatapp\WorkerRole1 удалите файл server.js, а затем переименуйте app.js в server.js. Таким образом вы удалите файл server.js, созданный по умолчанию командлетом Add-AzureNodeWorkerRole, и замените его аналогичным файлом чат-клиента.
Измените Server.js и установите модули
Прежде чем протестировать приложение в эмуляторе Windows Azure, необходимо внести небольшие изменения. Выполните следующие действия с файлом server.js:
Откройте файл server.js в Блокноте или другом текстовом редакторе.
Измените строку для socket.io, удалив запись «../../lib/» из ее начала. В результате строка должна выглядеть так:
, sio = require('socket.io');
Это гарантирует правильную загрузку библиотеки socket.io из папки node_modules при запуске приложения.
Убедитесь, что приложение слушает правильный порт: для этого откройте server.js в Блокноте или другом текстовом редакторе и замените 3000 на process.env.port в следующей строке:
app.listen(3000, function () {
Затем удалите строку, начинающуюся с console.log, так как она не используется ни в эмуляторе Windows Azure, ни в самой системе Windows Azure.
Сохраните изменения в server.js и выполнить описанные ниже действия для установки необходимых модулей и тестирования приложения в эмуляторе Windows Azure:
Если эмулятор еще не запущен, откройте Windows Azure PowerShell. Для этого выберите в меню Start пункты All Programs, Windows Azure, щелкните правой кнопкой мыши Windows Azure PowerShell и выберите Run As Administrator.
Перейдите в каталог с приложением. Например, это может быть C:\node\chatapp\WorkerRole1.
Чтобы установить модули, необходимые приложению, воспользуйтесь командой npm:
PS C:\node\chatapp\WorkerRole1> npm install
В результате будут установлены модули, указанные в файле package.json. После выполнения команды на экране отобразится примерно следующее:
Этот пример изначально находился в репозитории Socket.io в GitHub и напрямую ссылался на библиотеку Socket.io с помощью относительного пути, поэтому библиотека Socket.io не указана в файле package.json и ее нужно установить с помощью команды:
PS C:\node\chatapp\WorkerRole1> npm install socket.io
Тестирование и развертывание
Запустите эмулятор следующей командой:
PS C:\node\chatapp\WorkerRole1> Start-AzureEmulator -launch
Примечание. Если браузер не откроется автоматически, запустите его вручную и перейдите по адресу, полученному командой Start-AzureEmulator.
Когда браузер запустится, введите свой псевдоним и нажмите клавишу «ВВОД». Так вы сможете публиковать сообщения под определенным именем. Для тестирования многопользовательских функций откройте другие браузеры и введите в них такой же URL, но разные псевдонимы.
После тестирования приложения остановите эмулятор следующей командой:
PS C:\node\chatapp\WorkerRole1> Start-AzureEmulator -launch
Чтобы развернуть приложение в Windows Azure, выполните командлет Publish-AzureService. Например:
PS C:\node\chatapp\WorkerRole1> Publish-AzureService -name chatapp -location "North Central US" -launch
Введите уникальное имя, иначе процедура публикации завершится с ошибкой. В случае успешной публикации вы увидите следующий ответ.
Когда развертывание завершится, браузер автоматически откроется и перейдет к развернутой службе.
Теперь приложение работает на Windows Azure и может передавать сообщения в чате между клиентами при помощи Socket.io.
Заключение и дальнейшие действия
В данном руководстве рассказывалось, как развернуть чат-клиент в рабочей роли Windows Azure и обеспечить взаимодействие в режиме реального времени между сервером Node.js и клиентами посредством библиотеки Socket.io.
Дальнейшие действия
- Подробнее о рабочих и веб-ролях можно прочитать в обзорной статье «Создание размещенной службы для Windows Azure».
- Дополнительную информацию о функциях Windows Azure можно найти в разделе «Инструкции по использованию Node.js в Windows Azure».
- Изучите также более подробные руководства по Node.js.