Упражнение. Обеспечение автоматических обновлений в веб-приложении с помощью службы SignalR

Завершено

Чтобы добавить SignalR в этот прототип, необходимо создать следующее:

  • Ресурс Azure SignalR
  • Несколько новых функций для поддержки SignalR
  • Обновление клиента для поддержки SignalR

Создание ресурса SignalR

Необходимо создать ресурс Azure SignalR.

  1. Вернитесь к терминалу, чтобы создать ресурс SignalR.

  2. Перейдите к подкаталогу setup-resources , чтобы создать ресурс.

    cd stock-prototype/setup-resources && bash create-signalr-resources.sh & cd ..
    
  3. Скопируйте строка подключения для ресурса SignalR. Это потребуется для обновления кода сервера.

    Тип ресурса Переменная среды
    Служба Называется SIGNALR_CONNECTION_STRING

Обновление переменных среды конфигурации сервера

В ./start/server/local.settings.json добавьте переменную в объект "Значения ", названный SIGNALR_CONNECTION_STRING значением, указанным в терминале, и сохраните файл.

signalr-open-connection Создание функции

Веб-клиент использует пакет SDK клиента SignalR для установления подключения к серверу. Пакет SDK извлекает подключение через функцию signalr-open-connection для подключения к службе.

  1. Откройте палитру команд Visual Studio Code, нажав клавишу F1.

  2. Найдите и выберите команду Azure Functions: Create Function (Функции Azure: создание функции).

  3. Выберите "Задать" по умолчанию, а затем выберите "Пуск" или "Сервер", чтобы задать расположение приложения-функции.

  4. Выберите "Да", когда будет предложено инициализировать проект для использования с VS Code?.

  5. При появлении запроса введите представленные ниже сведения.

    Имя. Значение
    Template Триггер HTTP
    Имя. signalr-open-connection

    Теперь доступен ./start/server/src/functionsфайл с именем signalr-open-connection.ts.

  6. Откройте signalr-open-connection.ts и замените все следующим кодом.

    import { app, input } from '@azure/functions';
    
    const inputSignalR = input.generic({
        type: 'signalRConnectionInfo',
        name: 'connectionInfo',
        hubName: 'default',
        connectionStringSetting: 'SIGNALR_CONNECTION_STRING',
    });
    
    app.http('open-signalr-connection', {
        authLevel: 'anonymous',
        handler: (request, context) => {
            return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
        },
        route: 'negotiate',
        extraInputs: [inputSignalR]
    });
    

    Сведения о подключении SignalR возвращаются из функции.

signalr-send-message Создание функции

  1. Откройте палитру команд Visual Studio Code, нажав клавишу F1.

  2. Найдите и выберите команду Azure Functions: Create Function (Функции Azure: создание функции).

  3. Выберите расположение приложения-функции в качестве запуска или сервера.

  4. При появлении запроса введите представленные ниже сведения.

    Имя. Значение
    Template Триггер Azure Cosmos DB
    Имя. signalr-send-message
    Строка подключения Cosmos DB COSMOSDB_CONNECTION_STRING
    Имя базы данных для отслеживания stocksdb
    Имя коллекции stocks
    Проверяет наличие и автоматически создает коллекцию аренд true

    Чтобы увидеть новые сведения, обновите окно проводника в Visual Studio Code. Файл с именем signalr-open-connection теперь доступен по адресу ./start/server/src/functions.

  5. Откройте signalr-send-message.ts и замените все следующим кодом.

    import { app, output, CosmosDBv4FunctionOptions, InvocationContext } from "@azure/functions";
    
    const goingOutToSignalR = output.generic({
        type: 'signalR',
        name: 'signalR',
        hubName: 'default',
        connectionStringSetting: 'SIGNALR_CONNECTION_STRING',
    });
    
    export async function dataToMessage(documents: unknown[], context: InvocationContext): Promise<void> {
    
        try {
    
            context.log(`Documents: ${JSON.stringify(documents)}`);
    
            documents.map(stock => {
                // @ts-ignore
                context.log(`Get price ${stock.symbol} ${stock.price}`);
                context.extraOutputs.set(goingOutToSignalR,
                    {
                        'target': 'updated',
                        'arguments': [stock]
                    });
            });
        } catch (error) {
            context.log(`Error: ${error}`);
        }
    }
    
    const options: CosmosDBv4FunctionOptions = {
        connection: 'COSMOSDB_CONNECTION_STRING',
        databaseName: 'stocksdb',
        containerName: 'stocks',
        createLeaseContainerIfNotExists: true,
        feedPollDelay: 500,
        handler: dataToMessage,
        extraOutputs: [goingOutToSignalR],
    };
    
    app.cosmosDB('send-signalr-messages', options);
    
  • Определение входящих данных: comingFromCosmosDB объект определяет триггер Cosmos DB для отслеживания изменений.
  • Определение исходящего транспорта: goingOutToSignalR объект определяет то же соединение SignalR. Имя концентратора является тем же концентратором default.
  • Подключение данные для транспорта: получает измененныеэлементы в stocks таблице и отправляет каждый измененный элемент по отдельности через SignalR с помощью extraOutputs одного и того же концентратораdefaultdataToMessage.
  • Подключение приложению: app.CosmosDB привязки связаны с именем send-signalr-messagesфункции.

Фиксация изменений и отправка на GitHub

  1. В терминале зафиксируйте изменения в репозитории.

    git add .
    git commit -m "Add SignalR functions"
    git push
    

signalr-send-message Создание функции

