Implantar aplicativos Java sem servidor com o Quarkus no Azure Functions

Neste artigo, você desenvolverá, compilará e implantará um aplicativo Java sem servidor no Azure Functions usando o Quarkus. Este artigo usa o Quarkus Funqy e seu suporte interno para o gatilho HTTP do Azure Functions para Java. Usar o Quarkus com o Azure Functions oferece o potencial do modelo de programação do Quarkus com a escala e a flexibilidade do Azure Functions. Ao concluir, você executará aplicativos Quarkus sem servidor no Azure Functions e continuará monitorando seu aplicativo no Azure.

Pré-requisitos

Criar o projeto de aplicativo

Use o comando a seguir para clonar o projeto Java de exemplo para este artigo. O exemplo está no GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-01-10
cd functions-quarkus

Se você vir uma mensagem sobre estar no estado HEAD desanexado, essa mensagem pode ser ignorada com segurança. Como este artigo não exige nenhum commit, o estado HEAD desanexado é apropriado.

Explore a função de exemplo. Abra o arquivo functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java.

Execute o comando a seguir. A anotação @Funq torna seu método (neste caso, funqyHello) uma função sem servidor.

@Funq
public String funqyHello() {
    return "hello funqy";
}

O Java do Azure Functions tem seu próprio conjunto de anotações específicas do Azure, mas essas anotações não são necessárias quando você está usando o Quarkus no Azure Functions em uma capacidade simples como estamos fazendo aqui. Para obter mais informações sobre as anotações do Java do Azure Functions, confira o guia do desenvolvedor de Java do Azure Functions.

A menos que você especifique o contrário, o nome da função é o mesmo que o nome do método. Você também pode usar o seguinte comando para definir o nome da função com um parâmetro para a anotação:

@Funq("alternateName")
public String funqyHello() {
    return "hello funqy";
}

O nome é importante. Ele se torna uma parte do URI REST para invocar a função, conforme mostrado posteriormente no artigo.

Testar a função localmente

Use mvn para executar o modo de desenvolvimento do Quarkus no terminal local. Executar o Quarkus dessa forma permite a recarga dinâmica com a compilação em segundo plano. Quando você modificar seus arquivos Java e/ou seus arquivos de recurso e atualizar o navegador, essas alterações entrarão em vigor automaticamente.

Uma atualização do navegador dispara uma verificação do workspace. Se a verificação detectar alterações, os arquivos Java serão recompilados e o aplicativo será reimplantado. Seu aplicativo reimplantado atende à solicitação. Se houver algum problema com a compilação ou implantação, uma página de erro informará você.

No procedimento a seguir, substitua yourResourceGroupName por um nome de grupo de recursos. Os nomes de aplicativos de funções devem ser exclusivos globalmente em todo o Azure. Os nomes de grupo de recursos devem ser exclusivos globalmente em uma assinatura. Este artigo obtém a exclusividade necessária ao acrescentar o nome do grupo de recursos ao nome da função. Adicione um identificador exclusivo aos nomes que você criar que devem ser exclusivos. Uma técnica útil é usar suas iniciais seguidas da data de hoje no formato mmdd.

O grupo de recursos não é necessário para essa parte das instruções, mas será necessário posteriormente. Para simplificar, o projeto Maven exige que você defina a propriedade.

  1. Invoque o modo de desenvolvimento do Quarkus:

    cd functions-azure
    mvn -DskipTests -DresourceGroup=<yourResourceGroupName> quarkus:dev
    

    O resultado deve ser assim:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    INFO  [io.quarkus] (Quarkus Main Thread) quarkus-azure-function 1.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 1.290s. Listening on: http://localhost:8080
    
    INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
    INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, smallrye-context-propagation, vertx]
    
    --
    Tests paused
    Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
    
  2. Acesse a função usando o comando CURL no terminal local:

    curl localhost:8080/api/funqyHello
    

    O resultado deve ser assim:

    "hello funqy"
    

Adicionar injeção de dependência à função

A tecnologia de padrão aberto Jakarta EE CDI (Contexts and Dependency Injection) fornece injeção de dependência no Quarkus. Para obter uma visão geral de alto nível da injeção em geral e CDI especificamente, confira o tutorial do Jakarta EE.

  1. Adicione uma nova função que usa injeção de dependência.

    Crie um arquivo GreetingService.java no diretório functions-quarkus/src/main/java/io/quarkus. Use o seguinte código como o código-fonte do arquivo:

    package io.quarkus;
    
    import javax.enterprise.context.ApplicationScoped;
    
    @ApplicationScoped
    public class GreetingService {
    
        public String greeting(String name) {
            return "Welcome to build Serverless Java with Quarkus on Azure Functions, " + name;
        }
    
    }
    

    Salve o arquivo.

    GreetingService é um bean injetável que implementa um método greeting(). O método retorna uma mensagem de cadeia de caracteres Welcome... com um parâmetro name.

  2. Abra o arquivo functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java existente. Substitua a classe pelo seguinte código para adicionar um novo campo gService e o método greeting:

    package io.quarkus;
    
    import javax.inject.Inject;
    import io.quarkus.funqy.Funq;
    
    public class GreetingFunction {
    
        @Inject
        GreetingService gService;
    
        @Funq
        public String greeting(String name) {
            return gService.greeting(name);
        }
    
        @Funq
        public String funqyHello() {
            return "hello funqy";
        }
    
    }
    

    Salve o arquivo.

  3. Acesse a nova função greeting usando o comando curl no terminal local:

    curl -d '"Dan"' -X POST localhost:8080/api/greeting
    

    O resultado deve ser assim:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan"
    

    Importante

    A codificação dinâmica (também chamada de modo de desenvolvimento) permite que você execute o aplicativo e faça alterações em tempo real. O Quarkus recompilará e recarregará automaticamente o aplicativo, quando forem feitas alterações. Esse é um estilo eficaz e eficiente de desenvolvimento que você usará ao longo deste artigo.

    Antes de avançar para a próxima etapa, interrompa o modo de desenvolvimento do Quarkus selecionando Ctrl+C.

