Share via


Tutorial: Criar um aplicativo de notificação sem servidor com o Azure Functions e o serviço Azure Web PubSub

O serviço Azure Web PubSub ajuda você a criar aplicativos Web de mensagens em tempo real usando WebSockets. As Funções do Azure são uma plataforma sem servidor que lhe permite executar código sem ter de gerir qualquer infraestrutura. Neste tutorial, você aprenderá a usar o serviço Azure Web PubSub e o Azure Functions para criar um aplicativo sem servidor com mensagens em tempo real em cenários de notificação.

Neste tutorial, irá aprender a:

  • Criar um aplicativo de notificação sem servidor
  • Trabalhar com ligações de entrada e saída da função Web PubSub
  • Execute as funções de exemplo localmente
  • Implantar a função no Azure Function App

Pré-requisitos

  • Um editor de código, como o Visual Studio Code

  • Node.js, versão 18.x ou superior.

    Nota

    Para obter mais informações sobre as versões suportadas do Node.js, consulte a documentação de versões de tempo de execução do Azure Functions.

  • Ferramentas Principais do Azure Functions (V4 ou superior) para executar aplicativos do Azure Function localmente e implantar no Azure.

  • A CLI do Azure para gerenciar recursos do Azure.

Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.

Iniciar sessão no Azure

Inicie sessão no portal do Azure em https://portal.azure.com/ com a sua conta do Azure.

Criar uma instância de serviço Azure Web PubSub

Seu aplicativo se conectará a uma instância de serviço Web PubSub no Azure.

  1. Selecione o botão Novo, no canto superior esquerdo do portal do Azure. Na tela Novo, digite Web PubSub na caixa de pesquisa e pressione enter. (Você também pode pesquisar o Azure Web PubSub na Web categoria.)

    Screenshot of searching the Azure Web PubSub in portal.

  2. Selecione Web PubSub nos resultados da pesquisa e, em seguida, selecione Criar.

  3. Introduza as seguintes definições.

    Definição Valor sugerido Description
    Nome do recurso Nome globalmente exclusivo O Nome globalmente exclusivo que identifica sua nova instância de serviço Web PubSub. Os caracteres válidos são a-z, , A-Z0-9, e -.
    Subscrição a sua subscrição A assinatura do Azure sob a qual essa nova instância de serviço Web PubSub é criada.
    Grupo de Recursos myResourceGroup Nome para o novo grupo de recursos no qual criar sua instância de serviço Web PubSub.
    Localização E.U.A. Oeste Escolha uma região perto de si.
    Escalão de preço Gratuito Primeiro, você pode experimentar o serviço Azure Web PubSub gratuitamente. Saiba mais detalhes sobre os níveis de preços do serviço Azure Web PubSub
    Contagem de unidades - A contagem de unidades especifica quantas conexões sua instância de serviço Web PubSub pode aceitar. Cada unidade suporta no máximo 1.000 conexões simultâneas. Pode configurar apenas no escalão Standard.

    Screenshot of creating the Azure Web PubSub instance in portal.

  4. Selecione Criar para iniciar a implantação da instância do serviço Web PubSub.

Criar e executar as funções localmente

  1. Certifique-se de que tem as Ferramentas Principais do Azure Functions instaladas. Agora, crie um diretório vazio para o projeto. Execute o comando neste diretório de trabalho. Use uma das opções fornecidas abaixo.

    func init --worker-runtime javascript --model V4
    
  2. Siga os passos para instalar Microsoft.Azure.WebJobs.Extensions.WebPubSubo .

    Confirme ou atualize host.jsono extensionBundle para a versão 4.* ou posterior para obter suporte ao Web PubSub. Para atualizar o , abra o host.jsonarquivo no editor e, em seguida, substitua a versão existente extensionBundle para a versão 4.* ou posterior.

    {
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[4.*, 5.0.0)"
        }
    }
    
  3. Crie uma função para ler e hospedar uma index página da Web estática para clientes.

    func new -n index -t HttpTrigger
    
    • Atualize src/functions/index.js e copie os seguintes códigos.
      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. Crie uma função para ajudar os clientes a obter URL de conexão de serviço com token de negotiate acesso.

    func new -n negotiate -t HttpTrigger
    
    • Atualize src/functions/negotiate.js e copie os seguintes códigos.
      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. Crie uma notification função para gerar notificações com TimerTriggero .

    func new -n notification -t TimerTrigger
    
    • Atualize src/functions/notification.js e copie os seguintes códigos.
      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. Adicione a página index.html única do cliente na pasta raiz do projeto e copie o conteúdo.

    <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. Configurar e executar a aplicação Funções do Azure

    • No navegador, abra o portal do Azure e confirme se a instância do Serviço Web PubSub implantada anteriormente foi criada com êxito. Navegue até a instância.
    • Selecione Chaves e copie a cadeia de conexão.

    Screenshot of copying the Web PubSub connection string.

    Execute o comando na pasta de função para definir a cadeia de conexão de serviço. Substitua <connection-string> pelo seu valor conforme necessário.

    func settings add WebPubSubConnectionString "<connection-string>"
    

    Nota

    TimerTrigger usado no exemplo tem dependência do Armazenamento do Azure, mas você pode usar o emulador de armazenamento local quando a Função estiver sendo executada localmente. Se você tiver algum erro como There was an error performing a read operation on the Blob Storage Secret Repository. Please ensure the 'AzureWebJobsStorage' connection string is valid., você precisará baixar e ativar o emulador de armazenamento.

    Agora você pode executar sua função local por comando.

    func start --port 7071
    

    E verificando os logs em execução, você pode visitar sua página estática do host local visitando: http://localhost:7071/api/index.

    Nota

    Alguns browers redirecionam automaticamente para https que leva a url errado. Sugira usar Edge e verifique novamente a url se a renderização não for bem-sucedida.

Implantar o aplicativo Function no Azure

Antes de implantar seu código de função no Azure, você precisa criar três recursos:

  • Um grupo de recursos, que é um contêiner lógico para recursos relacionados.
  • Uma conta de armazenamento, que é usada para manter o estado e outras informações sobre suas funções.
  • Um aplicativo de função, que fornece o ambiente para executar seu código de função. Um aplicativo de função mapeia para seu projeto de função local e permite agrupar funções como uma unidade lógica para facilitar o gerenciamento, a implantação e o compartilhamento de recursos.

Use os comandos a seguir para criar esses itens.

  1. Entre no Azure:

    az login
    
  2. Crie um grupo de recursos ou você pode ignorar reutilizando o do serviço Azure Web PubSub:

    az group create -n WebPubSubFunction -l <REGION>
    
  3. Crie uma conta de armazenamento de uso geral em seu grupo de recursos e região:

    az storage account create -n <STORAGE_NAME> -l <REGION> -g WebPubSubFunction
    
  4. Crie o aplicativo de função no 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>
    

    Nota

    Verifique a documentação das versões de tempo de execução do Azure Functions para definir --runtime-version o parâmetro como valor suportado.

  5. Implante o projeto de função no Azure:

    Depois de criar seu aplicativo de função no Azure, você está pronto para implantar seu projeto de funções locais usando o comando func azure functionapp publishing .

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

    Nota

    Aqui estamos implantando configurações locais juntamente com o local.settings.json parâmetro --publish-local-settingsde comando. Se você estiver usando o Emulador de Armazenamento do Microsoft Azure, poderá digitar no para ignorar a substituição desse valor no Azure seguindo a mensagem de prompt: App setting AzureWebJobsStorage is different between azure and local.settings.json, Would you like to overwrite value in azure? [yes/no/show]. Além disso, você pode atualizar as configurações do Aplicativo de Função no Portal do Azure -Settings ->>Configuration.

  6. Agora você pode verificar seu site no Aplicativo de Função do Azure navegando até URL: https://<FUNCIONAPP_NAME>.azurewebsites.net/api/index.

Clean up resources (Limpar recursos)

Se você não vai continuar a usar este aplicativo, exclua todos os recursos criados por este documento com as seguintes etapas para não incorrer em nenhum custo:

  1. No portal do Azure, selecione Grupos de recursos à esquerda e, em seguida, selecione o grupo de recursos que criou. Em vez disso, use a caixa de pesquisa para localizar o grupo de recursos pelo nome.

  2. Na janela que se abre, selecione o grupo de recursos e, em seguida, selecione Eliminar grupo de recursos.

  3. Na nova janela, digite o nome do grupo de recursos a ser excluído e selecione Excluir.

Próximos passos

Neste início rápido, você aprendeu como executar um aplicativo de chat sem servidor. Agora, você pode começar a criar seu próprio aplicativo.