Exercício – Criar um fluxo de trabalho usando as Durable Functions

Concluído

Neste exercício, você usará o cenário de exemplo da unidade anterior para aprender a criar um fluxo de trabalho de aprovação no portal do Azure usando as Durable Functions.

Criar um aplicativo de funções

  1. Entre no portal do Azure usando a conta que você utilizou para ativar a área restrita.

  2. No menu do portal do Azure ou na Home page, em Serviços do Azure, selecione Criar um recurso. O painel Criar um recurso será exibido.

  3. Procure e selecione Aplicativo de Funções. O painel Criar Aplicativo de Funções é exibido.

  4. Na guia Básico, insira os valores a seguir para cada configuração.

    Configuração Valor Descrição
    Detalhes do projeto
    Subscription Assinatura do Concierge Especifica a assinatura na qual este aplicativo de funções será criado.
    Grupo de recursos Na lista suspensa, selecione [nome do grupo de recursos da área restrita] Especifica o nome do grupo de recursos no qual o aplicativo de funções será criado. Criaremos o aplicativo de funções no grupo de recursos de área restrita que foi atribuído quando ativamos a área restrita, ou seja, [nome do grupo de recursos de área restrita].
    Detalhes da Instância
    Nome do aplicativo de funções [Nome globalmente exclusivo] Especifica o nome que identifica o novo aplicativo de funções. Os caracteres válidos são a-z, 0-9 e -.
    Publicação Código Especifica que a função usará o código em vez de um contêiner.
    Pilha de runtime Node.js Especifica que o código de exemplo nesse módulo é escrito em JavaScript.
    Versão 20 LTS Especifica a versão da pilha de runtime.
    Região [Selecione na lista após esta seção] Escolha a região mais próxima de você que também seja uma das Regiões de área restrita permitidas listadas abaixo.
    Sistema operacional
    Sistema operacional Windows Especifica o sistema operacional que hospeda o aplicativo de funções.
    Plano
    Tipo de plano Consumo (sem servidor) Especifica o plano de hospedagem que define como os recursos são alocados para o aplicativo de funções. No plano de Consumo padrão, os recursos são adicionados dinamicamente conforme exigido pelas funções. Nesse modelo de hospedagem sem servidor, você só paga pelo tempo em que as funções são executadas.

    A área restrita gratuita permite criar recursos em um subconjunto das regiões globais do Azure. Selecione uma região na seguinte lista ao criar recursos:

    • Oeste dos EUA 2
    • Centro-Sul dos Estados Unidos
    • Centro dos EUA
    • Leste dos EUA
    • Europa Ocidental
    • Sudeste Asiático
    • Leste do Japão
    • Brazil South
    • Australia Southeast
    • Índia Central
  5. Selecione Avançar: Armazenamento.

  6. Na guia Segurança, insira os valores a seguir para cada configuração.

    Configuração Valor Descrição
    Storage
    Conta de armazenamento [Nome globalmente exclusivo] Especifica o nome da nova conta de armazenamento usada pelo aplicativo de funções (que não precisa corresponder ao nome globalmente exclusivo que você especificou para a sua função). Os nomes da conta de armazenamento devem ter entre 3 e 24 caracteres e podem conter apenas números e letras minúsculas. Essa caixa de diálogo preenche o campo de forma automática com um nome exclusivo gerado dinamicamente. No entanto, fique à vontade para usar um nome diferente ou até mesmo uma conta existente.
  7. Selecione Avançar: Rede. Aceite os padrões.

  8. Selecione Avançar: Monitoramento.

  9. Na guia Monitoramento, insira o valor a seguir para a configuração.

    Configuração Valor Descrição
    Application Insights
    Habilitar o Application Insights Não Especifica que o Application Insights será desabilitado para esse módulo.
  10. Selecione Examinar + criar e examine as opções que você configurou. Se estiver satisfeito com suas opções, selecione Criar para provisionar e implantar o aplicativo de funções.

Aguarde a implantação ser concluída antes de continuar. A implantação pode levar alguns minutos.

Instalar o pacote npm durable-functions