Implantar o aplicativo no Azure

  1. Se você ainda não o fez, entre na sua assinatura do Azure usando o seguinte comando az login e siga as instruções na tela:

    az login
    

    Observação

    Se vários locatários do Azure estiverem associados às suas credenciais do Azure, você deverá especificar em qual locatário deseja entrar. Você pode fazer isso usando a opção --tenant. Por exemplo: az login --tenant contoso.onmicrosoft.com.

    Continue o processo no navegador da Web. Se nenhum navegador da Web estiver disponível ou se não for possível abrir o navegador da Web, use o fluxo de código do dispositivo com az login --use-device-code.

    Depois que você entrar com êxito, a saída no terminal local deverá ser semelhante à seguinte:

    xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxx 'Microsoft'
    [
        {
            "cloudName": "AzureCloud",
            "homeTenantId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
            "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx",
            "isDefault": true,
            "managedByTenants": [],
            "name": "Contoso account services",
            "state": "Enabled",
            "tenantId": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx",
            "user": {
            "name": "user@contoso.com",
            "type": "user"
            }
        }
    ]
    
  2. Crie e implante as funções no Azure.

    O arquivo pom.xml gerado na etapa anterior usa azure-functions-maven-plugin. Executar mvn install gera arquivos de configuração e um diretório de preparo que o azure-functions-maven-plugin requer. Para yourResourceGroupName, use o valor que você usou anteriormente.

    mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
    
  3. Durante a implantação, entre no Azure. O plug-in azure-functions-maven-plugin é configurado para solicitar a entrada do Azure sempre que o projeto for implantado. Durante o build, uma saída semelhante à seguinte será exibida:

    [INFO] Auth type: DEVICE_CODE
    To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AXCWTLGMP to authenticate.
    

    Faça o que a saída indica e autentique-se no Azure usando o navegador e o código do dispositivo fornecido. Há muitas outras opções de autenticação e configuração disponíveis. A documentação de referência completa para azure-functions-maven-plugin está disponível em Azure Functions: Detalhes da Configuração.

  4. Após a autenticação, o build deve continuar e concluir. Verifique se a saída inclui BUILD SUCCESS próximo ao final.

    Successfully deployed the artifact to https://quarkus-demo-123451234.azurewebsites.net
    

    Você também pode encontrar a URL para disparar sua função no Azure no log de saída:

    [INFO] HTTP Trigger Urls:
    [INFO] 	 quarkus : https://quarkus-azure-functions-http-archetype-20220629204040017.azurewebsites.net/api/{*path}
    

    Levará um tempo para que a implantação seja concluída. Enquanto isso, vamos explorar o Azure Functions no portal do Azure.

Acessar e monitorar a função sem servidor no Azure

Entre no portal e verifique se você selecionou o mesmo locatário e assinatura que usou na CLI do Azure.

  1. Digite aplicativo de funções na barra de pesquisa na parte superior do portal do Azure e selecione a tecla Enter. Seu aplicativo de funções deve estar implantado e aparecerá com o nome <yourResourceGroupName>-function-quarkus.

    Screenshot that shows the function app in the portal.

  2. Selecione o aplicativo de funções para mostrar informações detalhadas, como Localização, Assinatura, URL, Métricas e Plano do Serviço de Aplicativo. Em seguida, selecione o valor da URL.

    Screenshot that shows a URL and other function app details.

  3. Confirme se a página de boas-vindas indica que seu aplicativo de funções está "em pleno funcionamento".

    Screenshot that shows the welcome page for a function app.

  4. Invoque a função greeting usando o seguinte comando curl no terminal local.

    Importante

    Substitua YOUR_HTTP_TRIGGER_URL por sua própria URL de função que você encontra no portal do Azure ou na saída.

    curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting
    

    O resultado deve ser semelhante ao seguinte:

    "Welcome to build Serverless Java with Quarkus on Azure Functions, Dan on Azure"
    

    Você também pode acessar a outra função (funqyHello) usando o seguinte comando curl:

    curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
    

    A saída deve ser a mesma que você observou anteriormente:

    "hello funqy"
    

    Se você quiser exercer a funcionalidade de métricas básicas no portal do Azure, tente invocar a função em um loop for do shell:

    for i in {1..100}; do curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting; done
    

    Depois de um tempo, você verá alguns dados de métricas no portal.

    Screenshot that shows function metrics in the portal.

Agora que você abriu sua função do Azure no portal, veja abaixo mais recursos que você pode acessar no portal:

Limpar recursos

Caso não precise desses recursos, você pode exclui-los executando o seguinte comando no Cloud Shell ou no seu terminal local:

az group delete --name <yourResourceGroupName> --yes

Próximas etapas

Neste artigo, você aprendeu a:

  • Execute o modo de desenvolvimento do Quarkus.
  • Implante um aplicativo Funqy nas funções do Azure usando azure-functions-maven-plugin.
  • Examine o desempenho da função no portal.

Para saber mais sobre o Azure Functions e o Quarkus, confira os seguintes artigos e referências: