Migrieren von JBoss EAP-Anwendungen zu JBoss EAP unter Azure App Service

In diesem Leitfaden erfahren Sie, was Sie beachten sollten, wenn Sie eine vorhandene JBoss EAP-Anwendung für die Ausführung unter JBoss EAP auf einer Azure App Service-Instanz migrieren möchten.

Vor der Migration

Führen Sie vor Beginn einer Migration die in den folgenden Abschnitten beschriebenen Schritte zur Bewertung und Bestandsermittlung aus, um eine erfolgreiche Migration zu gewährleisten.

Inventarisieren der Serverkapazität

Dokumentieren Sie die Hardware (Arbeitsspeicher, CPU, Datenträger) der aktuellen Produktionsserver und die durchschnittliche und maximale Anzahl von Anforderungen und die Ressourcennutzung. Sie benötigen diese Informationen unabhängig vom gewählten Migrationspfad. Es ist beispielsweise hilfreich, die Auswahl der Größe der virtuellen Computer in Ihrem Knotenpool, die Menge des vom Container verwendeten Arbeitsspeichers und die Anzahl der CPU-Freigaben des Containers zu unterstützen.

Es ist möglich, die Größe von Knotenpools in AKS zu ändern. Informationen dazu finden Sie unter Ändern der Größe von Knotenpools in Azure Kubernetes Service (AKS).To learn how, see Resize node pools in Azure Kubernetes Service (AKS).

Bestand: Alle Geheimnisse

Überprüfen Sie alle Eigenschaften und Konfigurationsdateien auf den Produktionsservern auf Geheimnisse und Kennwörter. Überprüfen Sie jboss-web.xml in Ihren WAR-Dateien. Unter Umständen finden Sie in Ihrer Anwendung auch Konfigurationsdateien mit Kennwörtern oder Anmeldeinformationen.

Es empfiehlt sich gegebenenfalls, diese Geheimnisse in Azure Key Vault zu speichern. Weitere Informationen finden Sie unter Grundlegende Konzepte von Azure Key Vault.

Sie können Key Vault-Geheimnisse auf Ihrer App Service-Instanz mit Key Vault-Verweisen nutzen. Mit Key Vault-Verweisen können Sie die Geheimnisse in Ihrer Anwendung verwenden, während sie im ruhenden Zustand geschützt und verschlüsselt sind. Weitere Informationen erhalten Sie unter Verwenden von Key Vault-Verweisen in App Service und Azure Functions.

Inventarisieren aller Zertifikate

Dokumentieren Sie alle Zertifikate, die für öffentliche SSL-Endpunkte verwendet werden. Sie können alle Zertifikate auf den Produktionsservern anzeigen, indem Sie den folgenden Befehl ausführen:

keytool -list -v -keystore <path to keystore>

Überprüfen, ob die unterstützte Java-Version richtig funktioniert

JBoss EAP auf Azure-VMs erfordert eine unterstützte Version von Java. Anleitungen dazu, welche Version des JDK verwendet werden soll, finden Sie in der Red Hat-Dokumentation unter "Unterstützte Konfigurationen ".

Hinweis

Diese Überprüfung ist besonders wichtig, wenn Ihr aktueller Server auf einem nicht unterstützten JDK (z. B. Oracle JDK oder IBM OpenJ9) ausgeführt wird.

Melden Sie sich an Ihrem Produktionsserver an, und führen Sie den folgenden Befehl aus, um Ihre aktuelle Java-Version zu ermitteln:

java -version

Bestand: Externe Ressourcen

Externe Ressourcen, z. B. Datenquellen, JMS-Nachrichtenbroker und andere, werden per JNDI (Java Naming and Directory Interface) eingefügt. Für einige dieser Ressourcen ist unter Umständen eine Migration oder erneute Konfiguration erforderlich.

Innerhalb Ihrer Anwendung

Untersuchen Sie die Datei WEB-INF/jboss-web.xml und/oder WEB-INF/web.xml. Suchen Sie im <Context>-Element nach <Resource>-Elementen.

Datenquellen

Datenquellen sind JNDI-Ressourcen, für die das type-Attribut auf javax.sql.DataSource festgelegt ist. Dokumentieren Sie für jede Datenquelle die folgenden Informationen:

  • Wie lautet der Name der Datenquelle?
  • Wie ist der Verbindungspool konfiguriert?
  • Wo ist die JAR-Datei mit den JDBC-Treibern zu finden?

Weitere Informationen finden Sie in der JBoss EAP-Dokumentation unter Informationen zu JBoss EAP-Datenquellen.

Alle anderen externen Ressourcen

Es würde den Rahmen dieses Leitfadens sprengen, jede mögliche externe Abhängigkeit zu dokumentieren. Ihr Team ist dafür verantwortlich, zu überprüfen, dass nach der Migration die Anforderungen aller externen Abhängigkeiten Ihrer Anwendung abgedeckt werden können.

Ermitteln, ob die Sitzungsreplikation verwendet wird

Falls Ihre Anwendung die Sitzungsreplikation verwendet, müssen Sie Ihre Anwendung ändern, um diese Abhängigkeit zu entfernen. In App Service ist es nicht zulässig, dass Instanzen direkt miteinander kommunizieren.

Ermitteln, ob und wie das Dateisystem verwendet wird

Für jegliche Nutzung des Dateisystems auf dem Anwendungsserver sind erneute Konfigurationen oder in selteneren Fällen auch Architekturänderungen erforderlich. Das Dateisystem kann von JBoss EAP-Modulen oder von Ihrem Anwendungscode genutzt werden. Unter Umständen kann es zu den Szenarien kommen, die in den folgenden Abschnitten beschrieben sind.

Schreibgeschützter statischer Inhalt

Falls mit Ihrer Anwendung derzeit statischer Inhalt bereitgestellt wird, benötigen Sie dafür einen anderen Speicherort. Sie können beispielsweise erwägen, statischen Inhalt in Azure Blob Storage zu verschieben und Azure CDN hinzuzufügen, um global eine sehr hohe Downloadgeschwindigkeit zu erzielen. Weitere Informationen finden Sie unter Hosten von statischen Websites in Azure StorageundSchnellstart: Integrieren eines Azure-Speicherkontos in Azure CDN. Sie können den statischen Inhalt auch direkt in einer App im Azure Spring Apps Enterprise-Plan bereitstellen. Weitere Informationen finden Sie unter Bereitstellen statischer Webdateien.

Dynamisch veröffentlichter statischer Inhalt

Wenn Ihre Anwendung statischen Inhalt zulässt, der von Ihrer Anwendung hochgeladen bzw. produziert wird, nach der Erstellung aber unveränderlich ist, können Sie Azure Blob Storage und Azure CDN wie oben beschrieben nutzen. Hierbei können Sie auch eine Azure-Funktion zum Verarbeiten von Uploads und der CDN-Aktualisierung verwenden. Eine entsprechende Beispielimplementierung finden Sie unter Hochladen und CDN-Vorabladen von statischem Inhalt mit Azure Functions. Sie können den statischen Inhalt auch direkt in einer App im Azure Spring Apps Enterprise-Plan bereitstellen. Weitere Informationen finden Sie unter Bereitstellen statischer Webdateien.

Dynamischer oder interner Inhalt

Für Dateien, für die von Ihrer Anwendung häufige Schreib- und Lesevorgänge durchgeführt werden (z. B. temporäre Datendateien), oder für statische Dateien, die nur für Ihre Anwendung sichtbar sind, können Sie lokalen Dateispeicher nutzen, der Ihrem App Service-Plan zugeordnet ist. Weitere Informationen finden Sie unter Betriebssystemfunktionen für Azure App Service und Grundlegendes zum Azure App Service-Dateisystem.

Ermitteln, ob für Ihre Anwendung geplante Aufträge benötigt werden

Für Azure App Service sollten geplante Aufträge, z. B. Quartz Scheduler-Aufgaben oder Unix-Cron-Aufträge, NICHT verwendet werden. Azure App Service hindert Sie nicht an der Bereitstellung einer Anwendung, die intern geplante Aufgaben enthält. Wenn Ihre Anwendung aber horizontal hochskaliert wird, wird derselbe geplante Auftrag unter Umständen mehrmals pro geplantem Zeitraum ausgeführt. Diese Situation kann unerwünschte Konsequenzen haben.

Inventarisieren Sie alle geplanten Aufgaben, die auf Produktionsservern ausgeführt werden, innerhalb oder außerhalb Ihres Anwendungscodes.

Ermitteln, ob eine Verbindung mit der lokalen Umgebung erforderlich ist

Wenn Ihre Anwendung auf Ihre lokalen Dienste zugreifen muss, müssen Sie einen der Konnektivitätsdienste von Azure bereitstellen. Weitere Informationen finden Sie unter Auswählen einer Lösung zum Herstellen einer Verbindung zwischen einem lokalen Netzwerk und Azure. Alternativ müssen Sie Ihre Anwendung so umgestalten, dass öffentlich zugängliche APIs genutzt werden, die von Ihren lokalen Ressourcen verfügbar gemacht werden.

Ermitteln, ob JMS-Warteschlangen oder -Themen (Java Message Service) verwendet werden

Wenn Ihre Anwendung JMS-Warteschlangen oder -Themen nutzt, müssen diese zu einem extern gehosteten JMS-Server migriert werden. Azure Service Bus und das Advanced Message Queuing Protocol (AMQP) können bei Verwendung von JMS eine hervorragende Migrationsstrategie sein. Weitere Informationen finden Sie unter Verwenden von Java Message Service (JMS) mit Azure Service Bus und AMQP 1.0.

Wenn beständige JMS-Speicher konfiguriert wurden, müssen Sie die zugehörige Konfiguration erfassen und nach dem Migrationsvorgang anwenden.

Ermitteln, ob JCA-Connectors genutzt werden

Falls Ihre Anwendung JCA-Connectors verwendet, sollten Sie sich vergewissern, dass der JCA-Connector in JBoss EAP genutzt werden kann. Wenn der JCA-Connector in JBoss EAP genutzt werden kann, müssen Sie die JAR-Dateien dem Serverklassenpfad hinzufügen und die erforderlichen Konfigurationsdateien in den JBoss EAP-Serververzeichnissen platzieren, damit der Connector verfügbar ist.

Ermitteln, ob JAAS verwendet wird

Wenn für Ihre Anwendung JAAS verwendet wird, müssen Sie erfassen, wie JAAS konfiguriert wird. Sofern hierfür eine Datenbank verwendet wird, können Sie sie in eine JAAS-Domäne unter JBoss EAP konvertieren. Falls es sich um eine benutzerdefinierte Implementierung handelt, müssen Sie überprüfen, ob sie unter JBoss EAP verwendet werden kann.

Ermitteln, ob Ihre Anwendung einen Ressourcenadapter verwendet

Wenn für Ihre Anwendung ein Ressourcenadapter (RA) benötigt wird, muss dieser mit JBoss EAP kompatibel sein. Ermitteln Sie, ob der RA für eine eigenständige Instanz von JBoss EAP richtig funktioniert, indem Sie ihn auf dem Server bereitstellen und entsprechend konfigurieren. Falls der RA richtig funktioniert, müssen Sie die JARs dem Serverklassenpfad der App Service-Instanz hinzufügen und die erforderlichen Konfigurationsdateien in den JBoss EAP-Serververzeichnissen ablegen, um die Verfügbarkeit sicherzustellen.

Ermitteln, ob Ihre Anwendung aus mehreren WAR-Dateien besteht

Besteht Ihre Anwendung aus mehreren WAR-Dateien, sollten Sie die einzelnen WAR-Dateien als separate Anwendungen behandeln und für jede Datei diese Anleitung ausführen.

Ermitteln, ob Ihre Anwendung als EAR-Datei gepackt ist

Ist Ihre Anwendung als EAR-Datei gepackt, untersuchen Sie die Datei application.xml, und erfassen Sie die Konfiguration.

Hinweis

Falls Sie Ihre Webanwendungen einzeln skalieren möchten, um eine bessere Nutzung Ihrer App Service-Ressourcen zu erzielen, sollten Sie die EAR-Datei in separate Webanwendungen unterteilen.

Ermitteln aller externen Prozesse und Daemons, die auf den Produktionsservern ausgeführt werden

Werden einige Ihrer Prozesse außerhalb des Anwendungsservers ausgeführt (z. B. die Überwachung von Daemons), müssen Sie sie beseitigen oder zu einem anderen Ort migrieren.

Durchführen von direkten Tests

Migrieren Sie Ihre Anwendung vor dem Erstellen von Containerimages zu den Versionen des JDK und von JBoss EAP, die Sie für App Service nutzen möchten. Führen Sie für die Anwendung gründliche Tests durch, um die Kompatibilität und Leistung sicherzustellen.

JBoss EAP in App Service: Hinweise zu Features

