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

Concluído

Nessa unidade, 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. Selecione Consumo e, em seguida, selecione o botão Selecionar. 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

    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. Esses comandos podem levar alguns minutos para serem concluídos e o gerenciador de pacotes de nós poderá mostrar alguns avisos, que você pode ignorar.

    Observação

    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.