Sdílet prostřednictvím


Nasazení aplikace v Javě pomocí Quarkus v Azure Container Apps

V tomto článku se dozvíte, jak rychle nasadit Red Hat Quarkus v Microsoft Azure Container Apps pomocí jednoduché aplikace CRUD. Aplikace je seznam úkolů s front-endem JavaScriptu a koncovým bodem REST. Flexibilní server Azure Database for PostgreSQL poskytuje vrstvu trvalosti aplikace. V článku se dozvíte, jak otestovat aplikaci místně a nasadit ji do Container Apps.

Požadavky

  • Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
  • Připravte místní počítač s nainstalovaným operačním systémem Unix , například Ubuntu, macOS nebo Subsystém Windows pro Linux.
  • Nainstalujte implementaci Java SE verze 17 nebo novější – například sestavení OpenJDK od Microsoftu.
  • Nainstalujte Maven verze 3.9.8 nebo vyšší.
  • Nainstalujte Docker nebo Podman pro váš operační systém.
  • Nainstalujte jq.
  • Nainstalujte cURL.
  • Nainstalujte rozhraní příkazového řádku Quarkus verze 3.12.1 nebo vyšší.
  • Azure CLI pro prostředí podobná unixovým systémům. Tento článek vyžaduje pouze variantu Bash Azure CLI.
    • Nainstalujte Azure CLI a přihlaste se interaktivně pomocí příkazu az login , abyste se před použitím DefaultAzureCredential kódu přihlásili k Azure.
      az login
      
    • Tento článek vyžaduje aspoň verzi 2.61.0 Azure CLI.

Vytvoření projektu aplikace

Pomocí následujícího příkazu naklonujte ukázkový projekt Java pro tento článek. Ukázka je na GitHubu.

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

Pokud se zobrazí zpráva o tom, že je v odpojeném stavu HEAD , je tato zpráva v bezpečí ignorovat. Vzhledem k tomu, že tento článek nevyžaduje potvrzení, je vhodné odpojit stav HEAD.

Místní testování aplikace Quarkus

Kroky v této části ukazují, jak aplikaci spustit místně.

Quarkus podporuje automatické zřizování nekonfigurovaných služeb ve vývojovém a testovacím režimu. Quarkus se na tuto funkci odkazuje jako na vývojové služby. Řekněme, že zahrnete funkci Quarkus, například připojení k databázové službě. Chcete aplikaci otestovat, ale ještě jste nenakonfigurovali připojení k reálné databázi. Quarkus automaticky spustí verzi zástupných procedur příslušné služby a připojí k ní vaši aplikaci. Další informace najdete v tématu Přehled služby Dev Services v dokumentaci k Quarkus.

Ujistěte se, že je vaše prostředí kontejneru, Docker nebo Podman spuštěné, a pomocí následujícího příkazu přejděte do vývojového režimu Quarkus:

quarkus dev

quarkus devMísto toho můžete s Mavenem dosáhnout totéž pomocí mvn quarkus:dev.

Může se zobrazit dotaz, jestli chcete odesílat telemetrii využití vývojového režimu Quarkus. Pokud ano, odpovězte tak, jak chcete.

Režim vývoje Quarkus umožňuje živé opětovné načítání s kompilací na pozadí. Pokud upravíte jakýkoli aspekt zdrojového kódu aplikace a aktualizujete prohlížeč, uvidíte změny. Pokud dojde k problémům s kompilací nebo nasazením, zobrazí se chybová stránka s informacemi. Režim vývoje Quarkus naslouchá ladicímu programu na portu 5005. Pokud chcete počkat na připojení ladicího programu před spuštěním, předejte -Dsuspend ho na příkazovém řádku. Pokud ladicí program vůbec nechcete, můžete použít -Ddebug=false.

Výstup by měl vypadat jako v následujícím příkladu:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
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>

Stiskněte klávesu w na terminálu, kde běží vývojový režim Quarkus. Klávesa w otevře výchozí webový prohlížeč pro zobrazení Todo aplikace. K grafickému uživatelskému rozhraní http://localhost:8080 aplikace můžete přistupovat také přímo.

Snímek obrazovky ukázkové aplikace Todo

Zkuste vybrat několik položek úkolů v seznamu úkolů. Uživatelské rozhraní označuje výběr pomocí přeškrtnutého stylu textu. Novou položku seznamu úkolů můžete přidat také zadáním příkazu Ověřit aplikace todo a stisknutím klávesy ENTER, jak je znázorněno na následujícím snímku obrazovky:

Snímek obrazovky ukázkové aplikace Todo s přidanými novými položkami

Přístup k rozhraní RESTful API (/api) a získejte všechny položky úkolů, které se ukládají v místní databázi PostgreSQL:

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

Výstup by měl vypadat jako v následujícím příkladu:

* 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
  }
]

Stisknutím klávesy q ukončete vývojový režim Quarkus.

Vytvoření prostředků Azure pro spuštění aplikace Quarkus

Kroky v této části ukazují, jak vytvořit následující prostředky Azure pro spuštění ukázkové aplikace Quarkus:

  • Flexibilní server Azure Database for PostgreSQL
  • Azure Container Registry
  • Azure Container Apps

Některé z těchto prostředků musí mít jedinečné názvy v rozsahu předplatného Azure. K zajištění této jedinečnosti můžete použít iniciály, posloupnost, datum, vzor přípony . Pokud chcete tento vzor použít, pojmenujte prostředky uvedením iniciály, určitého pořadového čísla, dnešního data a nějaké přípony specifické pro prostředek – například rg "skupina prostředků". Tento vzor používají následující proměnné prostředí. Nahraďte zástupné hodnoty v UNIQUE_VALUELOCATION a DB_PASSWORD vlastními hodnotami a spusťte příkazy v terminálu.

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

Vytvoření flexibilního serveru Azure Database for PostgreSQL

Flexibilní server Azure Database for PostgreSQL je plně spravovaná databázová služba navržená tak, aby poskytovala podrobnější kontrolu a flexibilitu nad funkcemi správy databází a nastavením konfigurace. V této části se dozvíte, jak vytvořit instanci flexibilního serveru Azure Database for PostgreSQL pomocí Azure CLI. Další informace najdete v tématu Rychlý start: Vytvoření instance flexibilního serveru Azure Database for PostgreSQL pomocí Azure CLI.

Nejprve pomocí následujícího příkazu vytvořte skupinu prostředků, která bude obsahovat databázový server a další prostředky:

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

Dále pomocí následujícího příkazu vytvořte instanci flexibilního serveru Azure Database for PostgreSQL:

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

Vytvoření serveru, databáze, uživatele správce a pravidel brány firewall trvá několik minut. Pokud je příkaz úspěšný, výstup vypadá podobně jako v následujícím příkladu:

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

Vytvoření instance služby Microsoft Azure Container Registry

Vzhledem k tomu, že Quarkus je nativní cloudová technologie, má integrovanou podporu pro vytváření kontejnerů, které běží v Container Apps. Container Apps je zcela závislý na tom, že má registr kontejneru, ze kterého najde image kontejneru ke spuštění. Container Apps má integrovanou podporu služby Azure Container Registry.

K vytvoření instance Container Registry použijte příkaz az acr create. Následující příklad vytvoří n Instance Container Registry pojmenovaná s hodnotou proměnné prostředí ${REGISTRY_NAME}:

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

Po krátké době byste měli vidět výstup JSON, který obsahuje následující řádky:

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

Připojení dockeru k instanci služby Container Registry

Přihlaste se k instanci služby Container Registry. Přihlášení umožňuje nasdílení image. Pomocí následujících příkazů ověřte připojení:

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

Pokud místo Dockeru používáte Podman, proveďte potřebné změny příkazu.

Pokud jste se úspěšně přihlásili k instanci Container Registry, měli byste se podívat Login Succeeded na konci výstupu příkazu.