Beachten Sie bei Verwendung von JBoss EAP in App Service unbedingt die folgenden Hinweise.

  • JBoss EAP-Verwaltungskonsole: Die JBoss-Webkonsole wird in App Service nicht verfügbar gemacht. Stattdessen werden die Verwaltungs-APIs für Ihre Anwendung über das Azure-Portal bereitgestellt, und Sie sollten für die Bereitstellung die Azure CLI, das Azure Maven-Plug-In oder andere Azure-Entwicklungstools verwenden.

  • Transaktionen: Da die Anwendungsinstanzen zustandslos ausgeführt werden, wird die Transaktionen-API derzeit nicht unterstützt. Weitere Informationen finden Sie in der Red Hat-Dokumentation unter Verwalten von Transaktionen unter JBoss EAP.

  • Modus „Verwaltete Domänen“: In einer Produktionsumgebung mit mehreren Servern werden im Modus „Verwaltete Domänen“ in JBoss EAP zentralisierte verwaltete Funktionen bereitgestellt. Bei Verwendung von JBoss EAP in App Service übernimmt aber die App Service-Plattform die Zuständigkeit für die Konfiguration und Verwaltung Ihrer Serverinstanzen. Der App-Dienst beseitigt die Notwendigkeit für den verwalteten Do Standard modus von JBoss EAP. Der Domänenmodus ist eine gute Wahl für VM-basierte Bereitstellungen mit mehreren Servern. Weitere Informationen finden Sie in der Red Hat-Dokumentation unter Informationen zu verwalteten Domänen.

  • Server-zu-Server-Clustering: Ab dem 15. März 2022 wird die gruppierte Bereitstellung von JBoss EAP in der öffentlichen Vorschau unterstützt. Diese Unterstützung bedeutet, dass Sie die folgenden Features nicht mehr aus Ihren Anwendungen entfernen müssen, bevor Sie sie in App Service bereitstellen können:

    • Zustandsbehaftete Sitzungsbohnen.
    • Verteilte Transaktionen.
    • Ähnliche Features, die eine Instanz-zu-Instanz-Kommunikation oder hohe Verfügbarkeit erfordern.

    Weitere Informationen finden Sie in der Veröffentlichungsankündigung und im Abschnitt "Clustering in JBoss EAP" unter "Configure a Java app for Azure-App Service".

Migration

Red Hat Migration Toolkit für Apps

Das Red Hat Migration Toolkit for Applications ist eine kostenlose Erweiterung für Visual Studio Code. Diese Erweiterung analysiert Ihren Anwendungscode und Ihre Konfiguration, um Empfehlungen für die Migration von der lokalen Bereitstellung in die Cloud bereitzustellen. Weitere Informationen finden Sie in der Übersicht über das Migrations-Toolkit für Applikationen.

Der Inhalt dieses Leitfadens hilft Ihnen, die anderen Komponenten der Migrationsreise zu behandeln, z. B. die Auswahl des richtigen App Service Plan-Typs, das Externalisieren des Sitzungszustands und die Verwendung von Azure zum Verwalten Ihrer EAP-Instanzen anstelle der JBoss-Verwaltungsschnittstelle.

Bereitstellen von Azure App Service für die JBoss EAP-Runtime

Verwenden Sie die folgenden Befehle, um eine Ressourcengruppe und einen Azure App Service-Plan zu erstellen. Nachdem der App Service-Plan erstellt wurde, wird mit der JBoss EAP-Runtime ein Linux-Web-App-Plan erstellt. Sie können JBoss EAP-Websites nur unter den App Service-Plantarifen „PremiumV3“ und „IsolatedV2“ erstellen.

Vergewissern Sie sich, dass die angegebenen Umgebungsvariablen über die richtigen Werte verfügen.

Hinweis

Bei „PremiumV3“ und „IsolatedV2“ können Preise für reservierte Instanzen angewendet werden, und dies kann für Sie zu einer Reduzierung der Kosten führen. Weitere Informationen zu App Service-Plantarifen und Preisen für reservierte Instanzen finden Sie unter App Service-Preise.

az group create --resource-group $resourceGroup --location eastus
az acr create --resource-group $resourceGroup --name $acrName --sku Standard
az appservice plan create \
    --resource-group $resourceGroup \
    --name $jbossAppService \
    --is-linux \
    --sku P1V2
az webapp create \
    --resource-group $resourceGroup \
    --name $jbossWebApp \
    --plan $jbossAppServicePlan \
    --runtime "JBOSSEAP|7-java8"
    #  Or use "JBOSSEAP|7-java11" if you're using Java 11

Erstellen der Anwendung

Führen Sie den Buildvorgang für die Anwendung mit dem folgenden Maven-Befehl durch.

mvn clean install -DskipTests

Bereitstellen der Anwendung

Wenn Ihre Anwendung über eine Maven-POM-Datei erstellt wurde, sollten Sie das Web-App-Plug-In für Maven verwenden, um die Web-App zu erstellen und Ihre Anwendung bereitzustellen. Weitere Informationen finden Sie in der Schnellstartanleitung: Erstellen einer Java-App auf Azure-App Service.

Für die Automatisierung der Bereitstellung von JBoss EAP-Anwendungen können Sie die Azure Pipelines-Aufgabe für Web-Apps oder die GitHub-Aktion für die Bereitstellung für Azure-Web-Apps verwenden.

