Övning – Aktivera automatiska uppdateringar i en webbapp med SignalR Service

Slutförd

Om du vill lägga till SignalR i den här prototypen måste du skapa:

  • En Azure SignalR-resurs
  • Några nya funktioner för att stödja SignalR
  • Uppdatera klienten för att stödja SignalR

Skapa en SignalR-resurs

Du måste skapa en Azure SignalR-resurs.

  1. Gå tillbaka till terminalen för att skapa SignalR-resursen.

  2. Gå till underkatalogen setup-resources för att skapa resursen.

    cd stock-prototype/setup-resources && bash create-signalr-resources.sh & cd ..
    
  3. Kopiera anslutningssträng för SignalR-resursen. Du behöver detta för att uppdatera serverkoden.

    Resurstyp Miljövariabel
    Azure SignalR Kallas SIGNALR_CONNECTION_STRING

Uppdatera miljövariabler för serverkonfiguration

I ./start/server/local.settings.json lägger du till en variabel i objektet Värden med namnet SIGNALR_CONNECTION_STRING med värdet som anges i terminalen och sparar filen.

signalr-open-connection Skapa funktionen

Webbklienten använder SignalR-klientens SDK för att upprätta en anslutning till servern. SDK:et hämtar anslutningen via en funktion med namnet signalr-open-connection för att ansluta till tjänsten.

  1. Öppna Visual Studio Code-kommandopaletten genom att trycka på F1.

  2. Leta upp och välj kommandot Azure Functions: Create Function (Azure Functions: Skapa funktion).

  3. Välj Ange standard och välj sedan start/server för att ange platsen för funktionsappen.

  4. Välj Ja när du uppmanas att initiera projektet för användning med VS Code?.

  5. När du uppmanas att göra det anger du följande information.

    Name Värde
    Template HTTP-utlösare
    Name signalr-open-connection

    En fil med namnet signalr-open-connection.ts är nu tillgänglig på ./start/server/src/functions.

  6. Öppna signalr-open-connection.ts och ersätt allt med följande kod.

    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-anslutningsinformationen returneras från funktionen.

signalr-send-message Skapa funktionen

  1. Öppna Visual Studio Code-kommandopaletten genom att trycka på F1.

  2. Leta upp och välj kommandot Azure Functions: Create Function (Azure Functions: Skapa funktion).

  3. Välj platsen för funktionsappen som start/server.

  4. När du uppmanas att göra det anger du följande information.

    Name Värde
    Template Azure Cosmos DB-utlösare
    Name signalr-send-message
    Cosmos DB-anslutningssträng COSMOSDB_CONNECTION_STRING
    Databasnamn som ska övervakas stocksdb
    Samlingsnamn stocks
    Söker efter existens och skapar automatiskt lånesamlingen true

    Uppdatera Explorer-fönstret i Visual Studio Code om du vill se uppdateringarna. En fil med namnet signalr-open-connection är nu tillgänglig på ./start/server/src/functions.

  5. Öppna signalr-send-message.ts och ersätt allt med följande kod.

    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);
    
  • Definiera inkommande data: Objektet comingFromCosmosDB definierar Cosmos DB-utlösaren för att hålla utkik efter ändringar.
  • Definiera utgående transport: Objektet goingOutToSignalR definierar samma SignalR-anslutning. HubName är samma hubb default.
  • Anslut data till transport: Hämtar dataToMessage de ändrade objekten stocks i tabellen och skickar varje ändrat objekt individuellt via SignalR med hjälp av extraOutputs samma hubb default.
  • Anslut till appen: Bindningarna app.CosmosDB kopplas till funktionsnamnet send-signalr-messages.

Checka in ändringar och skicka till GitHub

  1. I terminalen checkar du in ändringarna till lagringsplatsen.

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

signalr-send-message Skapa funktionen

Skapa en funktionsapp och relaterade resurser i Azure som du kan publicera den nya funktionskoden till.

  1. Öppna Azure Portal för att skapa en ny funktionsapp.

  2. Använd följande information för att slutföra fliken Grundläggande för resursskapande.

    Name Värde
    Resursgrupp Skapa ett nytt resursgruppsnamn stock-prototype.
    Funktionsappens namn Postpend ditt namn till api. Exempel: api-jamie
    Kod eller container Välj kod.
    CLR-stack Välj Node.js.
    Version Välj en LTS-version av Node.js.
    Region Välj en region nära dig.
    Operativsystem Välj Linux.
    Värd Välj Förbrukningsplan.
  3. Fyll inte i några andra flikar och välj Granska + skapa och välj sedan Skapa. Vänta tills distributionen är klar innan du fortsätter.

  4. Välj Gå till resurs för att öppna den nya funktionsappen.

Konfigurera GitHub-distributionen