Vytvořit prostředí

Prostředí v Azure Container Apps vytvoří zabezpečenou hranici kolem skupiny kontejnerových aplikací. KontejnerOvé aplikace nasazené do stejného prostředí se nasazují ve stejné virtuální síti a zapisují protokoly do stejného pracovního prostoru služby Log Analytics. Pomocí příkazu az containerapp env create vytvořte prostředí, jak je znázorněno v následujícím příkladu:

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

Pokud se zobrazí výzva k instalaci rozšíření, odpovězte na Y.

Přizpůsobení nativní konfigurace cloudu

Jako nativní cloudová technologie nabízí Quarkus možnost automaticky generovat image kontejnerů. Další informace najdete v tématu Image kontejneru. Vývojáři pak můžou image aplikace nasadit na cílovou kontejnerizovanou platformu – například Azure Container Apps.

Pokud chcete vygenerovat image kontejneru, přidejte container-image-jib rozšíření do místního terminálu pomocí následujícího příkazu:

quarkus ext add container-image-jib

Quarkus upraví POM tak, aby se zajistilo, že rozšíření je součástí <dependencies>. Pokud se zobrazí výzva k instalaci s názvem JBang, odpovězte ano a povolte instalaci.

Výstup by měl vypadat jako v následujícím příkladu:

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

Pokud chcete ověřit přidání rozšíření, můžete spustit git diff a prozkoumat výstup.

Jako nativní technologie cloudu podporuje Quarkus pojem konfiguračních profilů. Quarkus má následující tři předdefinované profily:

  • dev - Aktivováno v režimu vývoje.
  • test - Aktivuje se při spouštění testů.
  • prod – Výchozí profil, pokud neběží ve vývojovém nebo testovacím režimu.

Quarkus podle potřeby podporuje libovolný počet pojmenovaných profilů.

Zbývající kroky v této části vás nasměruje na zrušení komentáře a přizpůsobení hodnot v souboru src/main/resources/application.properties . Ujistěte se, že všechny řádky začínající # %prod. na začátku jsou nekommentovány odebráním úvodních #řádků .

Předpona %prod. označuje, že tyto vlastnosti jsou aktivní při spuštění v prod profilu. Další informace o konfiguračních profilech najdete v dokumentaci k Quarkus.

Prozkoumání konfigurace databáze

Přidejte následující konfigurační proměnné databáze. Vlastnosti %prod.quarkus.datasource.jdbc.url%prod.quarkus.datasource.usernamesouvisející s připojením k databázi a %prod.quarkus.datasource.password jsou záměrně ponechány prázdné, protože jsou poskytovány za běhu prostředím Azure Container Apps z bezpečnostních důvodů.

# 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

Obecně neočekáváte, že se data uložená v databázi zahodí a znovu zahrnou s ukázkovými daty v produkčním prostředí. Proto vidíte, že schéma je quarkus.hibernate-orm.database.generation určeno tak create , aby aplikace vytvářela schéma pouze v případě, že v počátečním spuštění neexistuje. Kromě toho databáze není předem vyplněna žádnými ukázkovými daty, protože hibernate-orm.sql-load-script je určena jako no-file. Toto nastavení se liší od toho, kdy jste aplikaci spustili místně ve vývojovém režimu. Výchozí hodnoty ve vývojovém režimu jsou quarkus.hibernate-orm.database.generation a hibernate-orm.sql-load-script drop-and-create import.sql v uvedeném pořadí, což znamená, že aplikace vždy zahodí a znovu vytvoří schéma databáze a načte data definovaná v import.sql. Import.sql soubor je pohodlné zařízení od Quarkus. Pokud soubor src/main/resources/import.sql existuje v souboru Jar Quarkus a hodnota hibernate-orm.sql-load-script vlastnosti je import.sql, příkazy JAZYKa SQL DML v tomto souboru se pro aplikaci spustí při spuštění.

Přizpůsobení konfigurace image kontejneru

