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 poder do modelo de programação do Quarkus com a escala e a flexibilidade do Azure Functions. Quando terminar, 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 é segura para ignorar. Uma vez que este artigo não requer quaisquer compromissos, o estado HEAD destacado é apropriado.

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

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

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

O Azure Functions Java 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 anotações Java do Azure Functions, consulte o Guia do desenvolvedor 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 parte do URI REST para invocar a função, conforme mostrado mais adiante no artigo.

Testar localmente a função

Use mvn para executar o modo de desenvolvimento do Quarkus no seu terminal local. Executar o Quarkus desta forma permite a recarga ao vivo com compilação em segundo plano. Quando você modifica seus arquivos Java e/ou seus arquivos de recursos e atualiza seu navegador, essas alterações entrarão em vigor automaticamente.

Uma atualização do navegador aciona uma verificação do espaço de trabalho. Se a verificação detetar 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ção devem ser globalmente exclusivos em todo o Azure. Os nomes de grupos de recursos devem ser globalmente exclusivos dentro de uma assinatura. Este artigo alcança a exclusividade necessária ao antecipar o nome do grupo de recursos ao nome da função. Considere a possibilidade de antecipar um identificador exclusivo para quaisquer nomes criados que devam ser exclusivos. Uma técnica útil é usar suas iniciais seguidas da data de hoje no mmdd formato.

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

  1. Invoque o modo de desenvolvimento do Quarkus:

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

    A saída deverá ter o seguinte aspeto:

    ...
    --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
    -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
    --\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
    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. Aceda à função utilizando o CURL comando no seu terminal local:

    curl localhost:8080/api/funqyHello
    

    A saída deverá ter o seguinte aspeto:

    "hello funqy"
    

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

A tecnologia de padrão aberto Jakarta EE Contexts and Dependency Injection (CDI) fornece injeção de dependência no Quarkus. Para obter uma visão geral de alto nível da injeção em geral, e do CDI especificamente, consulte 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;
        }
    
    }
    

    Guarde o ficheiro.

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

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

    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";
        }
    
    }
    

    Guarde o ficheiro.

  3. Aceda à nova greeting função utilizando o curl comando no seu terminal local:

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

    A saída deverá ter o seguinte aspeto:

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

    Importante

    Live Coding (também chamado de modo de desenvolvimento) permite que você execute o aplicativo e faça alterações na hora. O Quarkus recompilará e recarregará automaticamente o aplicativo quando forem feitas alterações. Este é um estilo poderoso e eficiente de desenvolvimento que você usará ao longo deste artigo.

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

Implementar a aplicação no Azure

  1. Se ainda não o fez, inicie sessão na sua subscrição do Azure utilizando o seguinte comando az login e siga as instruções no ecrã:

    az login
    

    Nota

    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 --tenant opção. 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 o navegador da Web não abrir, use o fluxo de código do dispositivo com az login --use-device-code.

    Depois de iniciar sessão com êxito, a saída no terminal local deve 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 que você gerou na etapa anterior usa azure-functions-maven-plugino . A execução mvn install gera arquivos de configuração e um diretório de preparo que azure-functions-maven-plugin exige. 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 azure-functions-maven-plugin plug-in é configurado para solicitar a entrada do Azure sempre que o projeto for implantado. Durante a compilação, uma saída semelhante à seguinte aparece:

    [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 como a saída diz e autentique-se no Azure usando o navegador e o código do dispositivo fornecido. Muitas outras opções de autenticação e configuração estão disponíveis. A documentação de referência completa para azure-functions-maven-plugin está disponível em Azure Functions: Detalhes de Configuração.

  4. Após a autenticação, a compilação deve continuar e terminar. Certifique-se de que a saída inclui BUILD SUCCESS perto do fim.

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

    Você também pode encontrar a URL para acionar 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á algum 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 a mesma assinatura que usou na CLI do Azure.

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

    Captura de tela que mostra o aplicativo de função no portal.

  2. Selecione o aplicativo de função 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 .

    Captura de ecrã que mostra um URL e outros detalhes da aplicação funcional.

  3. Confirme se a página de boas-vindas diz que seu aplicativo de função está "ativo e funcionando".

    Captura de tela que mostra a página de boas-vindas de um aplicativo funcional.

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

    Importante

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

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

    O resultado deve ser algo 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 curl comando:

    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 o recurso de métricas básicas no portal do Azure, tente invocar a função dentro de um loop de shell for :

    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.

    Captura de tela que mostra métricas de função no portal.

Agora que você abriu sua função do Azure no portal, aqui estão mais recursos que você pode acessar a partir do portal:

Clean up resources (Limpar recursos)

Se você não precisar desses recursos, poderá excluí-los executando o seguinte comando:

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

Próximos passos

Neste artigo, você aprendeu como:

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

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