Gyakorlat – Jakarta EE-alkalmazás üzembe helyezése a JBoss EAP-ban az Azure App Service-ben
Ebben a leckében egy Jakarta EE-alkalmazást helyez üzembe a Red Hat JBoss Enterprise Application Platformon (JBoss EAP) az Azure App Service-ben. Az Azure App Service-hez készült Maven beépülő modul használatával konfigurálhatja a projektet, lefordíthatja és üzembe helyezheti az alkalmazást, és konfigurálhat egy adatforrást.
Az alkalmazás konfigurálása
Konfigurálja az alkalmazást az Azure App Service Maven beépülő moduljával az alábbi lépések végrehajtásával:
Futtassa interaktívan az Azure-beépülő modul konfigurációs célját az alábbi paranccsal:
./mvnw com.microsoft.azure:azure-webapp-maven-plugin:2.13.0:configFontos
Ha módosítja a MySQL-kiszolgáló régióját, az késleltetések minimalizálása érdekében a régióját egyeztesse a Jakarta EE-alkalmazáskiszolgáló régiójával.
Az interaktív kérdések megválaszolásához használja az alábbi táblázatban szereplő értékeket:
Bemeneti elem Érték Create new run configuration (Y/N) [Y]:YDefine value for OS [Linux]:LinuxDefine value for javaVersion [Java 17]:1: Java 17Define value for runtimeStack:3: Jbosseap 7Define value for pricingTier [P1v3]:P1v3Confirm (Y/N) [Y]:YA következő kimenet jellemző:
[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] ------------------------------------------------------------------------A Maven parancs használata után az alábbi példa a Maven pom.xml fájl egy tipikus kiegészítése:
<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>Ellenőrizze a
<region>pom.xml fájl elemét. Ha az értéke nem egyezik meg a MySQL telepítési helyével, módosítsa ugyanarra a helyre.Az alábbi példát használja a
webContainerérték módosításához aJbosseap 8fájlban, az Azure App Service JBoss EAP 8 környezetében.Borravaló
2025 februárjától a JBoss EAP legújabb elérhető verziója a 8.0 4.1-es frissítés.
<runtime> <os>Linux</os> <javaVersion>Java 17</javaVersion> <webContainer>Jbosseap 8</webContainer> <!-- Change this value --> </runtime>Adja hozzá a következő XML-t a
<resources>pom.xml fájl eleméhez. Ez a konfiguráció az indítófájl telepítésére szolgál, amelyet később frissít ebben a szakaszban.<resource> <type>startup</type> <directory>${project.basedir}/src/main/webapp/WEB-INF/</directory> <includes> <include>createMySQLDataSource.sh</include> </includes> </resource>A
<type>erőforrásstartupértéke a megadott szkriptet Linux esetén startup.sh, Windows esetén pedig startup.cmd fájlként helyezi üzembe. Az üzembehelyezési hely a /home/site/scripts/.Jegyzet
Az üzembe helyezési lehetőséget és az üzembe helyezés helyét az alábbi módok egyikének megadásával
typeválaszthatja ki:-
type=warHa nincs megadva, telepíti a WAR-fájlt a /home/site/wwwroot/app.warpathhelyre. -
type=war&path=webapps/<appname>üzembe helyezi a WAR-fájlt a /home/site/wwwroot/webapps/<appname> webhelyen. -
type=jartelepíti a WAR-fájlt a /home/site/wwwroot/app.jar. Apathparaméter figyelmen kívül lesz hagyva. -
type=earüzembe helyezi a WAR-fájlt a /home/site/wwwroot/app.ear webhelyen. Apathparaméter figyelmen kívül lesz hagyva. -
type=libüzembe helyezi a JAR-t a /home/site/libs webhelyen. Meg kell adniapatha paramétert. -
type=statictelepíti a szkriptet a /home/site/scripts webhelyen. Meg kell adnia a paramétertpath. -
type=startupA szkriptet linuxos startup.sh vagy windowsos startup.cmd ként helyezi üzembe. A szkript a /home/site/scripts/webhelyen van üzembe helyezve. Apathparaméter figyelmen kívül lesz hagyva. -
type=zipbontsa ki a .zip fájlt a /home/site/wwwroot fájlba. Apathparaméter megadása nem kötelező.
-
Ellenőrizze a
resourceGroupfájlban aappNameés elemek értékeit.Rendelje hozzá a
resourceGroupésappNameértékeket környezeti változókhoz a következő parancsokkal:export RESOURCE_GROUP_NAME=<resource-group> export WEB_APP_NAME=<app-name>
A Jakarta EE-alkalmazás fordítása és létrehozása
Az Azure App Service üzembehelyezési beállításainak konfigurálása után fordítsa le és csomagolja be a forráskódot az alábbi paranccsal:
./mvnw clean package
A következő kimenet jellemző:
[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] ------------------------------------------------------------------------
A Jakarta EE-alkalmazás üzembe helyezése a JBoss EAP-ban az Azure App Service-ben
A kód fordítása és becsomagolása után telepítse az alkalmazást az alábbi paranccsal:
./mvnw azure-webapp:deploy
Látnia kell egy sikerüzenetet és az üzembe helyezett alkalmazás URL-címét tartalmazó kimenetet. Ne felejtse el menteni az URL-címet későbbi használatra.
Adatbázis-kapcsolat konfigurálása
A mintaalkalmazás csatlakozik a MySQL-adatbázishoz, és megjeleníti az adatokat. Az pom.xml fájl Maven-projektkonfigurációja a MySQL JDBC-illesztőt adja meg az alábbi példában látható módon:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-jdbc-driver}</version>
</dependency>
Ennek eredményeképpen a JBoss EAP automatikusan telepíti a JDBC-illesztőt ROOT.war_com.mysql.cj.jdbc.Driver_9_2 a ROOT.war telepítési csomagba.
A MySQL DataSource objektum létrehozása a JBoss EAP-ban
Az Azure Database for MySQL eléréséhez konfigurálnia kell az objektumot a DataSource JBoss EAP-ben, és meg kell adnia a Java Naming and Directory Interface (JNDI) nevét a forráskódban. MySQL-objektum DataSource JBoss EAP-ban való létrehozásához a /WEB-INF/createMySQLDataSource.sh indítási felület szkriptet kell használnia. Az alábbi példa a szkript nem konfigurált verzióját mutatja be az Azure App Service-ben:
#!/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
Jegyzet
Az adatforrás létrehozásakor nem ad meg jelszót a MySQL-kapcsolathoz. A környezeti változó AZURE_MYSQL_CONNECTIONSTRING a paraméterben --connection-url van megadva. Ez a környezeti változó automatikusan be van állítva a szolgáltatáskapcsolat későbbi létrehozásakor.
A szolgáltatáskapcsolat értéke a jelszó nélküli felhasználónevet használó jdbc:mysql://$MYSQL_SERVER_INSTANCE.mysql.database.azure.com:3306/world?serverTimezone=UTC&sslmode=required&user=aad_jbossapp értékre van állítvaaad_jbossapp.
Az URL-címhez hozzáfűzve &authenticationPlugins=com.azure.identity.extensions.jdbc.mysql.AzureMysqlAuthenticationPlugin a Microsoft Entra-azonosító hitelesítése engedélyezve van a aad_jbossapp felhasználó számára.
Konfigurálja az App Service-példányt az indítási szkript meghívására az alábbi paranccsal:
az webapp config set \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${WEB_APP_NAME} \
--startup-file '/home/site/scripts/startup.sh'
A szkript futtatása után az alkalmazáskiszolgáló minden alkalommal meghívja, amikor az alkalmazáskiszolgáló újraindul.
Jegyzet
Ha az üzembehelyezési összetevő nem ROOT.war, módosítsa az --driver-name=YOUR_ARTIFACT.war_com.mysql.cj.jdbc.Driver_9_2 értéket is.
Rugalmas MySQL-kiszolgáló szolgáltatáskapcsolatának konfigurálása
Miután konfigurálta az indítási szkriptet, konfigurálja az App Service-t a Rugalmas MySQL-kiszolgálókapcsolat Service Connector használatára az alábbi lépések végrehajtásával:
Környezeti változók beállítása a következő parancsokkal:
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)A környezeti változók a következő célokra használhatók:
-
PASSWORDLESS_USER_NAME_SUFFIXa rugalmas MySQL-kiszolgálóhoz való csatlakozáshoz használt felhasználónév utótagja. A létrehozott felhasználónév előtaggalaad_és a megadott utótaggal rendelkezik. -
SOURCE_WEB_APP_IDa rugalmas MySQL-kiszolgálóhoz való csatlakozáshoz használt Azure App Service-példány azonosítója. -
MYSQL_IDA rugalmas MySQL-kiszolgáló azonosítója. -
TARGET_MYSQL_IDmegadja az adatbázis nevét, hogy$MYSQL_ID/databases/worldkapcsolatot létesítsen egy olyan felhasználóval, aki jogosult azworldadatbázis elérésére. -
MANAGED_IDa rugalmas MySQL-kiszolgálóhoz való csatlakozáshoz használt felügyelt identitás.
-
Adja hozzá a bővítményt
serviceconnector-passwordless, és hozza létre a szolgáltatáskapcsolatot az alábbi parancsokkal: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_IDJegyzet
ha egy hasonló
Resource '********-****-****-****-************' does not exist or one of its queried reference-property objects are not present.hibaüzenetet kap, futtassa újra a parancsot néhány másodperc múlva.Az SQL-parancssorban ellenőrizze a MySQL-ben regisztrált felhasználók listáját az alábbi lekérdezéssel:
SELECT user, host, plugin FROM mysql.user;A következő kimenet jellemző:
+----------------------------------+-----------+-----------------------+ | 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)Látni kell egy
aad_jbossappfelhasználót, amelyik aaad_authbeépülő modult használja. Az Azure-ban üzembe helyezett JBoss EAP-ból jelszó nélküli felhasználónévvelaad_jbossappcsatlakozhat a rugalmas MySQL-kiszolgálóhoz.
Ellenőrizze a DataSource-referenciát a kódban
A MySQL-adatbázis alkalmazásból való eléréséhez konfigurálnia kell az adatforrás-hivatkozást az alkalmazásprojektben.
Az adatbázis-hozzáférési kód a Java Persistence API (JPA) használatával implementálva van. A DataSource hivatkozás konfigurációja a JPA konfigurációs fájl persistence.xml-ban található.
A hivatkozás megerősítéséhez kövesse az DataSource alábbi lépéseket:
Nyissa meg az src/main/resources/META-INF/persistence.xml fájlt, és ellenőrizze, hogy a
DataSourcenév megegyezik-e a konfigurációban használt névvel. Az indítási szkript már létrehozta a JNDI nevet a következő példában látható módonjava:jboss/datasources/JPAWorldDataSource:<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>Az egységnévben
PersistenceContexttalálható MySQL-adatbázis elérése az alábbi példában látható módon:@Transactional(REQUIRED) @RequestScoped public class CityService { @PersistenceContext(unitName = "JPAWorldDatasourcePU") EntityManager em;
Az alkalmazás elérése
A mintaalkalmazás három REST-végpontot implementál. Az alkalmazás eléréséhez és az adatok lekéréséhez kövesse az alábbi lépéseket:
A böngészőben keresse meg az alkalmazás URL-címét, amely az alkalmazás üzembe helyezésekor a kimenetben volt látható.
Ha az összes kontinens-információt JSON formátumban szeretné lekérni, használja a
GETvégponton található metódustarea.Egy adott kontinens összes országának és régiójának lekéréséhez használja a
GETvégpont metódusátarea, és adjon meg egy elérésiút-paramétertcontinent.A megadott országon vagy régión belül egymilliónál nagyobb népességű városok lekéréséhez használja a
GETvégpont metódusátcountries, és adjon meg egy elérésiút-paramétertcountrycode.
Gyakorlat összefoglalása
Ebben a leckében ellenőrizte az alkalmazás REST-végpontjait, és meggyőződött arról, hogy az alkalmazás adatokat tud lekérni a MySQL-adatbázisból. A következő leckében áttekinti a szervernaplókat.