Создайте приложение-функцию и связанные ресурсы в Azure, в котором можно опубликовать новый код функций.

  1. Откройте портал Azure, чтобы создать новое приложение функций.

  2. Чтобы завершить вкладку "Основы создания ресурсов" , используйте следующие сведения.

    Имя. Значение
    Группа ресурсов Создание имен stock-prototypeгрупп ресурсов.
    Имя приложения-функции Добавьте имя apiв . Например, api-jamie.
    Код или контейнер Выберите код.
    Стек среды выполнения Выберите Node.js.
    Версия Выберите версию LTS Node.js.
    Область/регион Выберите ближайший регион.
    Операционная система Щелкните Linux.
    Размещение на компьютере Выберите план потребления.
  3. Не заполняйте другие вкладки и нажмите кнопку "Проверить и создать ", а затем нажмите кнопку "Создать". Дождитесь завершения развертывания, прежде чем продолжать работу.

  4. Выберите "Перейти к ресурсу ", чтобы открыть новое приложение-функцию.

Настройка развертывания GitHub

Подключение новое приложение-функцию в репозиторий GitHub, чтобы включить непрерывное развертывание. В рабочей среде вместо этого необходимо развернуть изменения кода в промежуточном слоте перед переключением их в рабочую среду.

  1. На странице портал Azure для нового приложения-функции выберите Центр развертывания в меню слева.

  2. Выберите источникGitHub.

  3. Чтобы завершить настройку развертывания, используйте следующие сведения.

    Имя. Значение
    Организация Выберите учетную запись GitHub.
    Репозиторий Найдите и выберите элемент mslearn-advocates.azure-functions-and-signalr.
    Ветвь Выберите главную ветвь.
    Параметр рабочего процесса Выберите " Добавить рабочий процесс...".
    Тип аутентификации Выберите назначаемое пользователем удостоверение.
    Отток подписок Выберите ту же подписку, что и в верхней части страницы.
    Идентификация Выберите Создать.
  4. Нажмите кнопку "Сохранить " в верхней части раздела, чтобы сохранить параметры. При этом создается новый файл рабочего процесса в вилке репозитория.

  5. Эта конфигурация развертывания создает файл рабочего процесса GitHub Actions в репозитории. Необходимо обновить файл рабочего процесса, чтобы использовать правильный путь к пакету для приложения-функции.

Изменение рабочего процесса развертывания GitHub

  1. В терминале Visual Studio Code извлеките новый файл рабочего процесса из вилки (источника).

    git pull origin main
    

    Это должно поместить новую папку на github с путем к файлу рабочего процесса: '.github/workflows/main_RESOURCE_NAME.yml где RESOURCE_NAME — имя приложения Функции Azure.

  2. Откройте файл рабочего процесса.

  3. Измените name значение в верхней части файла Serverна .

  4. Так как исходный репозиторий содержит приложение Функции Azure в подкаталоге, файл действия должен измениться, чтобы отразить это. В разделе env добавьте новую переменную с именемPACKAGE_PATH, чтобы использовать путь к пакету.

    env:
      PACKAGE_PATH: 'start/server'
    
  5. Найдите шаг "Разрешить зависимости проекта" с помощью шага Npm и замените содержимое следующим yamL, чтобы также использовать путь к подкаталогу пакета. Критическое изменение — это путь в команде pushd для включения переменной env.PACKAGE_PATH .

    - name: 'Resolve Project Dependencies Using Npm'
      shell: bash
      run: |
        pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/${{ env.PACKAGE_PATH }}'
        npm install
        npm run build --if-present
        npm run test --if-present
        popd
    
  6. Найдите артефакт Zip для шага развертывания и замените содержимое следующим YAML, чтобы также использовать путь к подкаталогу пакета.

    - name: Upload artifact for deployment job
      uses: actions/upload-artifact@v3
      with:
        name: node-app
        path: release.zip
    

    ZIP-файл помещается в корневой каталог репозитория, поэтому ../ значение необходимо для размещения ZIP-файла в корневом каталоге.

  7. Сохраните файл и зафиксируйте изменения в репозитории.

    git add .
    git commit -m "Update deployment workflow to use package path"
    git push
    

    Это изменение активирует рабочий процесс для запуска. Вы можете просмотреть рабочий процесс из раздела "Действия " вилки на GitHub.

Настройка переменных среды для функций API

  1. В портал Azure выберите Параметры —> Конфигурация, а затем выберите новый параметр приложения.

  2. Введите параметры для строка подключения Cosmos DB и SignalR. Значения можно найти в local.settings.json папке start/server .

    Имя. Значение
    COSMOSDB_CONNECTION_STRING Строка подключения для учетной записи Cosmos DB.
    SIGNALR_CONNECTION_STRING Строка подключения для учетной записи SignalR.
  3. Нажмите кнопку Сохранить, чтобы сохранить параметры.

Тестирование развертывания функций API

  1. В портал Azure выберите "Обзор" и выберите URL-адрес, чтобы открыть приложение в браузере.
  2. Скопируйте URL-адрес, вам потребуется, чтобы при обновлении клиентского .env файла для BACKEND_URL значения при работе в модуле 7.
  3. Откройте URL-адрес в браузере, чтобы проверить функции API.
  4. Добавьте /api/getStocks URL-адрес в браузере и нажмите клавишу ВВОД. Вы должны увидеть массив JSON с данными о запасе.

Вы обновили код сервера, чтобы вернуть акции с помощью SignalR, и вы развернули в приложении-функции. Затем вы обновите клиент, чтобы использовать SignalR для получения обновлений.