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
- A CLI do Azure instalada em seu próprio computador.
- Uma conta do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.
- Java JDK 17 com
JAVA_HOME
configurado adequadamente. Este artigo foi escrito com o Java 17 em mente, mas o Azure Functions e o Quarkus também suportam versões mais antigas do Java. - Apache Maven 3.8.1+.
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.
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>
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.
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 umgreeting()
método. O método retorna umaWelcome...
mensagem de cadeia de caracteres com umname
parâmetro.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 ogreeting
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.
Aceda à nova
greeting
função utilizando ocurl
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
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" } } ]
Crie e implante as funções no Azure.
O arquivo pom.xml que você gerou na etapa anterior usa
azure-functions-maven-plugin
o . A execuçãomvn install
gera arquivos de configuração e um diretório de preparo queazure-functions-maven-plugin
exige. ParayourResourceGroupName
, use o valor que você usou anteriormente.mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
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.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.
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
.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 .
Confirme se a página de boas-vindas diz que seu aplicativo de função está "ativo e funcionando".
Invoque a
greeting
função usando o seguintecurl
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 seguintecurl
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.
Agora que você abriu sua função do Azure no portal, aqui estão mais recursos que você pode acessar a partir do portal:
- Monitore o desempenho de sua função do Azure. Para obter mais informações, veja Monitorizar as Funções do Azure.
- Explore a telemetria. Para obter mais informações, consulte Analisar telemetria do Azure Functions no Application Insights.
- Configure o registo. Para obter mais informações, consulte Habilitar logs de execução de streaming no Azure Functions.
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: