Dela via


Distribuera ett Java-program med Quarkus i en Azure Container Apps

Den här artikeln visar hur du snabbt distribuerar Red Hat Quarkus på Microsoft Azure Container Apps med ett enkelt CRUD-program. Programmet är en "att göra-lista" med en JavaScript-klientdel och en REST-slutpunkt. Azure Database for PostgreSQL – flexibel server tillhandahåller beständighetsskiktet för appen. Artikeln visar hur du testar din app lokalt och distribuerar den till Container Apps.

Förutsättningar

  • En Azure-prenumeration. Om du inte har en Azure-prenumeration kan du skapa ettkostnadsfritt konto innan du börjar.
  • Förbered en lokal dator med Unix-liknande operativsystem installerat , till exempel Ubuntu, macOS eller Windows podsistem za Linux.
  • Installera en Java SE-implementeringsversion 17 eller senare – till exempel Microsoft-version av OpenJDK.
  • Installera Maven, version 3.9.8 eller senare.
  • Installera Docker eller Podman för operativsystemet.
  • Installera jq.
  • Installera cURL.
  • Installera Quarkus CLI, version 3.12.1 eller senare.
  • Azure CLI för Unix-liknande miljöer. Den här artikeln kräver endast Bash-varianten av Azure CLI.
    • Installera Azure CLI och logga in interaktivt med kommandot az login för att logga in på Azure innan du använder DefaultAzureCredential kod.
      az login
      
    • Den här artikeln kräver minst version 2.61.0 av Azure CLI.

Skapa appprojektet

Använd följande kommando för att klona Java-exempelprojektet för den här artikeln. Exemplet finns på GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2024-07-08
cd aca-quarkus

Om du ser ett meddelande om att vara i frånkopplat HEAD-tillstånd är det här meddelandet säkert att ignorera. Eftersom den här artikeln inte kräver några incheckningar är frånkopplat HEAD-tillstånd lämpligt.

Testa Din Quarkus-app lokalt

Stegen i det här avsnittet visar hur du kör appen lokalt.

Quarkus stöder automatisk etablering av okonfigurerade tjänster i utvecklings- och testläge. Quarkus refererar till den här funktionen som dev-tjänster. Anta att du inkluderar en Quarkus-funktion, till exempel att ansluta till en databastjänst. Du vill testa appen, men har ännu inte konfigurerat anslutningen till en riktig databas. Quarkus startar automatiskt en stub-version av den relevanta tjänsten och ansluter ditt program till den. Mer information finns i Översikt över Dev Services i Quarkus-dokumentationen.

Kontrollera att containermiljön, Docker eller Podman, körs och använd följande kommando för att ange Quarkus dev-läge:

quarkus dev

I stället quarkus devför kan du utföra samma sak med Maven med hjälp mvn quarkus:devav .

Du kan tillfrågas om du vill skicka telemetri för din användning av Quarkus dev-läge. I så fall svarar du som du vill.

Quarkus dev mode aktiverar live-inläsning med bakgrundskompilering. Om du ändrar någon aspekt av appens källkod och uppdaterar webbläsaren kan du se ändringarna. Om det finns problem med kompilering eller distribution kan du få en felsida. Quarkus dev mode lyssnar efter ett felsökningsprogram på port 5005. Om du vill vänta tills felsökningsprogrammet ska kopplas innan du kör, skickar -Dsuspend du på kommandoraden. Om du inte vill ha felsökningsprogrammet alls kan du använda -Ddebug=false.

