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. 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

  • Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete.
  • Služba Azure Cloud Shell má všechny tyto předpoklady předinstalované. Další informace najdete v rychlém startu pro Azure Cloud Shell.
  • Pokud příkazy v této příručce spouštíte místně (místo použití Azure Cloud Shellu), proveďte následující kroky:
    • 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 build Microsoftu openJDK).
    • Nainstalujte Maven 3.5.0 nebo novější.
    • Nainstalujte Docker nebo Podman pro váš operační systém.
    • Nainstalujte jq.
    • Nainstalujte cURL.
    • Nainstalujte quarkus CLI 3.4.1 nebo novější.
  • 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.31.0 Azure CLI. Pokud používáte Azure Cloud Shell, je už nainstalovaná nejnovější verze.

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 2023-09-13
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.

Screenshot of the Todo sample app.

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:

Screenshot of the Todo sample app with new items added.

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:

  • Microsoft Azure Database for PostgreSQL
  • Microsoft Azure Container Registry
  • 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ů". Pomocí následujících příkazů definujte některé proměnné prostředí, které se mají použít později:

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_PASSWORD=Secret123456
export ACA_ENV=${UNIQUE_VALUE}env
export ACA_NAME=${UNIQUE_VALUE}aca

Vytvoření Azure Database for PostgreSQL

Azure Database for PostgreSQL je spravovaná služba pro spouštění, správu a škálování vysoce dostupných databází PostgreSQL v cloudu Azure. Tato část vás nasměruje na samostatný rychlý start, který ukazuje, jak vytvořit jeden server Azure Database for PostgreSQL a jak se k němu připojit. Pokud ale budete postupovat podle kroků v rychlém startu, musíte použít nastavení v následující tabulce k přizpůsobení nasazení databáze pro ukázkovou aplikaci Quarkus. Proměnné prostředí nahraďte jejich skutečnými hodnotami při vyplňování polí na webu Azure Portal.

Nastavení Hodnota Popis
Skupina prostředků ${RESOURCE_GROUP_NAME} Vyberte, že chcete vytvořit novou IP adresu. Nasazení vytvoří tuto novou skupinu prostředků.
Název serveru ${DB_SERVER_NAME} Tato hodnota je součástí názvu hostitele databázového serveru.
Místo ${LOCATION} V rozevíracím seznamu vyberte umístění. Poznamenejte si umístění. Musíte použít stejné umístění pro další prostředky Azure, které vytvoříte.
Uživatelské jméno správce quarkus Vzorový kód předpokládá tuto hodnotu.
Heslo ${DB_PASSWORD} Heslo musí mít maximálně 8 znaků a maximálně 128 znaků. Heslo musí obsahovat znaky ze tří z těchto kategorií – velká písmena anglické abecedy, malá písmena anglické abecedy, číslice (0–9) a jiné než alfanumerických znaky (!, $, #, % apod.). Vaše heslo nemůže obsahovat celé přihlašovací jméno ani jeho část. Část přihlašovacího jména je definována jako tři nebo více po sobě jdoucích alfanumerických znaků.

S ohledem na tyto náhrady hodnot postupujte podle kroků v rychlém startu: Vytvoření serveru Azure Database for PostgreSQL pomocí webu Azure Portal až do části Konfigurace pravidla brány firewall. Potom v části Konfigurace pravidla brány firewall nezapomeňte vybrat Ano pro povolení přístupu ke službám Azure a pak vyberte Uložit. Pokud to neuděláte, vaše aplikace Quarkus nemůže získat přístup k databázi a jednoduše se nikdy nespustí.

Po dokončení kroků v rychlém startu v části Konfigurace pravidla brány firewall, včetně kroku povolení přístupu ke službám Azure, se vraťte do tohoto článku.

Vytvoření databáze todo ve službě Azure Database for PostgreSQL

Server PostgreSQL, který jste vytvořili dříve, je prázdný. Nemá žádnou databázi, kterou můžete použít s aplikací Quarkus. Vytvořte novou databázi volanou todo pomocí následujícího příkazu:

az postgres db create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name todo \
    --server-name ${DB_SERVER_NAME}

Musíte použít todo jako název databáze, protože vzorový kód předpokládá, že název databáze.

Pokud je příkaz úspěšný, výstup vypadá podobně jako v následujícím příkladu:

{
  "charset": "UTF8",
  "collation": "English_United States.1252",
  "id": "/subscriptions/REDACTED/resourceGroups/ejb091223rg/providers/Microsoft.DBforPostgreSQL/servers/ejb091223db/databases/todo",
  "name": "todo",
  "resourceGroup": "ejb091223rg",
  "type": "Microsoft.DBforPostgreSQL/servers/databases"
}

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í do dockeru do instance 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.

Přizpůsobení konfigurace databáze

Přidejte následující konfigurační proměnné databáze. Nahraďte hodnoty <DB_SERVER_NAME_VALUE> a <DB_PASSWORD_VALUE> skutečnými hodnotami proměnných ${DB_SERVER_NAME} prostředí.${DB_PASSWORD}

# Database configurations
%prod.quarkus.datasource.db-kind=postgresql
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://<DB_SERVER_NAME_VALUE>.postgres.database.azure.com:5432/todo
%prod.quarkus.datasource.jdbc.driver=org.postgresql.Driver
%prod.quarkus.datasource.username=quarkus@<DB_SERVER_NAME_VALUE>
%prod.quarkus.datasource.password=<DB_PASSWORD_VALUE>
%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 pro quarkus.hibernate-orm.database.generation a jsou drop-and-create a import.sqlhibernate-orm.sql-load-script 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. Soubor import.sql je pohodlné zařízení z 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   402MB

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:

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 \
    --ingress 'external'

Ú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.

Screenshot of the Todo sample app running in 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=quarkus@${DB_SERVER_NAME} --dbname=todo

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:

Screenshot of the query output as an ASCII table.

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