Краткое руководство. Создание бессерверного приложения с помощью Функции Azure и Служба SignalR с помощью JavaScript
В этой статье вы используете Служба Azure SignalR, Функции Azure и JavaScript для создания бессерверного приложения для трансляции сообщений клиентам.
Внимание
Необработанные строка подключения отображаются в этой статье только для демонстрационных целей.
Строка подключения включает сведения о авторизации, необходимые для доступа к Служба Azure SignalR приложения. Ключ доступа в строке подключения аналогичен паролю привилегированного пользователя для службы. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты строка подключения с помощью идентификатора Microsoft Entra и авторизации доступа с помощью идентификатора Microsoft Entra.
Старайтесь не распространять ключи доступа среди других пользователей, жестко программировать их или где-то сохранять в виде обычного текста в открытом доступе для других пользователей. Меняйте свои ключи постоянно, если предполагаете, что они могут быть подобраны.
Необходимые компоненты
Это краткое руководство предназначено для macOS, Windows или Linux.
Предварительные требования | Description |
---|---|
Подписка Azure | Если у вас нет подписки, создайте бесплатную учетную запись Azure. |
Редактор кода | Вам нужен редактор кода, например Visual Studio Code. |
Azure Functions Core Tools | Требуется версия 4.0.5611 или более поздняя для запуска Node.js модели программирования версии 4. |
LTS Node.js | Ознакомьтесь с поддерживаемыми версиями node.js в руководстве разработчика javaScript Функции Azure. |
Azurite | Привязка SignalR требует служба хранилища Azure. При локальной работе функции можно использовать эмулятор локального хранилища. |
Azure CLI | При необходимости можно использовать Azure CLI для создания экземпляра Служба Azure SignalR. |
Создание экземпляра службы Azure SignalR
В этом разделе описано, как создать базовый экземпляр Azure SignalR, используемый для приложения. Следующие действия используют портал Azure для создания нового экземпляра, но также можно использовать Azure CLI. Дополнительные сведения см. в статье az signalr create command in the Служба Azure SignalR CLI Reference.
- Войдите на портал Azure.
- Щелкните + Создать ресурс в левом верхнем углу страницы.
- На странице "Создание ресурса" в текстовом поле служба и Marketplace введите сигнализатор и выберите Служба SignalR из списка.
- На странице Служба SignalR нажмите кнопку "Создать".
- На вкладке "Основные сведения" введите необходимые сведения для нового экземпляра Служба SignalR. Введите следующие значения:
Поле | Рекомендуемое значение | Description |
---|---|---|
Подписка | Выберите свою подписку | Выберите подписку, которую вы хотите использовать для создания нового экземпляра Служба SignalR. |
Группа ресурсов | Создайте группу ресурсов с именем SignalRTestResources | Выберите или создайте группу ресурсов для ресурса SignalR. Для этого руководства рекомендуется создать новую группу ресурсов вместо использования существующей группы ресурсов. Чтобы освободить ресурсы после завершения работы с руководством, удалите группу ресурсов. При удалении группы ресурсов также удаляются все ресурсы, принадлежащие группе. Это действие невозможно отменить. Перед удалением группы ресурсов убедитесь, что она не содержит ресурсов, которые вы хотите сохранить. Дополнительные сведения см. в статье Управление ресурсами Azure через портал. |
Имя ресурса | testsignalr | Введите уникальное имя для ресурса SignalR. Если testsignalr уже взят в регионе, добавьте цифру или символ, пока имя не будет уникальным. Имя должно быть строкой длиной от 1 до 63 символов и содержать только цифры, буквы и символ - . Имя не может начинаться или заканчиваться символом дефиса, а последовательные символы дефиса недопустимы. |
Регион | Выберите регион | Выберите соответствующий регион для нового экземпляра Служба SignalR. Служба Azure SignalR сейчас недоступен во всех регионах. Дополнительные сведения см. в разделе Служба Azure SignalR доступности региона |
Ценовая категория | Выберите "Изменить", а затем выберите "Только для разработки и тестирования". Выберите "Выбрать ", чтобы подтвердить выбор ценовой категории. | Служба Azure SignalR имеет три ценовых категории: "Бесплатный", "Стандартный" и "Премиум". Учебники используют уровень "Бесплатный " , если не указано иное в предварительных требованиях. Дополнительные сведения о различиях функций между уровнями и ценами см. в Служба Azure SignalR ценах |
Режим службы | Выбор соответствующего режима службы | Используйте Значение по умолчанию при размещении логики Концентратора SignalR в веб-приложениях и использовании службы SignalR в качестве прокси-сервера. Используйте бессерверные технологии, такие как Функции Azure для размещения логики концентратора SignalR. Классический режим предназначен только для обратной совместимости и не рекомендуется использовать. Дополнительные сведения см. в разделе "Режим службы" в Служба Azure SignalR. |
Вам не нужно изменять параметры на вкладках "Сеть и теги " для учебников SignalR.
- Нажмите кнопку "Просмотр и создание " в нижней части вкладки "Основные сведения".
- На вкладке "Просмотр и создание" просмотрите значения и нажмите кнопку "Создать". Для завершения развертывания потребуется несколько минут.
- По завершении развертывания нажмите кнопку "Перейти к ресурсу ".
- На странице ресурсов SignalR выберите "Ключи" в меню слева в разделе "Параметры".
- Скопируйте строку подключения для первичного ключа. Это строка подключения вам потребуется, чтобы настроить приложение позже в этом руководстве.
Проект функции установки
Убедитесь, что на компьютере установлен набор средств Azure Functions Core Tools.
- Откройте командную строку.
- Создайте каталог проекта и измените его.
- Выполните команду Функции Azure
func init
, чтобы инициализировать новый проект.
func init --worker-runtime javascript --language javascript --model V4
Создание функций проекта
После инициализации проекта необходимо создать функции. Для этого проекта требуются три функции:
index
: размещает веб-страницу для клиента.negotiate
: позволяет клиенту получить маркер доступа.broadcast
: использует триггер времени для периодического трансляции сообщений для всех клиентов.
При выполнении func new
команды из корневого каталога проекта Функции Azure Core Tools создает исходные файлы функций, хранящие их в папке с именем функции. При необходимости вы изменяете файлы, заменяя код по умолчанию кодом приложения.
Создание функции индекса
Выполните следующую команду, чтобы создать функцию
index
.func new -n index -t HttpTrigger
Измените src/functions/httpTrigger.js и замените содержимое следующим кодом json:
const { app } = require('@azure/functions'); const fs = require('fs').promises; const path = require('path'); app.http('index', { methods: ['GET', 'POST'], authLevel: 'anonymous', handler: async (request, context) => { try { context.log(`Http function processed request for url "${request.url}"`); const filePath = path.join(__dirname,'../content/index.html'); const html = await fs.readFile(filePath); return { body: html, headers: { 'Content-Type': 'text/html' } }; } catch (error) { context.log(error); return { status: 500, jsonBody: error } } } });
Создание функции согласования
Выполните следующую команду, чтобы создать функцию
negotiate
.func new -n negotiate -t HttpTrigger
Измените src/functions/negotiate.js и замените содержимое следующим кодом json:
const { app, input } = require('@azure/functions'); const inputSignalR = input.generic({ type: 'signalRConnectionInfo', name: 'connectionInfo', hubName: 'serverless', connectionStringSetting: 'SIGNALR_CONNECTION_STRING', }); app.post('negotiate', { authLevel: 'anonymous', handler: (request, context) => { try { return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) } } catch (error) { context.log(error); return { status: 500, jsonBody: error } } }, route: 'negotiate', extraInputs: [inputSignalR], });
Создайте широковещательную функцию.
Выполните следующую команду, чтобы создать функцию
broadcast
.func new -n broadcast -t TimerTrigger
Измените src/functions/broadcast.js и замените содержимое следующим кодом:
const { app, output } = require('@azure/functions'); const getStars = require('../getStars'); var etag = ''; var star = 0; const goingOutToSignalR = output.generic({ type: 'signalR', name: 'signalR', hubName: 'serverless', connectionStringSetting: 'SIGNALR_CONNECTION_STRING', }); app.timer('sendMessasge', { schedule: '0 * * * * *', extraOutputs: [goingOutToSignalR], handler: async (myTimer, context) => { try { const response = await getStars(etag); if(response.etag === etag){ console.log(`Same etag: ${response.etag}, no need to broadcast message`); return; } etag = response.etag; const message = `${response.stars}`; context.extraOutputs.set(goingOutToSignalR, { 'target': 'newMessage', 'arguments': [message] }); } catch (error) { context.log(error); } } });
Создание файла index.html
Клиентский интерфейс для этого приложения — это веб-страница. Функция index
считывает HTML-содержимое из файла content/index.html .
Создайте папку, вызываемую
content
в корневой папке проекта.Создайте файл content/index.html.
Скопируйте следующее содержимое в файл content/index.html и сохраните его:
<html> <body> <h1>Azure SignalR Serverless Sample</h1> <div>Instructions: Goto <a href="https://github.com/Azure/azure-signalr">GitHub repo</a> and star the repository.</div> <hr> <div>Star count: <div id="messages"></div></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js"></script> <script> let messages = document.querySelector('#messages'); const apiBaseUrl = window.location.origin; console.log(`apiBaseUrl: ${apiBaseUrl}`); const connection = new signalR.HubConnectionBuilder() .withUrl(apiBaseUrl + '/api') .configureLogging(signalR.LogLevel.Information) .build(); connection.on('newMessage', (message) => { console.log(`message: ${message}`); document.getElementById("messages").innerHTML = message; }); connection.start() .catch(console.error); </script> </body> </html>
Настройка служба хранилища Azure
Функции Azure требуется, чтобы учетная запись хранения работала. Выберите один из двух следующих вариантов:
- Запустите бесплатный эмулятор служба хранилища Azure.
- Используйте службу служба хранилища Azure. Это может привести к затратам, если вы продолжаете использовать его.
Запустите эмулятор хранилища Azurite:
azurite -l azurite -d azurite\debug.log
Убедитесь,
AzureWebJobsStorage
что в local.settings.json задано значениеUseDevelopmentStorage=true
.
Добавление Служба SignalR строка подключения в параметры приложения-функции
Вы почти сделали сейчас. Последним шагом является настройка Служба SignalR строка подключения в параметрах приложения-функции Azure.
В портал Azure перейдите в развернутый ранее экземпляр SignalR.
Выберите ключи для просмотра строк подключения экземпляра службы SignalR.
Скопируйте основной строка подключения и выполните команду.
Необработанные строка подключения отображаются в этой статье только для демонстрационных целей. В рабочих средах всегда защищать ключи доступа. Используйте Azure Key Vault для безопасного управления ключами и защиты строка подключения с помощью идентификатора Microsoft Entra и авторизации доступа с помощью идентификатора Microsoft Entra.
func settings add AzureSignalRConnectionString "<signalr-connection-string>"
Локальное запуск приложения-функции Azure
Запустите приложение-функцию Azure в локальной среде:
func start
После локальной работы функции Azure перейдите в раздел http://localhost:7071/api/index
. На странице отображается текущее число звезд для репозитория GitHub Azure/azure-signalr. При отображении или отмене репозитория в GitHub вы увидите обновляемое количество каждые несколько секунд.
Возникли проблемы? См. руководство по устранению неполадок или сообщите о проблеме нам.
Очистка ресурсов
Если вы не собираетесь использовать это приложение дальше, удалите все ресурсы, созданные в ходе работы с этим кратким руководством, чтобы не оплачивать их.
На портале Azure выберите Группа ресурсов слева, а затем созданную группу ресурсов. Также можно использовать поле поиска для поиска ресурса по его имени.
В открывшемся окне выберите группу ресурсов и щелкните Удалить группу ресурсов.
В новом окне введите имя группы ресурсов, которую требуется удалить, и щелкните Удалить.
Пример кода
Вы можете получить весь код, используемый в статье из репозитория GitHub:
Следующие шаги
В этом кратком руководстве вы создали и запустили бессерверное приложение в режиме реального времени в localhost. и как с помощью Службы SignalR настроить двусторонний обмен данными между клиентами и экземпляром Функций Azure.