Utdata bör se ut som i följande exempel:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO  [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aca 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 14.826s. 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: [agroal, cdi, hibernate-orm, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]

--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>

Tryck på w på terminalen där Quarkus dev mode körs. W-nyckeln öppnar standardwebbläsaren Todo för att visa programmet. Du kan också komma åt programmets GUI http://localhost:8080 direkt.

Skärmbild av Todo-exempelappen.

Prova att välja några att göra-objekt i att göra-listan. Användargränssnittet anger markering med en genomstrukningstextformat. Du kan också lägga till ett nytt att göra-objekt i att göra-listan genom att skriva Verifiera Todo-appar och trycka på RETUR, som du ser på följande skärmbild:

Skärmbild av Todo-exempelappen med nya objekt tillagda.

Få åtkomst till RESTful API (/api) för att hämta alla att göra-objekt som lagras i den lokala PostgreSQL-databasen:

curl --verbose http://localhost:8080/api | jq .

Utdata bör se ut som i följande exempel:

* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 664
< Content-Type: application/json;charset=UTF-8
<
{ [664 bytes data]
100   664  100   664    0     0  13278      0 --:--:-- --:--:-- --:--:-- 15441
* Connection #0 to host localhost left intact
[
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": false,
    "order": 0,
    "url": null
  },
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Verify Todo apps",
    "completed": false,
    "order": 5,
    "url": null
  }
]

Tryck på q för att avsluta Quarkus utvecklingsläge.

Skapa Azure-resurserna för att köra Quarkus-appen

Stegen i det här avsnittet visar hur du skapar följande Azure-resurser för att köra Quarkus-exempelappen:

  • Flexibel Server för Azure Database for PostgreSQL
  • Azure Container Registry
  • Azure Container Apps

Vissa av dessa resurser måste ha unika namn inom azure-prenumerationens omfång. För att säkerställa den här unikheten kan du använda mönstret initialer, sekvens, datum och suffix . Om du vill använda det här mönstret namnger du dina resurser genom att ange dina initialer, ett visst sekvensnummer, dagens datum och någon form av resursspecifikt suffix , till exempel rg för "resursgrupp". Följande miljövariabler använder det här mönstret. Ersätt platshållarvärdena i UNIQUE_VALUEoch DB_PASSWORD LOCATION med dina egna värden och kör kommandona i terminalen.

export UNIQUE_VALUE=<your unique value, such as ejb091223>
export RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg
export LOCATION=<your desired Azure region for deploying your resources - for example, eastus>
export REGISTRY_NAME=${UNIQUE_VALUE}reg
export DB_SERVER_NAME=${UNIQUE_VALUE}db
export DB_NAME=demodb
export DB_ADMIN=demouser
export DB_PASSWORD='<your desired password for the database server - for example, Secret123456>'
export ACA_ENV=${UNIQUE_VALUE}env
export ACA_NAME=${UNIQUE_VALUE}aca

Skapa en flexibel Azure Database for PostgreSQL-server

Azure Database for PostgreSQL – flexibel server är en fullständigt hanterad databastjänst som är utformad för att ge mer detaljerad kontroll och flexibilitet över databashanteringsfunktioner och konfigurationsinställningar. Det här avsnittet visar hur du skapar en Azure Database for PostgreSQL – flexibel serverinstans med hjälp av Azure CLI. Mer information finns i Snabbstart: Skapa en Azure Database for PostgreSQL – flexibel serverinstans med Azure CLI.

Skapa först en resursgrupp som ska innehålla databasservern och andra resurser med hjälp av följande kommando:

az group create \
    --name $RESOURCE_GROUP_NAME \
    --location $LOCATION

Skapa sedan en flexibel Azure Database for PostgreSQL-serverinstans med hjälp av följande kommando:

az postgres flexible-server create \
    --name $DB_SERVER_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --admin-user $DB_ADMIN \
    --admin-password $DB_PASSWORD \
    --database-name $DB_NAME \
    --public-access 0.0.0.0 \
    --yes

Det tar några minuter att skapa regler för server, databas, administratör och brandvägg. Om kommandot lyckas ser utdata ut ungefär som i följande exempel:

{
  "connectionString": "postgresql://<DB_ADMIN>:<DB_PASSWORD>@<DB_SERVER_NAME>.postgres.database.azure.com/<DB_NAME>?sslmode=require",
  "databaseName": "<DB_NAME>",
  "firewallName": "AllowAllAzureServicesAndResourcesWithinAzureIps_2024-7-5_14-39-45",
  "host": "<DB_SERVER_NAME>.postgres.database.azure.com",
  "id": "/subscriptions/REDACTED/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.DBforPostgreSQL/flexibleServers/<DB_SERVER_NAME>",
  "location": "East US",
  "password": "<DB_PASSWORD>",
  "resourceGroup": "<RESOURCE_GROUP_NAME>",
  "skuname": "Standard_D2s_v3",
  "username": "<DB_ADMIN>",
  "version": "13"
}

Skapa en Microsoft Azure Container Registry-instans

Eftersom Quarkus är en molnbaserad teknik har den inbyggt stöd för att skapa containrar som körs i Container Apps. Container Apps är helt beroende av att ha ett containerregister som containeravbildningarna ska köras från. Container Apps har inbyggt stöd för Azure Container Registry.

Använd kommandot az acr create för att skapa Container Registry-instansen. I följande exempel skapas n Container Registry-instans med namnet med värdet för miljövariabeln ${REGISTRY_NAME}:

az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location ${LOCATION} \
    --name $REGISTRY_NAME \
    --sku Basic \
    --admin-enabled

Efter en kort tid bör du se JSON-utdata som innehåller följande rader:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "<YOUR_RESOURCE_GROUP>",

Ansluta docker till Container Registry-instansen

Logga in på Container Registry-instansen. När du loggar in kan du push-överföra en bild. Använd följande kommandon för att verifiera anslutningen:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
echo $LOGIN_SERVER
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'username' \
    --output tsv)
echo $USER_NAME
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'passwords[0].value' \
    --output tsv)
echo $PASSWORD
docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

Om du använder Podman i stället för Docker gör du nödvändiga ändringar i kommandot.

Om du har loggat in på Container Registry-instansen bör du se Login Succeeded i slutet av kommandoutdata.

Skapa en miljö

En miljö i Azure Container Apps skapar en säker gräns runt en grupp med containerappar. Container Apps som distribueras till samma miljö distribueras i samma virtuella nätverk och skriver loggar till samma Log Analytics-arbetsyta. Använd kommandot az containerapp env create för att skapa en miljö, som du ser i följande exempel:

az containerapp env create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --name $ACA_ENV

Om du uppmanas att installera ett tillägg svarar du Y.

Anpassa den inbyggda molnkonfigurationen

Som molnbaserad teknik erbjuder Quarkus möjligheten att automatiskt generera containeravbildningar. Mer information finns i Containeravbildningar. Utvecklare kan sedan distribuera programavbildningen till en containerbaserad målplattform , till exempel Azure Container Apps.

Om du vill generera containeravbildningen använder du följande kommando för att lägga container-image-jib till tillägget i den lokala terminalen:

quarkus ext add container-image-jib

Quarkus ändrar POM för att säkerställa att tillägget ingår i <dependencies>. Om du uppmanas att installera något som heter JBangsvarar du ja och tillåter att det installeras.

Utdata bör se ut som i följande exempel:

[SUCCESS] ✅  Extension io.quarkus:quarkus-container-image-jib has been installed

Om du vill kontrollera att tilläggen har lagts till kan du köra git diff och undersöka utdata.

Som molnbaserad teknik stöder Quarkus begreppet konfigurationsprofiler. Quarkus har följande tre inbyggda profiler:

  • dev – Aktiverad i utvecklingsläge.
  • test – Aktiverad vid körning av tester.
  • prod – Standardprofilen när den inte körs i utvecklings- eller testläge.

Quarkus stöder valfritt antal namngivna profiler efter behov.

De återstående stegen i det här avsnittet leder dig till att ta bort kommentarer och anpassa värden i filen src/main/resources/application.properties . Se till att alla rader som börjar med # %prod. inte är inkommenterade genom att ta bort inledande #.

Prefixet %prod. anger att dessa egenskaper är aktiva när de körs i profilen prod . Mer information om konfigurationsprofiler finns i Quarkus-dokumentationen.

Granska databaskonfigurationen

Lägg till följande databaskonfigurationsvariabler. Databasanslutningsrelaterade egenskaper %prod.quarkus.datasource.jdbc.url, %prod.quarkus.datasource.usernameoch %prod.quarkus.datasource.password lämnas avsiktligt tomma eftersom de tillhandahålls vid körning av Azure Container Apps-miljön av säkerhetsskäl.