Jako nativní technologie cloudu podporuje Quarkus generování imagí kontejnerů OCI kompatibilních s Dockerem a Podmanem. Přidejte následující proměnné image kontejneru. Nahraďte hodnoty <LOGIN_SERVER_VALUE> a <USER_NAME_VALUE> hodnotami skutečných hodnot ${LOGIN_SERVER} proměnných prostředí a ${USER_NAME} proměnných prostředí.

# 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

Sestavení image kontejneru a jeho nasdílení do služby Container Registry

Teď pomocí následujícího příkazu sestavte samotnou aplikaci. Tento příkaz používá rozšíření Jib k sestavení image kontejneru.

quarkus build --no-tests

Výstup by měl končit .BUILD SUCCESS

Pomocí příkazového řádku nebo podman příkazového docker řádku můžete ověřit, jestli se image kontejneru vygeneruje. Výstup vypadá podobně jako v následujícím příkladu:

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

Nasdílení imagí kontejneru do služby Container Registry pomocí následujícího příkazu:

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}

Výstup by měl vypadat zhruba jako v tomto příkladu:

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

Teď, když jste nasdíleli image aplikace do Container Registry, pomocí následujícího příkazu vytvořte instanci Container Apps, která spustí aplikaci po načtení image ze služby 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'

Tato --secrets možnost slouží k vytváření tajných QUARKUS_DATASOURCE_JDBC_URLQUARKUS_DATASOURCE_USERNAME kódů, na které odkazují proměnné prostředí související s připojením k databázi a QUARKUS_DATASOURCE_PASSWORD. Hodnoty těchto proměnných prostředí se předávají vlastnostem %prod.quarkus.datasource.password%prod.quarkus.datasource.username a %prod.quarkus.datasource.password. Quarkus ví, že vyhledá hodnoty z odpovídajících proměnných prostředí, pokud soubor application.properties neobsahuje žádnou hodnotu.

Úspěšný výstup je objekt JSON včetně vlastnosti "type": "Microsoft.App/containerApps".

Pomocí následujícího příkazu získejte plně kvalifikovanou adresu URL pro přístup k aplikaci Todo:

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

Otevřete nový webový prohlížeč s hodnotou ${QUARKUS_URL}. Potom přidejte novou položku úkolu s textem Deployed the Todo app to Container Apps. Tuto položku vyberte, pokud ji chcete označit jako dokončenou.

Snímek obrazovky ukázkové aplikace Todo spuštěné v Container Apps

Přístup k rozhraní RESTful API (/api) a získejte všechny položky úkolů uložené ve službě Azure Database for PostgreSQL, jak je znázorněno v následujícím příkladu:

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

Výstup by měl vypadat jako v následujícím příkladu:

* 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
  }
]

Ověření aktualizace databáze pomocí Azure Cloud Shellu

Otevřete Azure Cloud Shell na webu Azure Portal tak , že vyberete ikonu Cloud Shellu ( ) vedle vyhledávacího pole.

Spusťte místně následující příkaz a vložte výsledek do Azure Cloud Shellu:

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

Po zobrazení výzvy k zadání hesla použijte hodnotu, kterou jste použili při vytváření databáze.

Pomocí následujícího dotazu získejte všechny položky úkolů:

select * from todo;

Výstup by měl vypadat podobně jako v následujícím příkladu a měl by obsahovat stejné položky v grafickém uživatelském rozhraní aplikace Todo zobrazeném dříve:

Snímek obrazovky s výstupem dotazu jako tabulkou ASCII

Zadáním \q ukončete psql program a vraťte se do Cloud Shellu.

Vyčištění prostředků

Abyste se vyhnuli poplatkům za Azure, měli byste vyčistit nepotřebné prostředky. Pokud už cluster nepotřebujete, pomocí příkazu az group delete odeberte skupinu prostředků, službu kontejneru, registr kontejneru a všechny související prostředky.

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

Můžete také použít docker rmi k odstranění postgres imagí testcontainers kontejnerů vygenerovaných vývojovými režimy Quarkus.

Další kroky