Gyakorlat – Jakarta EE-alkalmazás üzembe helyezése a JBoss EAP-ban az Azure App Service-ben

Befejeződött

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:

  1. 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:config
    

    Fontos

    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.

  2. 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]: 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

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

  4. Az alábbi példát használja a webContainer érték módosításához a Jbosseap 8 fá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>
    
  5. 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ás startup é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 type választhatja ki:

    • type=war Ha nincs megadva, telepíti a WAR-fájlt a /home/site/wwwroot/app.warpath helyre.
    • type=war&path=webapps/<appname> üzembe helyezi a WAR-fájlt a /home/site/wwwroot/webapps/<appname> webhelyen.
    • type=jar telepíti a WAR-fájlt a /home/site/wwwroot/app.jar. A path paraméter figyelmen kívül lesz hagyva.
    • type=ear üzembe helyezi a WAR-fájlt a /home/site/wwwroot/app.ear webhelyen. A path paraméter figyelmen kívül lesz hagyva.
    • type=lib üzembe helyezi a JAR-t a /home/site/libs webhelyen. Meg kell adnia path a paramétert.
    • type=static telepíti a szkriptet a /home/site/scripts webhelyen. Meg kell adnia a paramétert path .
    • type=startup A szkriptet linuxos startup.sh vagy windowsos startup.cmd ként helyezi üzembe. A szkript a /home/site/scripts/webhelyen van üzembe helyezve. A path paraméter figyelmen kívül lesz hagyva.
    • type=zip bontsa ki a .zip fájlt a /home/site/wwwroot fájlba. A path paraméter megadása nem kötelező.
  6. Ellenőrizze a resourceGroup fájlban a appName és elemek értékeit.

  7. Rendelje hozzá a resourceGroup és appName é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:

  1. 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_SUFFIX a rugalmas MySQL-kiszolgálóhoz való csatlakozáshoz használt felhasználónév utótagja. A létrehozott felhasználónév előtaggal aad_ és a megadott utótaggal rendelkezik.
    • SOURCE_WEB_APP_ID a rugalmas MySQL-kiszolgálóhoz való csatlakozáshoz használt Azure App Service-példány azonosítója.
    • MYSQL_ID A rugalmas MySQL-kiszolgáló azonosítója.
    • TARGET_MYSQL_ID megadja az adatbázis nevét, hogy $MYSQL_ID/databases/world kapcsolatot létesítsen egy olyan felhasználóval, aki jogosult az world adatbázis elérésére.
    • MANAGED_ID a rugalmas MySQL-kiszolgálóhoz való csatlakozáshoz használt felügyelt identitás.
  2. 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_ID
    

    Jegyzet

    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.

  3. 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_jbossapp felhasználót, amelyik a aad_auth beépülő modult használja. Az Azure-ban üzembe helyezett JBoss EAP-ból jelszó nélküli felhasználónévvel aad_jbossapp csatlakozhat 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:

  1. Nyissa meg az src/main/resources/META-INF/persistence.xml fájlt, és ellenőrizze, hogy a DataSource né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ódon java: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>
    
  2. Az egységnévben PersistenceContext talá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:

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

  2. Ha az összes kontinens-információt JSON formátumban szeretné lekérni, használja a GET végponton található metódust area .

    Képernyőkép a területvégpontról.

  3. Egy adott kontinens összes országának és régiójának lekéréséhez használja a GET végpont metódusát area , és adjon meg egy elérésiút-paramétert continent .

    Képernyőkép a területvégpontról egy kontinensút-paraméterrel.

  4. 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 GET végpont metódusát countries , és adjon meg egy elérésiút-paramétert countrycode .

    Képernyőkép az országvégpontról a countrycode path paraméterrel.

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.