Cvičení – nasazení aplikace Jakarta EE do EAP JBoss ve službě Azure App Service

Dokončeno

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:

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

  2. 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>
    
  3. 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í.

  4. Pomocí následujícího příkladu webContainer upravte hodnotu v souboru pom.xml na Jbosseap 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>
    
  5. 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 , pokud path 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. Parametr path je ignorován.
    • type=ear nasadí soubor WAR na /home/site/wwwroot/app.ear. Parametr path je ignorován.
    • type=lib nasadí soubor JAR na /home/site/libs. Je nutné zadat path parametr.
    • type=static nasadí skript do /home/site/scripts. Je nutné zadat path parametr.
    • type=startup nasadí skript jako startup.sh v Linuxu nebo startup.cmd ve Windows. Skript se nasadí do /home/site/scripts/. Parametr path je ignorován.
    • type=zip rozbalí soubor.zip na /home/site/wwwroot. Parametr path je volitelný.
  6. Zkontrolujte hodnoty resourceGroup a appName prvky v souboru pom.xml .

  7. Pomocí následujících příkazů přiřaďte hodnoty resourceGroup a appName 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ů:

  1. 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ředponu aad_ 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ázi world.
    • MANAGED_ID je spravovaná identita použitá k připojení k flexibilnímu serveru MySQL.
  2. 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.

  3. 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 plugin aad_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:

  1. 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>
    
  2. 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ě:

  1. V prohlížeči přejděte na adresu URL aplikace, která se zobrazila ve výstupu při nasazení aplikace.

  2. Pokud chcete získat všechny informace o kontinentu ve formátu JSON, použijte metodu GET na koncovém area bodu.

    Snímek obrazovky koncového bodu oblasti

  3. Pokud chcete získat všechny země a oblasti v zadaném kontinentu, použijte GET metodu na koncovém areacontinent bodu a zadejte parametr cesty.

    Snímek obrazovky koncového bodu oblasti s parametrem cesty pro kontinent

  4. 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ém countriescountrycode bodu a zadejte parametr cesty.

    Snímek obrazovky koncového bodu zemí s parametrem cesty kódu země.

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.