Anslut din nya funktionsapp till GitHub-lagringsplatsen för att aktivera kontinuerlig distribution. I en produktionsmiljö distribuerar du i stället kodändringar till en mellanlagringsplats innan du byter dem till produktion.

  1. På sidan Azure Portal för den nya funktionsappen väljer du Distributionscenter på den vänstra menyn.

  2. Välj Källa för GitHub.

  3. Använd följande information för att slutföra distributionskonfigurationen.

    Name Värde
    Organisation Välj ditt GitHub-konto.
    Lagringsplats Sök efter och välj mslearn-advocates.azure-functions-and-signalr.
    Filial Välj huvudgrenen.
    Arbetsflödesalternativ Välj Lägg till ett arbetsflöde ....
    Authentication type Välj Användartilldelad identitet.
    Prenumeration Välj samma prenumeration som visas överst på sidan.
    Identitet Välj Skapa ny.
  4. Spara inställningarna genom att välja Spara överst i avsnittet. Då skapas en ny arbetsflödesfil på din förgrenade lagringsplats.

  5. Den här distributionskonfigurationen skapar en GitHub Actions-arbetsflödesfil på lagringsplatsen. Du måste uppdatera arbetsflödesfilen för att använda rätt paketsökväg för funktionsappen.

Nu kan din GitHub-distribution generera ett fel på grund av en felaktig konfiguration i den användartilldelade hanterade identiteten som skapats i resursgruppen i Azure.

Uppdatera den hanterade identiteten

  1. På den nya funktionsappsidan i Azure Portal väljer du resursgruppen i Översikt>Essentials och väljer sedan den hanterade identiteten under Resurser. Den här hanterade identiteten skapades av Functions när du aktiverade GitHub-distributionen.
  2. På sidan Hanterad identitet väljer du Inställningar>Federerade autentiseringsuppgifter och sedan de befintliga autentiseringsuppgifterna.
  3. I Anslut ditt Github-konto ändrar du inställningen för Entitet till miljö och anger Production för Miljö.
  4. Välj Uppdatera för att uppdatera autentiseringsuppgifterna.

Redigera GitHub-distributionsarbetsflöde

  1. I Visual Studio Code-terminalen hämtar du den nya arbetsflödesfilen från din förgrening (ursprung).

    git pull origin main
    

    Detta bör placera en ny mapp på .github med en sökväg till arbetsflödesfilen: .github/workflows/main_RESOURCE_NAME.yml där RESOURCE_NAME är funktionsappens namn.

  2. Öppna arbetsflödesfilen och ändra name värdet överst i filen till Server.

  3. Eftersom källlagringsplatsen har funktionsappen i en underkatalog måste åtgärdsfilen ändras för att återspegla det. I avsnittet env lägger du till en ny variabel med namnet PACKAGE_PATH för att använda paketsökvägen.

    env:
      PACKAGE_PATH: 'start/server'
    
  4. Leta upp steget Lös projektberoenden med Npm och ersätt innehållet med följande YAML för att även använda underkatalogsökvägen för paketet. Den kritiska ändringen är sökvägen i pushd kommandot för att inkludera variabeln 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
    
  5. Leta upp Zip-artefakten för distributionssteget och ersätt innehållet med följande YAML för att även använda underkatalogsökvägen för paketet.

    - name: Zip artifact for deployment
      run: |
        pushd './${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/${{ env.PACKAGE_PATH }}'
        zip -r release.zip .
        popd
        cp ./${{ env.AZURE_FUNCTIONAPP_PACKAGE_PATH }}/${{ env.PACKAGE_PATH }}/release.zip ./release.zip
    

    Zip-filen placeras i roten på lagringsplatsen, så ../ värdet är nödvändigt för att placera zip-filen i roten.

  6. Spara filen och checka in ändringarna på lagringsplatsen.

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

    Den här ändringen utlöser arbetsflödet att köras. Du kan titta på arbetsflödet från avsnittet Åtgärder i förgreningen på GitHub.

Konfigurera miljövariablerna för API-funktionerna

  1. Leta upp funktionsappen i Azure Portal och välj Konfiguration av inställningar>och välj sedan Ny programinställning.

  2. Ange inställningarna för Cosmos DB- och SignalR-anslutningssträng. Du hittar värdena i local.settings.json start/server mappen .

    Name Värde
    COSMOSDB_CONNECTION_STRING Anslutningssträng för Cosmos DB-kontot.
    SIGNALR_CONNECTION_STRING Anslutningssträng för SignalR-kontot.
  3. Spara inställningarna genom att klicka på Spara.

Testa distributionen av API Functions

  1. I Azure Portal väljer du Översikt och väljer URL för att öppna appen i en webbläsare.
  2. Kopiera URL:en, det behöver du när du uppdaterar klientfilen .env för BACKEND_URL värdet när du arbetar i enhet 7.
  3. Öppna URL:en i en webbläsare för att testa API-funktionerna.
  4. /api/getStocks Lägg till url:en i webbläsaren och tryck på Retur. Du bör se en JSON-matris med lagerdata.

Du har uppdaterat serverkoden för att returnera aktier med SignalR och du har distribuerat till en funktionsapp. Därefter uppdaterar du klienten så att den använder SignalR för att ta emot uppdateringar.