# Database configurations
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.jdbc.driver=org.postgresql.Driver
%prod.quarkus.datasource.jdbc.url=
%prod.quarkus.datasource.username=
%prod.quarkus.datasource.password=
%prod.quarkus.hibernate-orm.database.generation=create
%prod.quarkus.hibernate-orm.sql-load-script=no-file

I allmänhet förväntar du dig inte att data som sparas i databasen tas bort och fylls i igen med exempeldata i en produktionsmiljö. Därför kan du se att schemat för quarkus.hibernate-orm.database.generation anges så create att appen bara skapar schemat när det inte finns vid den första starten. Dessutom är databasen inte ifylld i förväg med några exempeldata eftersom hibernate-orm.sql-load-script den har angetts som no-file. Den här inställningen skiljer sig från när du körde appen lokalt i utvecklingsläge tidigare. Standardvärdena i utvecklingsläge för quarkus.hibernate-orm.database.generation respektive hibernate-orm.sql-load-script import.sql ärdrop-and-create, vilket innebär att appen alltid släpper och återskapar databasschemat och läser in de data som definierats i import.sql. Filen import.sql är en bekvämlighetsanläggning från Quarkus. Om filen src/main/resources/import.sql finns i Quarkus jar och värdet hibernate-orm.sql-load-script för egenskapen är import.sql, körs SQL DML-uttrycken i den här filen vid starttiden för appen.

Anpassa containeravbildningskonfigurationen

Som molnbaserad teknik stöder Quarkus generering av OCI-containeravbildningar som är kompatibla med Docker och Podman. Lägg till följande containeravbildningsvariabler. Ersätt värdena <LOGIN_SERVER_VALUE> för och <USER_NAME_VALUE> med värdena för de faktiska värdena för ${LOGIN_SERVER} miljövariablerna respektive miljövariablerna ${USER_NAME} .

# Container Image Build
%prod.quarkus.container-image.build=true
%prod.quarkus.container-image.registry=<LOGIN_SERVER_VALUE>
%prod.quarkus.container-image.group=<USER_NAME_VALUE>
%prod.quarkus.container-image.name=todo-quarkus-aca
%prod.quarkus.container-image.tag=1.0

Skapa containeravbildningen och push-överför den till Container Registry

Använd nu följande kommando för att skapa själva programmet. Det här kommandot använder Jib-tillägget för att skapa containeravbildningen.

quarkus build --no-tests

Utdata ska sluta med BUILD SUCCESS.

Du kan kontrollera om containeravbildningen också genereras med hjälp av kommandoraden docker eller podman (CLI). Utdata ser ut ungefär som i följande exempel:

docker images | grep todo-quarkus-aca
<LOGIN_SERVER_VALUE>/<USER_NAME_VALUE>/todo-quarkus-aca   1.0       0804dfd834fd   2 minutes ago   407MB

Skicka containeravbildningarna till Container Registry med hjälp av följande kommando:

export TODO_QUARKUS_TAG=$(docker images | grep todo-quarkus-aca | head -n1 | cut -d " " -f1):1.0
echo ${TODO_QUARKUS_TAG}
docker push ${TODO_QUARKUS_TAG}

Utdata bör se ut ungefär som följande exempel:

The push refers to repository [<LOGIN_SERVER_VALUE>/<USER_NAME_VALUE>/todo-quarkus-aca]
188a550fce3d: Pushed
4e3afea591e2: Pushed
1db0eba807a6: Pushed
c72d9ccda0b2: Pushed
d7819b8a2d18: Pushed
d0e5cba6b262: Pushed
e0bac91f0f10: Pushed
1.0: digest: sha256:f9ccb476e2388efa0dfdf817625a94f2247674148a69b7e4846793e63c8be994 size: 1789

Nu när du har push-överfört appavbildningen till Container Registry använder du följande kommando för att skapa en Container Apps-instans för att köra appen när du har hämtat avbildningen från Container Registry:

export DATASOURCE_JDBC_URL=jdbc:postgresql://${DB_SERVER_NAME}.postgres.database.azure.com:5432/${DB_NAME}?sslmode=require
az containerapp create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --image $TODO_QUARKUS_TAG \
    --environment $ACA_ENV \
    --registry-server $LOGIN_SERVER \
    --registry-username $USER_NAME \
    --registry-password $PASSWORD \
    --target-port 8080 \
    --secrets \
        jdbcurl=${DATASOURCE_JDBC_URL} \
        dbusername=${DB_ADMIN} \
        dbpassword=${DB_PASSWORD} \
    --env-vars \
        QUARKUS_DATASOURCE_JDBC_URL=secretref:jdbcurl \
        QUARKUS_DATASOURCE_USERNAME=secretref:dbusername \
        QUARKUS_DATASOURCE_PASSWORD=secretref:dbpassword \
    --ingress 'external'

Alternativet --secrets används för att skapa hemligheter som refereras till av databasanslutningsrelaterade miljövariabler QUARKUS_DATASOURCE_JDBC_URLoch QUARKUS_DATASOURCE_USERNAME QUARKUS_DATASOURCE_PASSWORD. Värdena för dessa miljövariabler skickas till egenskaperna %prod.quarkus.datasource.password, %prod.quarkus.datasource.username och %prod.quarkus.datasource.password. Quarkus vet att söka efter värden från motsvarande miljövariabler om det inte finns något värde i application.properties filen.

Lyckade utdata är ett JSON-objekt inklusive egenskapen "type": "Microsoft.App/containerApps".

Hämta en fullständigt kvalificerad URL för att få åtkomst till Todo-programmet med hjälp av följande kommando:

export QUARKUS_URL=https://$(az containerapp show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $ACA_NAME \
    --query properties.configuration.ingress.fqdn -o tsv)
echo $QUARKUS_URL

Öppna en ny webbläsare till värdet ${QUARKUS_URL}. Lägg sedan till ett nytt att göra-objekt med texten Deployed the Todo app to Container Apps. Markera det här objektet för att markera det som slutfört.

Skärmbild av todo-exempelappen som körs i Container Apps.

Få åtkomst till RESTful API (/api) för att hämta alla att göra-objekt som lagras i Azure Database for PostgreSQL, som du ser i följande exempel:

curl --verbose -k ${QUARKUS_URL}/api | jq .

Utdata bör se ut som i följande exempel:

* Connected to <aca-name>.<random-id>.eastus.azurecontainerapps.io (20.231.235.79) port 443 (#0)
> GET /api HTTP/2
> Host: <aca-name>.<random-id>.eastus.azurecontainerapps.io
> user-agent: curl/7.88.1
> accept: */*
>
< HTTP/2 200
< content-length: 88
< content-type: application/json;charset=UTF-8
<
[
  {
    "id": 1,
    "title": "Deployed the Todo app to Container Apps",
    "completed": true,
    "order": 1,
    "url": null
  }
]

Kontrollera att databasen har uppdaterats med hjälp av Azure Cloud Shell

Öppna Azure Cloud Shell i Azure-portalen genom att välja Cloud Shell-ikonen ( ) bredvid sökrutan.

Kör följande kommando lokalt och klistra in resultatet i Azure Cloud Shell:

echo psql --host=${DB_SERVER_NAME}.postgres.database.azure.com --port=5432 --username=${DB_ADMIN} --dbname=${DB_NAME}

När du tillfrågas om lösenordet använder du det värde som du använde när du skapade databasen.

Använd följande fråga för att hämta alla att göra-objekt:

select * from todo;

Utdata bör se ut ungefär som i följande exempel och bör innehålla samma objekt i användargränssnittet för Todo-appen som visades tidigare:

Skärmbild av frågans utdata som en ASCII-tabell.

Ange \q för att avsluta programmet psql och återgå till Cloud Shell.

Rensa resurser

För att undvika Azure-avgifter bör du rensa onödiga resurser. När klustret inte längre behövs använder du kommandot az group delete för att ta bort resursgruppen, containertjänsten, containerregistret och alla relaterade resurser.

git reset --hard
docker rmi ${TODO_QUARKUS_TAG}
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Du kanske också vill använda docker rmi för att ta bort containeravbildningarna postgres och testcontainers som genereras av Quarkus utvecklingsläge.

Nästa steg