Como estamos criando o Durable Functions do JavaScript, precisamos instalar o pacote npm do durable-functions. Para isso, execute as etapas a seguir.

  1. Escolha Ir para recursos para selecionar o novo aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. No painel do menu à esquerda, em Ferramentas de Desenvolvimento, selecione Editor do Serviço de Aplicativo (versão prévia) e escolha Abrir editor. O painel de Início Rápido do Editor do Serviço de Aplicativo é exibido em uma nova janela do navegador.

  3. No painel de menu à esquerda, realce a pasta WWWROOT.

  4. No menu da barra de ferramentas à esquerda, selecione o ícone Abrir Console.

    Essa ação inicia o console. Você pode usar esse console para acessar o servidor web que hospeda suas funções e escrever o código para essas funções.

  5. Crie um arquivo package.json.

    • Execute os comandos a seguir no console para criar o arquivo JSON e abri-lo no editor.

      touch package.json
      open package.json
      
    • Adicione o código seguinte:

      {
        "name": "example",
        "version": "1.0.0"
      }
      

      Substitua example pelo nome do seu pacote. Por exemplo, você poderia usar um nome globalmente exclusivo especificado para sua função anteriormente.

  6. Selecione Ctrl+S para salvar o arquivo e Ctrl+Q para fechar o documento.

  7. Alterne novamente para o portal do Azure.

  8. Na barra do menu à esquerda, em Ferramentas de Desenvolvimento, selecione Console. O painel Console é exibido para o seu aplicativo de funções.

  9. Execute o comando a seguir:

    npm install durable-functions
    

    Esse comando instrui o gerenciador de pacotes de nós a instalar o pacote do durable-functions e as dependências necessárias. A instalação pode levar alguns minutos para ser concluída e o gerenciador de pacotes de nós poderá mostrar alguns avisos, que você pode ignorar. Se for solicitado a instalar uma versão mais recente do npm, use o comando especificado no erro para instalar a versão mais recente e, a seguir, instale o pacote do durable-functions assim que a nova versão estiver instalada.

    Aguarde todos os pacotes concluírem a instalação.

  10. No painel de menu à esquerda, role para cima e selecione Visão geral, e na barra de menu superior, selecione Reiniciar e Sim quando aparecer a solicitação para reiniciar.

    Aguarde a reinicialização ser concluída antes de continuar.

Criar a função cliente para enviar uma proposta de design

  1. No menu do portal do Azure ou na Página Inicial, em Recursos recentes, selecione Ver tudo e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. Na página Visão geral, selecione a guia Funções no centro da tela.

  3. Selecione o botão Criar no portal do Azure. O painel Criar função é exibido.

  4. Na guia Selecionar um modelo, na caixa Filtro, digite inicializador HTTP do Durable Functions e selecione esse modelo na lista. Esse modelo cria uma função durável que é executada em resposta a uma solicitação HTTP.

  5. Na guia Detalhes do modelo, para o campo Nova Função, digite HttpStart como o nome da função e, no campo Nível de autorização, selecione Função e, a seguir, selecione Criar. O painel HttpStart é exibido para sua função.

  6. No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua função.

    O código para o arquivo index.js é exibido no editor. O arquivo deverá ser parecido com o seguinte exemplo:

    const df = require("durable-functions");
    
    module.exports = async function (context, req) {
        const client = df.getClient(context);
        const instanceId = await client.startNew(req.params.functionName, undefined, req.body);
    
        context.log(`Started orchestration with ID = '${instanceId}'.`);
    
        return client.createCheckStatusResponse(context.bindingData.req, instanceId);
    };
    
  7. Na lista suspensa dos arquivos em sua função, selecione function.json para exibir as associações vinculadas à nova função. Essas informações especificam os requisitos de autenticação, junto com os métodos HTTP que podem disparar a função. Esse arquivo também especifica que a função é um cliente que inicia o processo de orquestração. O arquivo deverá ser parecido com o seguinte exemplo:

    {
      "bindings": [
        {
          "authLevel": "function",
          "name": "req",
          "type": "httpTrigger",
          "direction": "in",
          "route": "orchestrators/{functionName}",
          "methods": [
            "post",
            "get"
          ]
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        },
        {
          "name": "starter",
          "type": "orchestrationClient",
          "direction": "in"
        }
      ]
    }
    

    Observação

    Uma associação associa recursos e outros itens a um gatilho. Trata-se de um mecanismo declarativo que remove a necessidade de incorporar ao seu código referências a outros serviços e funções.

Criar a função Orquestrador

  1. No menu do portal do Azure ou na Página Inicial, em Recursos recentes, selecione Ver tudo e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. Na página Visão geral, selecione a guia Funções no centro da tela.

  3. Na barra de menus do Functions, selecione Criar. O painel Criar função é exibido.

  4. Na guia Selecionar um modelo, na caixa Filtro, digite Orquestrador do Durable Functions e selecione esse modelo na lista. Esse modelo cria uma função durável que orquestra a execução de funções.

  5. Na guia Detalhes do modelo, para o campo Nova Função, digite OrchFunction como o nome da função e, a seguir, selecione Criar. O painel da função OrchFunction é exibido.

  6. No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua função.

    O código para o arquivo index.js é exibido no editor.

  7. Substitua o código existente pelo código a seguir.

    const df = require("durable-functions");
    
    module.exports = df.orchestrator(function* (context) {
        const outputs = [];
    
        /*
        * We will call the approval activity with a reject and an approved to simulate both
        */
    
        outputs.push(yield context.df.callActivity("Approval", "Approved"));
        outputs.push(yield context.df.callActivity("Approval", "Rejected"));
    
        return outputs;
    });
    

    Esse código chama uma função de Atividade denominada Aprovação, que você criará em breve. O código na função Orquestrador invoca a função Aprovação duas vezes. A primeira vez simula a aceitação da proposta e a segunda vez testa a lógica de rejeição da proposta.

    O valor retornado por cada chamada é combinado e transmitido de volta para a função cliente. Em um ambiente de produção, a função de orquestração chamará uma série de funções de atividade que tomam a decisão de aceitar/rejeitar e retornam o resultado dessas atividades.

  8. Na barra de menus superior, selecione Salvar para salvar sua nova função.

Criar a função Atividade

  1. No menu do portal do Azure ou na Página Inicial, em Recursos recentes, selecione Ver tudo e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. Na página Visão geral, selecione a guia Funções no centro da tela.

  3. Na barra de menus do Functions, selecione Criar. O painel Criar função é exibido.

  4. Na guia Selecionar um modelo, na caixa Filtro, digite Atividade do Durable Functions e selecione esse modelo na lista. Esse modelo cria uma função durável que é executada quando uma atividade é chamada por uma função de orquestrador.

  5. Na guia Detalhes do modelo, para o campo Nova Função, digite Aprovação para o nome da função e, a seguir, selecione Criar. O painel Aprovação é exibido para seu aplicativo de funções.

  6. No painel de menu esquerdo, em Desenvolvedor, selecione Código + Teste. O painel Código + Teste é exibido para sua função.

    O código para o arquivo index.js é exibido no editor.

  7. Substitua o código existente pelo código a seguir.

    module.exports = async function (context) {
        return `Your project design proposal has been -  ${context.bindings.name}!`;
    };
    

    Essa função retornará uma mensagem que indica o status da proposta. A expressão context.bindings.name é Accepted ou Rejected, dependendo do parâmetro passado do orquestrador para a função. Em um cenário do mundo real, você adicionaria a lógica que se encarrega das operações de aceitação ou rejeição nessa função.

  8. Na barra de menus superior, selecione Salvar para salvar sua nova função.

Verificar se o fluxo de trabalho das Durable Functions é iniciado

  1. No menu do portal do Azure ou na Página Inicial, em Recursos recentes, selecione Ver tudo e selecione seu aplicativo de funções. O painel Aplicativo de Funções é exibido.

  2. Selecione a guia Funções no centro da página.

  3. Selecione a função HttpStart. O painel HttpStart é exibido para sua função.

  4. Na barra de menus superior, selecione Obter URL da Função e copie a URL. A URL deverá ser parecida com o seguinte exemplo:

    https://example.azurewebsites.net/api/orchestrators/{functionName}?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    Você usará essa URL para executar suas funções.

  5. Abra uma janela do navegador e acesse a URL copiada. Na URL, substitua o espaço reservado {functionName} por OrchFunction, que deve ser semelhante ao seguinte exemplo:

    https://example.azurewebsites.net/api/orchestrators/OrchFunction?code=AbCdEfGhIjKlMnOpQrStUvWxYz==
    

    A mensagem de resposta contém um conjunto de pontos de extremidade de URI que você pode usar para monitorar e gerenciar a execução, que deverá ser semelhante ao seguinte exemplo:

    {
      "id": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "statusQueryGetUri": "https://example.azurewebsites.net/...",
      "sendEventPostUri": "https://example.azurewebsites.net/...",
      "terminatePostUri": "https://example.azurewebsites.net/...",
      "rewindPostUri": "https://example.azurewebsites.net/...",
      "purgeHistoryDeleteUri": "https://example.azurewebsites.net/..."
    }
    
  6. Copie o valor statusQueryGetUri, depois use um navegador da Web para acessar essa URL. Você deverá ver uma mensagem de resposta semelhante ao seguinte exemplo:

    {
      "name": "OrchFunction",
      "instanceId": "f0e1d2c3b4a5968778695a4b3c2d1e0f",
      "runtimeStatus": "Completed",
      "input": null,
      "customStatus": null,
      "output": [
        "Your project design proposal has been -  Approved!",
        "Your project design proposal has been -  Rejected!"
      ],
      "createdTime": "2019-04-16T15:23:03Z",
      "lastUpdatedTime": "2019-04-16T15:23:35Z"
    }
    

    Lembre-se de que a função de orquestração executa a função Atividade duas vezes. Na primeira vez, a função de atividade indica que a proposta de projeto foi aceita. Na segunda vez, a proposta é rejeitada. A função de orquestração combina as mensagens de ambas as chamadas de função e as retorna para a função cliente.