Självstudie: Skapa en serverlös meddelandeapp med Azure Functions och Azure Web PubSub-tjänsten

Tjänsten Azure Web PubSub hjälper dig att skapa webbprogram för meddelanden i realtid med hjälp av WebSockets. Azure Functions är en serverlös plattform som gör att du kan köra din kod utan att behöva hantera någon infrastruktur. I den här självstudien lär du dig hur du använder Tjänsten Azure Web PubSub och Azure Functions för att skapa ett serverlöst program med meddelanden i realtid under meddelandescenarier.

I den här självstudien lär du dig att:

  • Skapa en serverlös meddelandeapp
  • Arbeta med indata- och utdatabindningar för Web PubSub-funktioner
  • Kör exempelfunktionerna lokalt
  • Distribuera funktionen till Azure-funktionsappen

Förutsättningar

  • En kodredigerare, till exempel Visual Studio Code

  • Node.js, version 18.x eller senare.

    Kommentar

    Mer information om de versioner av Node.js som stöds finns i dokumentationen om Azure Functions-körningsversioner.

  • Azure Functions Core Tools (V4 eller senare rekommenderas) för att köra Azure Function-appar lokalt och distribuera till Azure.

  • Azure CLI för att hantera Azure-resurser.

Om du inte har en Azure-prenumeration skapar du ett kostnadsfritt Azure-konto innan du börjar.

Logga in på Azure

Logga in på Azure Portal på https://portal.azure.com/ med ditt Azure-konto.

Skapa en Azure Web PubSub-tjänstinstans

Ditt program ansluter till en Web PubSub-tjänstinstans i Azure.

  1. Välj knappen Nytt högst upp till vänster i Azure-portalen. På skärmen Nytt skriver du Web PubSub i sökrutan och trycker på Retur. (Du kan också söka i Azure Web PubSub från Web kategorin.)

    Screenshot of searching the Azure Web PubSub in portal.

  2. Välj Web PubSub i sökresultatet och välj sedan Skapa.

  3. Ange följande inställningar.

    Inställning Föreslaget värde beskrivning
    Resursnamn Globalt unikt namn Det globalt unika namn som identifierar din nya Web PubSub-tjänstinstans. Giltiga tecken är a-z, A-Z, 0-9och -.
    Abonnemang Din prenumeration Den Azure-prenumeration under vilken den här nya Web PubSub-tjänstinstansen skapas.
    Resursgrupp myResourceGroup Namn på den nya resursgrupp där du vill skapa din Web PubSub-tjänstinstans.
    Plats Västra USA Välj en region nära dig.
    Prisnivå Kostnadsfritt Du kan prova tjänsten Azure Web PubSub kostnadsfritt. Läs mer om prisnivåer för Azure Web PubSub-tjänsten
    Antal enheter - Antal enheter anger hur många anslutningar din Web PubSub-tjänstinstans kan acceptera. Varje enhet stöder högst 1 000 samtidiga anslutningar. Det kan bara konfigureras på Standard-nivån.

    Screenshot of creating the Azure Web PubSub instance in portal.

  4. Välj Skapa för att börja distribuera instansen av Web PubSub-tjänsten.

Skapa och köra funktionerna lokalt

  1. Kontrollera att du har Azure Functions Core Tools installerat. Skapa nu en tom katalog för projektet. Kör kommandot under den här arbetskatalogen. Använd något av de angivna alternativen nedan.

    func init --worker-runtime javascript --model V4
    
  2. Följ stegen för att installera Microsoft.Azure.WebJobs.Extensions.WebPubSub.

    Bekräfta eller uppdatera host.jsontilläggetBundle till version 4.* eller senare för att få support för Web PubSub. Om du vill uppdatera host.jsonöppnar du filen i redigeraren och ersätter sedan det befintliga versionstilläggetBundle till version 4.* eller senare.

    {
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[4.*, 5.0.0)"
        }
    }
    
  3. Skapa en index funktion för att läsa och vara värd för en statisk webbsida för klienter.

    func new -n index -t HttpTrigger
    
    • Uppdatera src/functions/index.js och kopiera följande koder.
      const { app } = require('@azure/functions');
      const { readFile } = require('fs/promises');
      
      app.http('index', {
          methods: ['GET', 'POST'],
          authLevel: 'anonymous',
          handler: async (context) => {
              const content = await readFile('index.html', 'utf8', (err, data) => {
                  if (err) {
                      context.err(err)
                      return
                  }
              });
      
              return { 
                  status: 200,
                  headers: { 
                      'Content-Type': 'text/html'
                  }, 
                  body: content, 
              };
          }
      });
      
  4. Skapa en negotiate funktion som hjälper klienter att hämta url:en för tjänstanslutning med åtkomsttoken.

    func new -n negotiate -t HttpTrigger
    
    • Uppdatera src/functions/negotiate.js och kopiera följande koder.
      const { app, input } = require('@azure/functions');
      
      const connection = input.generic({
          type: 'webPubSubConnection',
          name: 'connection',
          hub: 'notification'
      });
      
      app.http('negotiate', {
          methods: ['GET', 'POST'],
          authLevel: 'anonymous',
          extraInputs: [connection],
          handler: async (request, context) => {
              return { body: JSON.stringify(context.extraInputs.get('connection')) };
          },
      });
      
  5. Skapa en notification funktion för att generera meddelanden med TimerTrigger.

    func new -n notification -t TimerTrigger
    
    • Uppdatera src/functions/notification.js och kopiera följande koder.
      const { app, output } = require('@azure/functions');
      
      const wpsAction = output.generic({
          type: 'webPubSub',
          name: 'action',
          hub: 'notification'
      });
      
      app.timer('notification', {
          schedule: "*/10 * * * * *",
          extraOutputs: [wpsAction],
          handler: (myTimer, context) => {
              context.extraOutputs.set(wpsAction, {
                  actionName: 'sendToAll',
                  data: `[DateTime: ${new Date()}] Temperature: ${getValue(22, 1)}\xB0C, Humidity: ${getValue(40, 2)}%`,
                  dataType: 'text',
              });
          },
      });
      
      function getValue(baseNum, floatNum) {
          return (baseNum + 2 * floatNum * (Math.random() - 0.5)).toFixed(3);
      }
      
  6. Lägg till klientens enstaka sida index.html i projektets rotmapp och kopiera innehåll.

    <html>
        <body>
        <h1>Azure Web PubSub Notification</h1>
        <div id="messages"></div>
        <script>
            (async function () {
                let messages = document.querySelector('#messages');
                let res = await fetch(`${window.location.origin}/api/negotiate`);
                let url = await res.json();
                let ws = new WebSocket(url.url);
                ws.onopen = () => console.log('connected');
    
                ws.onmessage = event => {
                    let m = document.createElement('p');
                    m.innerText = event.data;
                    messages.appendChild(m);
                };
            })();
        </script>
        </body>
    </html>
    
  7. Konfigurera och köra Azure Functions-appen

    • Öppna Azure-portalen i webbläsaren och bekräfta att den Web PubSub Service-instans som du distribuerade tidigare har skapats. Navigera till instansen.
    • Välj Nycklar och kopiera ut anslutningssträng.

    Screenshot of copying the Web PubSub connection string.

    Kör kommandot i funktionsmappen för att ange tjänsten anslutningssträng. Ersätt <connection-string> med ditt värde efter behov.

    func settings add WebPubSubConnectionString "<connection-string>"
    

    Kommentar

    TimerTrigger som används i exemplet är beroende av Azure Storage, men du kan använda den lokala lagringsemulatorn när funktionen körs lokalt. Om du får ett felmeddelande som There was an error performing a read operation on the Blob Storage Secret Repository. Please ensure the 'AzureWebJobsStorage' connection string is valid.måste du ladda ned och aktivera Lagringsemulatorn.

    Nu kan du köra din lokala funktion med kommando.

    func start --port 7071
    

    Och genom att kontrollera loggarna som körs kan du besöka den lokala värdens statiska sida genom att besöka: http://localhost:7071/api/index.

    Kommentar

    Vissa browers omdirigeras automatiskt till https som leder till fel URL. Föreslå att du använder Edge och dubbelkollar URL:en om renderingen inte lyckas.