Einrichten von Datenquellen

Das Registrieren einer Datenquelle in JBoss EAP umfasst drei Hauptschritte: Hochladen des JDBC-Treibers, Hinzufügen des JDBC-Treibers als Modul und Registrieren des Moduls. Weitere Informationen finden Sie in der JBoss EAP-Dokumentation im Artikel zur Datenquellenverwaltung. App Service ist ein zustandsloser Hostingdienst, weshalb die Konfigurationsbefehle zum Hinzufügen und Registrieren des Datenquellenmoduls als Skript geschrieben und beim Start des Containers angewendet werden müssen.

Führen Sie die folgenden Schritte aus, um Datenquellen einzurichten.

  1. Rufen Sie den JDBC-Treiber Ihrer Datenbank ab.

  2. Erstellen Sie eine XML-Moduldefinitionsdatei für den JDBC-Treiber. Das folgende Beispiel zeigt eine Moduldefinition für PostgreSQL. Achten Sie darauf, dass Sie den Wert resource-root path durch den Pfad zum von Ihnen verwendeten JDBC-Treiber ersetzen.

    <?xml version="1.0" ?>
    <module xmlns="urn:jboss:module:1.1" name="org.postgres">
        <resources>
        <!-- ***** IMPORTANT: REPLACE THIS PLACEHOLDER *******-->
        <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" />
        </resources>
        <dependencies>
            <module name="javax.api"/>
            <module name="javax.transaction.api"/>
        </dependencies>
    </module>
    
  3. Fügen Sie Ihre JBoss-CLI-Befehle in eine Datei mit dem Namen jboss-cli-commands.cli ein. Die JBoss-Befehle müssen das Modul hinzufügen und es als Datenquelle registrieren. Das folgende Beispiel zeigt die JBoss-CLI-Befehle für PostgreSQL.

    module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml
    
    /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource)
    
    data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
    
  4. Erstellen Sie ein Startskript mit dem Namen startup_script.sh, über das die JBoss-CLI-Befehle aufgerufen werden. Das unten angegebene Beispiel veranschaulicht, wie Sie Ihre Datei jboss-cli-commands.cli aufrufen. Später konfigurieren Sie dann App Service für die Ausführung dieses Skripts, wenn die Instanz gestartet wird.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
    
  5. Laden Sie mit einem FTP-Client Ihrer Wahl den JDBC-Treiber, jboss-cli-commands.cli, startup_script.sh und die Moduldefinition in /site/deployments/tools/ hoch.

  6. Konfigurieren Sie Ihre Site so, dass startup_script.sh ausgeführt wird, wenn der Container gestartet wird. Navigieren Sie im Azure-Portal zum Befehl "Allgemeine > Konfiguration" Einstellungen > Startbefehl. Legen Sie das Feld für den Startbefehl auf /home/site/deployments/tools/startup_script.sh fest, und wählen Sie anschließend Speichern aus.

  7. Starten Sie die Web-App neu, um zu erreichen, dass sie das Konfigurationsskript ausführt.

  8. Aktualisieren Sie die Konfiguration der JTA-Datenquelle für Ihre Anwendung. Öffnen Sie die Datei src/main/resources/META-INF/persistence.xml für Ihre Anwendung und suchen Sie das Element <jta-data-source>. Ersetzen Sie seinen Inhalt wie folgt:

    <jta-data-source>java:jboss/datasources/postgresDS</jta-data-source>
    

Erstellen der Anwendung

Führen Sie den Buildvorgang für die Anwendung mit dem folgenden Maven-Befehl durch.

mvn clean install -DskipTests

Bereitstellen der Anwendung

Wenn Ihre Anwendung über eine Maven-POM-Datei erstellt wurde, sollten Sie das Web-App-Plug-In für Maven verwenden, um die Web-App zu erstellen und Ihre Anwendung bereitzustellen. Weitere Informationen finden Sie in der Schnellstartanleitung: Erstellen einer Java-App auf Azure-App Service.

Für die Automatisierung der Bereitstellung von JBoss EAP-Anwendungen können Sie die Azure Pipelines-Aufgabe für Web-Apps oder die GitHub-Aktion für die Bereitstellung für Azure-Web-Apps verwenden.

Nach der Migration

Nachdem Sie Ihre Anwendung nun zu Azure App Service migriert haben, sollten Sie sich vergewissern, dass sie wie erwartet funktioniert. Anschließend können Sie sich dann über unsere Empfehlungen informieren, mit denen Sie Ihre Anwendung cloudnativer gestalten können.

Empfehlungen