Cvičení – nasazení aplikace Jakarta EE do EAP JBoss ve službě Azure App Service
V této lekci nasadíte aplikaci Jakarta EE do platformy Red Hat JBoss Enterprise Application Platform (JBoss EAP) ve službě Azure App Service. Modul plug-in Maven pro Azure App Service slouží ke konfiguraci projektu, kompilaci a nasazení aplikace a konfiguraci zdroje dat.
Konfigurace aplikace
Pomocí následujícího postupu nakonfigurujte aplikaci pomocí modulu plug-in Maven pro Azure App Service:
Pomocí následujícího příkazu interaktivně spusťte konfigurační úkol modulu plug-in Azure.
./mvnw com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:config
Důležitý
Pokud změníte oblast serveru MySQL, měli byste tuto oblast shodovat s oblastí aplikačního serveru Jakarta EE, abyste minimalizovali zpoždění latence.
Pomocí hodnot v následující tabulce odpovězte na interaktivní výzvy:
Vstupní element Hodnota Create new run configuration (Y/N) [Y]:
Y
Define value for OS [Linux]:
Linux
Define value for javaVersion [Java 17]:
1: Java 17
Define value for runtimeStack:
3: Jbosseap 7
Define value for pricingTier [P1v3]:
P1v3
Confirm (Y/N) [Y]:
Y
Následující výstup je typický:
[INFO] Saving configuration to pom. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 03:00 min [INFO] Finished at: 2025-02-21T06:24:11+09:00 [INFO] ------------------------------------------------------------------------
Po použití příkazu Maven je následující příklad typickým doplňkem k souboru pom.xml Mavenu:
<build> <finalName>ROOT</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.4.0</version> </plugin> <plugin> <groupId>com.microsoft.azure</groupId> <artifactId>azure-webapp-maven-plugin</artifactId> <version>2.13.0</version> <configuration> <schemaVersion>v2</schemaVersion> <resourceGroup>jakartaee-app-on-jboss-rg</resourceGroup> <appName>jakartaee-app-on-jboss</appName> <pricingTier>P1v3</pricingTier> <region>centralus</region> <runtime> <os>Linux</os> <javaVersion>Java 17</javaVersion> <webContainer>Jbosseap 7</webContainer> </runtime> <deployment> <resources> <resource> <directory>${project.basedir}/target</directory> <includes> <include>*.war</include> </includes> </resource> </resources> </deployment> </configuration> </plugin> </plugins> </build>
Zkontrolujte
<region>
prvek v souboru pom.xml. Pokud jeho hodnota neodpovídá umístění instalace MySQL, změňte ji na stejné umístění.Pomocí následujícího příkladu
webContainer
upravte hodnotu v souboru pom.xml naJbosseap 8
, pro prostředí JBoss EAP 8 ve službě Azure App Service:Spropitné
Od února 2025 je nejnovější dostupná verze JBoss EAP 8.0 Update 4.1.
<runtime> <os>Linux</os> <javaVersion>Java 17</javaVersion> <webContainer>Jbosseap 8</webContainer> <!-- Change this value --> </runtime>
Do elementu
<resources>
souborupom.xml přidejte následující kód XML. Tato konfigurace se používá k nasazení spouštěcího souboru, který aktualizujete později v této lekci.<resource> <type>startup</type> <directory>${project.basedir}/src/main/webapp/WEB-INF/</directory> <includes> <include>createMySQLDataSource.sh</include> </includes> </resource>
Hodnota
startup
prostředku<type>
nasadí zadaný skript jako soubor startup.sh pro Linux nebo startup.cmd pro Windows. Umístění nasazení je /home/site/scripts/.Poznámka
Možnost nasazení a umístění nasazení můžete zvolit zadáním
type
jednoho z následujících způsobů:-
type=war
Nasadí soubor WAR na /home/site/wwwroot/app.war , pokudpath
není zadaný. -
type=war&path=webapps/<appname>
nasadí soubor WAR na /home/site/wwwroot/webapps/<appname>. -
type=jar
nasadí soubor WAR do složky /home/site/wwwroot/app.jar. Parametrpath
je ignorován. -
type=ear
nasadí soubor WAR na /home/site/wwwroot/app.ear. Parametrpath
je ignorován. -
type=lib
nasadí soubor JAR na /home/site/libs. Je nutné zadatpath
parametr. -
type=static
nasadí skript do /home/site/scripts. Je nutné zadatpath
parametr. -
type=startup
nasadí skript jako startup.sh v Linuxu nebo startup.cmd ve Windows. Skript se nasadí do /home/site/scripts/. Parametrpath
je ignorován. -
type=zip
rozbalí soubor.zip na /home/site/wwwroot. Parametrpath
je volitelný.
-
Zkontrolujte hodnoty
resourceGroup
aappName
prvky v souboru pom.xml .Pomocí následujících příkazů přiřaďte hodnoty
resourceGroup
aappName
environmentálním proměnným.export RESOURCE_GROUP_NAME=<resource-group> export WEB_APP_NAME=<app-name>
Kompilace a sestavení aplikace Jakarta EE
Po konfiguraci nastavení nasazení služby Azure App Service zkompilujte a zabalte zdrojový kód pomocí následujícího příkazu:
./mvnw clean package
Následující výstup je typický:
[INFO] --- war:3.4.0:war (default-war) @ jakartaee-app-on-jboss ---
[INFO] Packaging webapp
[INFO] Assembling webapp [jakartaee-app-on-jboss] in [/private/tmp/mslearn-jakarta-ee-azure/target/ROOT]
[INFO] Processing war project
[INFO] Copying webapp resources [/private/tmp/mslearn-jakarta-ee-azure/src/main/webapp]
[INFO] Building war: /private/tmp/mslearn-jakarta-ee-azure/target/ROOT.war
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.881 s
[INFO] Finished at: 2025-02-21T06:32:30+09:00
[INFO] ------------------------------------------------------------------------
Nasazení aplikace Jakarta EE do EAP JBoss ve službě Azure App Service
Po kompilaci a zabalení kódu nasaďte aplikaci pomocí následujícího příkazu:
./mvnw azure-webapp:deploy
Měl by se zobrazit výstup, který obsahuje zprávu o úspěchu a adresu URL nasazené aplikace. Nezapomeňte uložit adresu URL stranou pro pozdější použití.
Konfigurace připojení k databázi
Ukázková aplikace se připojí k databázi MySQL a zobrazí data. Konfigurace projektu Maven v souboru pom.xml určuje ovladač MySQL JDBC, jak je znázorněno v následujícím příkladu:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-jdbc-driver}</version>
</dependency>
V důsledku toho JBoss EAP automaticky nainstaluje ovladač ROOT.war_com.mysql.cj.jdbc.Driver_9_2
JDBC do balíčku pro nasazení ROOT.war.
Vytvoření objektu MySQL DataSource v JBoss EAP
Pokud chcete získat přístup ke službě Azure Database for MySQL, musíte nakonfigurovat DataSource
objekt v JBoss EAP a zadat název JNDI (Java Naming and Directory Interface) ve zdrojovém kódu. K vytvoření objektu MySQL DataSource
v JBoss EAP použijte skript spouštěcího prostředí /WEB-INF/createMySQLDataSource.sh . Následující příklad ukazuje nekonfigurovanou verzi skriptu, která už je ve službě Azure App Service:
#!/bin/bash
# In order to use the variables in CLI scripts
# https://access.redhat.com/solutions/321513
sed -i -e "s|.*<resolve-parameter-values.*|<resolve-parameter-values>true</resolve-parameter-values>|g" /opt/eap/bin/jboss-cli.xml
/opt/eap/bin/jboss-cli.sh --connect <<EOF
data-source add --name=JPAWorldDataSourceDS \
--jndi-name=java:jboss/datasources/JPAWorldDataSource \
--connection-url=${AZURE_MYSQL_CONNECTIONSTRING}&characterEncoding=utf8&sslMode=REQUIRED&serverTimezone=UTC&authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin \
--driver-name=ROOT.war_com.mysql.cj.jdbc.Driver_9_2 \
--min-pool-size=5 \
--max-pool-size=20 \
--blocking-timeout-wait-millis=5000 \
--enabled=true \
--driver-class=com.mysql.cj.jdbc.Driver \
--jta=true \
--use-java-context=true \
--valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker \
--exception-sorter-class-name=com.mysql.cj.jdbc.integration.jboss.ExtendedMysqlExceptionSorter
exit
EOF
Poznámka
Při vytváření zdroje dat nezadáte heslo pro připojení MySQL. Proměnná AZURE_MYSQL_CONNECTIONSTRING
prostředí je zadána v parametru --connection-url
. Tato proměnná prostředí se automaticky nastaví při pozdějším vytvoření připojení služby.
Hodnota připojení služby je nastavena na jdbc:mysql://$MYSQL_SERVER_INSTANCE.mysql.database.azure.com:3306/world?serverTimezone=UTC&sslmode=required&user=aad_jbossapp
, což používá uživatelské jméno aad_jbossapp
bez hesla.
Připojením &authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin
k této adrese URL se pro uživatele aad_jbossapp
povolí ověřování Microsoft Entra ID.
Pomocí následujícího příkazu nakonfigurujte instanci služby App Service tak, aby vyvolala spouštěcí skript:
az webapp config set \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${WEB_APP_NAME} \
--startup-file '/home/site/scripts/startup.sh'
Po spuštění skriptu ho aplikační server vyvolá při každém restartování aplikačního serveru.
Poznámka
Pokud artefakt nasazení není ROOT.war, změňte také hodnotu --driver-name=YOUR_ARTIFACT.war_com.mysql.cj.jdbc.Driver_9_2
.
Konfigurace připojení služby pro flexibilní server MySQL
Po nakonfigurování spouštěcího skriptu nakonfigurujte službu App Service tak, aby používala konektor služby pro připojení flexibilního serveru MySQL pomocí následujících kroků:
Nastavte proměnné prostředí pomocí následujících příkazů:
export PASSWORDLESS_USER_NAME_SUFFIX=jbossapp export SOURCE_WEB_APP_ID=$(az webapp list \ --resource-group $RESOURCE_GROUP_NAME \ --query "[0].id" \ --output tsv) export MYSQL_ID=$(az mysql flexible-server list \ --resource-group $RESOURCE_GROUP_NAME \ --query "[0].id" \ --output tsv) export TARGET_MYSQL_ID=$MYSQL_ID/databases/world export MANAGED_ID=$(az identity list \ --resource-group $RESOURCE_GROUP_NAME \ --query "[0].id" \ --output tsv)
Proměnné prostředí se používají pro následující účely:
-
PASSWORDLESS_USER_NAME_SUFFIX
je přípona uživatelského jména použitého pro připojení k flexibilnímu serveru MySQL. Vytvořené uživatelské jméno má předponuaad_
následovanou zadanou příponou. -
SOURCE_WEB_APP_ID
je ID instance služby Azure App Service sloužící k připojení k flexibilnímu serveru MySQL. -
MYSQL_ID
je ID flexibilního serveru MySQL. -
TARGET_MYSQL_ID
určuje název databáze jako$MYSQL_ID/databases/world
, aby navázal připojení s uživatelem s oprávněním k přístupu k databáziworld
. -
MANAGED_ID
je spravovaná identita použitá k připojení k flexibilnímu serveru MySQL.
-
Přidejte rozšíření pro
serviceconnector-passwordless
a vytvořte připojení ke službě pomocí následujících příkazů:az extension add \ --name serviceconnector-passwordless \ --upgrade az webapp connection create mysql-flexible \ --resource-group ${RESOURCE_GROUP_NAME} \ --connection $PASSWORDLESS_USER_NAME_SUFFIX \ --source-id $SOURCE_WEB_APP_ID \ --target-id $TARGET_MYSQL_ID \ --client-type java \ --system-identity mysql-identity-id=$MANAGED_ID
Poznámka
Pokud se zobrazí chybová zpráva, například
Resource '********-****-****-****-************' does not exist or one of its queried reference-property objects are not present.
, spusťte příkaz po několika sekundách znovu.Na příkazovém řádku SQL pomocí následujícího dotazu zkontrolujte seznam uživatelů zaregistrovaných v MySQL:
SELECT user, host, plugin FROM mysql.user;
Následující výstup je typický:
+----------------------------------+-----------+-----------------------+ | user | host | plugin | +----------------------------------+-----------+-----------------------+ | aad_jbossapp | % | aad_auth | | azureuser | % | mysql_native_password | | $CURRENT_AZ_LOGIN_USER_NAME#EXT#@| % | aad_auth | | azure_superuser | 127.0.0.1 | mysql_native_password | | azure_superuser | localhost | mysql_native_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | +----------------------------------+-----------+-----------------------+ 8 rows in set (2.06 sec)
Měli byste vidět
aad_jbossapp
uživatele používajícího pluginaad_auth
. Z JBoss EAP nasazeného v Azure se můžete připojit k flexibilnímu serveru MySQL pomocíaad_jbossapp
uživatelského jména bez hesla.
Potvrďte odkaz na Zdroj dat v kódu.
Pokud chcete získat přístup k databázi MySQL z vaší aplikace, musíte v projektu aplikace nakonfigurovat odkaz na zdroj dat.
Kód přístupu k databázi se implementuje pomocí rozhraní JAVA Persistence API (JPA). Konfigurace odkazu DataSource
je v konfiguračním souboru JPA persistence.xml.
Pomocí následujících kroků potvrďte DataSource
odkaz:
Otevřete soubor src/main/resources/META-INF/persistence.xml a zkontrolujte, jestli
DataSource
název odpovídá názvu použitému v konfiguraci. Spouštěcí skript již vytvořil název JNDI,java:jboss/datasources/JPAWorldDataSource
, jak je znázorněno v následujícím příkladu:<persistence-unit name="JPAWorldDatasourcePU" transaction-type="JTA"> <jta-data-source>java:jboss/datasources/JPAWorldDataSource</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="hibernate.generate_statistics" value="true" /> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> </properties> </persistence-unit>
Přejděte k databázi MySQL v jednotce s názvem
PersistenceContext
, jak je znázorněno v následujícím příkladu.@Transactional(REQUIRED) @RequestScoped public class CityService { @PersistenceContext(unitName = "JPAWorldDatasourcePU") EntityManager em;
Přístup k aplikaci
Ukázková aplikace implementuje tři koncové body REST. Pokud chcete získat přístup k aplikaci a načíst data, postupujte následovně:
V prohlížeči přejděte na adresu URL aplikace, která se zobrazila ve výstupu při nasazení aplikace.
Pokud chcete získat všechny informace o kontinentu ve formátu JSON, použijte metodu
GET
na koncovémarea
bodu.Pokud chcete získat všechny země a oblasti v zadaném kontinentu, použijte
GET
metodu na koncovémarea
continent
bodu a zadejte parametr cesty.Pokud chcete získat všechna města, která mají počet obyvatel větší než jeden milion v zadané zemi nebo oblasti, použijte
GET
metodu na koncovémcountries
countrycode
bodu a zadejte parametr cesty.
Souhrn cvičení
V této lekci jste ověřili koncové body REST aplikace a potvrdili jste, že vaše aplikace může získávat data z vaší databáze MySQL. V další lekci prozkoumáte protokoly serveru.