Distribuera funktionsapp till Azure

Innan du kan distribuera funktionskoden till Azure måste du skapa tre resurser:

  • En resursgrupp, som är en logisk container för relaterade resurser.
  • Ett lagringskonto som används för att underhålla tillstånd och annan information om dina funktioner.
  • En funktionsapp som tillhandahåller miljön för att köra funktionskoden. En funktionsapp mappar till ditt lokala funktionsprojekt och låter dig gruppera funktioner som en logisk enhet för enklare hantering, distribution och delning av resurser.

Använd följande kommandon för att skapa dessa objekt.

  1. Logga in på Azure:

    az login
    
  2. Skapa en resursgrupp eller så kan du hoppa över genom att återanvända en av Azure Web PubSub-tjänsten:

    az group create -n WebPubSubFunction -l <REGION>
    
  3. Skapa ett allmänt lagringskonto i din resursgrupp och region:

    az storage account create -n <STORAGE_NAME> -l <REGION> -g WebPubSubFunction
    
  4. Skapa funktionsappen i Azure:

    az functionapp create --resource-group WebPubSubFunction --consumption-plan-location <REGION> --runtime node --runtime-version 18 --functions-version 4 --name <FUNCIONAPP_NAME> --storage-account <STORAGE_NAME>
    

    Kommentar

    Kontrollera dokumentationen för Azure Functions-körningsversioner för att ange --runtime-version parametern till det värde som stöds.

  5. Distribuera funktionsprojektet till Azure:

    När du har skapat din funktionsapp i Azure är du nu redo att distribuera ditt lokala funktionsprojekt med hjälp av publiceringskommandot func azure functionapp .

    func azure functionapp publish <FUNCIONAPP_NAME> --publish-local-settings
    

    Kommentar

    Här distribuerar vi lokala inställningar local.settings.json tillsammans med kommandoparametern --publish-local-settings. Om du använder Microsoft Azure Storage-emulatorn kan du skriva no för att hoppa över att skriva över det här värdet i Azure genom att följa promptmeddelandet: App setting AzureWebJobsStorage is different between azure and local.settings.json, Would you like to overwrite value in azure? [yes/no/show]. Dessutom kan du uppdatera inställningarna för funktionsappen i Azure Portal ->Inställningar ->Configuration.

  6. Nu kan du kontrollera din webbplats från Azure-funktionsappen genom att gå till URL: https://<FUNCIONAPP_NAME>.azurewebsites.net/api/index.

Rensa resurser

Om du inte kommer att fortsätta att använda den här appen tar du bort alla resurser som skapats av det här dokumentet med följande steg så att du inte debiteras några avgifter:

  1. Välj Resursgrupper i Azure Portal längst till vänster och välj sedan den resursgrupp du skapat. Använd sökrutan för att hitta resursgruppen efter dess namn i stället.

  2. I fönstret som öppnas väljer du resursgruppen och väljer sedan Ta bort resursgrupp.

  3. I det nya fönstret skriver du namnet på resursgruppen som ska tas bort och väljer sedan Ta bort.

Nästa steg

I den här snabbstarten har du lärt dig hur du kör ett serverlöst chattprogram. Nu kan du börja skapa ett eget program.