Freigeben über


Konfigurieren von Datenquellen für eine Tomcat-, JBoss- oder Java SE-App in Azure App Service

In diesem Artikel wird erläutert, wie Datenquellen in einer Java SE-, Tomcat- oder JBoss-App in App Service konfiguriert werden.

Azure App Service führt Java-Webanwendungen auf einem vollständig verwalteten Dienst in drei Varianten aus:

  • Java SE: Kann eine App ausführen, die als JAR-Paket bereitgestellt wird, das einen eingebetteten Server enthält (z. B. Spring Boot, Dropwizard, Quarkus oder eine App mit einem eingebetteten Tomcat- oder Jetty-Server).
  • Tomcat: Der integrierte Tomcat-Server kann eine als WAR-Paket bereitgestellte App ausführen.
  • JBoss EAP: Wird nur für Linux-Apps in den Tarifen „Free“, „Premium v3“ und „V2 isoliert“ unterstützt. Der integrierte JBoss EAP-Server kann eine als WAR- oder EAR-Paket bereitgestellte App ausführen.

Hinweis

Für Spring-Anwendungen wird die Verwendung von Azure Spring Apps empfohlen. Sie können Azure App Service jedoch weiterhin als Ziel verwenden. Weitere Informationen finden Sie unter Java-Workload-Zielleitfaden.

Konfigurieren der Datenquelle

Für das Verbinden mit Datenquellen in Spring Boot-Anwendungen wird empfohlen, Verbindungszeichenfolgen zu erstellen und in Ihre Datei application.properties einzufügen.

  1. Legen Sie auf der App Service-Seite im Abschnitt „Konfiguration“ einen Namen für die Zeichenfolge fest, fügen Sie Ihre JDBC-Verbindungszeichenfolge in das Feld für den Wert ein, und legen Sie den Typ auf „Benutzerdefiniert“ fest. Sie können diese Verbindungszeichenfolge optional als Sloteinstellung festlegen.

    Diese Verbindungszeichenfolge ist für die Anwendung als die Umgebungsvariable CUSTOMCONNSTR_<your-string-name> verfügbar. Beispiel: CUSTOMCONNSTR_exampledb.

  2. Verweisen Sie in Ihrer Datei application.properties über den Namen der Umgebungsvariable auf diese Verbindungszeichenfolge. In unserem Beispiel würden wir folgenden Code verwenden:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Weitere Informationen finden Sie in der Spring Boot-Dokumentation zum Datenzugriff und unter externalisierte Konfigurationen.

Tipp

Standardmäßig können die Linux Tomcat-Container freigegebene Datenquellen automatisch für Sie auf dem Tomcat-Server konfigurieren. Sie müssen lediglich eine App-Einstellung hinzufügen, die eine gültige JDBC-Verbindungszeichenfolge zu einer Oracle-, SQL Server-, PostgreSQL- oder MySQL-Datenbank (einschließlich der Verbindungsanmeldeinformationen) enthält. App Service fügt automatisch die entsprechende freigegebene Datenbank /usr/local/tomcat/conf/context.xml hinzu, wobei ein geeigneter Treiber verwendet wird, der im Container verfügbar ist. Ein End-to-End-Szenario mit diesem Ansatz finden Sie unter Tutorial: Erstellen einer Tomcat-Web-App mit Azure App Service für Linux und MySQL.

Diese Anweisungen gelten für alle Datenbankverbindungen. Für die Platzhalter müssen der Treiberklassenname und die JAR-Datei der ausgewählten Datenbank angegeben werden. In der folgenden Tabelle finden Sie Klassennamen und Treiberdownloads für gängige Datenbanken:

Datenbank Treiberklassenname JDBC-Treiber
PostgreSQL org.postgresql.Driver Download
MySQL com.mysql.jdbc.Driver Download (Wählen Sie „Platform Independent“ (Plattformunabhängig) aus.)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Download

Wenn Sie Tomcat für die Verwendung von Java Database Connectivity (JDBC) oder der Java-Persistenz-API (JPA) konfigurieren möchten, passen Sie zuerst die Umgebungsvariable CATALINA_OPTS an, die von Tomcat beim Start eingelesen wird. Diese Werte können mithilfe einer App-Einstellung im App Service-Maven-Plug-In festgelegt werden:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

Alternativ können Sie die Umgebungsvariablen im Azure-Portal auf der Seite Konfiguration>Anwendungseinstellungen festlegen.

Legen Sie als Nächstes fest, ob die Datenquelle nur für eine einzelne Anwendung oder für alle im Tomcat-Servlet ausgeführten Anwendungen verfügbar sein soll.

Datenquellen auf Anwendungsebene

  1. Erstellen Sie eine context.xml-Datei im Verzeichnis META-INF/ Ihres Projekts. Erstellen Sie das Verzeichnis META-INF/, falls es noch nicht vorhanden ist.

  2. Fügen Sie in context.xml ein Element vom Typ Context hinzu, um die Datenquelle mit einer JNDI-Adresse zu verknüpfen. Ersetzen Sie den Platzhalter driverClassName durch den Klassennamen Ihres Treibers aus der obigen Tabelle.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Aktualisieren Sie die Datei web.xml Ihrer Anwendung, sodass die Datenquelle in Ihrer Anwendung verwendet wird.

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

Gemeinsam verwendete Ressourcen auf Serverebene

Wenn Sie eine freigegebene Datenquelle auf Serverebene hinzufügen, müssen Sie die Datei „server.xml“ von Tomcat bearbeiten. Die zuverlässigste Möglichkeit dazu ist folgende:

  1. Laden Sie ein Startskript hoch, und legen Sie unter Konfiguration>Startbefehl den Pfad des Skripts fest. Das Startskript kann per FTP hochgeladen werden.

Ihr Startskript führt eine XSL-Transformation für die Datei „server.xml“ durch und gibt die resultierende XML-Datei unter /usr/local/tomcat/conf/server.xml aus. Das Startskript muss „libxslt“ per APK installieren. Die XSL-Datei und das Startskript können per FTP hochgeladen werden. Im Anschluss finden Sie ein Beispiel für ein Startskript:

# Install libxslt. Also copy the transform file to /home/tomcat/conf/
apk add --update libxslt

# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

Die folgende XSL-Beispieldatei fügt der Datei „server.xml“ von Tomcat einen neuen Connectorknoten hinzu.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing Connnector if there's one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first Engine if there's no existing Connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

Abschließen der Konfiguration

Platzieren Sie abschließend die JAR-Dateien des Treibers im Tomcat-Klassenpfad, und starten Sie Ihre App Service-Instanz neu.

  1. Stellen Sie sicher, dass die JDBC-Treiberdateien für den Tomcat-Klassenladeprogramm verfügbar sind, indem Sie sie im Verzeichnis /home/site/lib ablegen. Führen Sie in der Cloud Shell az webapp deploy --type=lib für jede Treiber-JAR-Datei aus:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Wenn Sie eine Datenquelle auf Serverebene erstellt haben, starten Sie die App Service-Linux-Anwendung neu. Tomcat setzt CATALINA_BASE auf /home/tomcat zurück und verwendet die aktualisierte Konfiguration.

Tipp

Standardmäßig können die Linux JBoss-Container freigegebene Datenquellen automatisch für Sie auf dem JBoss-Server konfigurieren. Sie müssen lediglich eine App-Einstellung hinzufügen, die eine gültige JDBC-Verbindungszeichenfolge zu einer Oracle-, SQL Server-, PostgreSQL- oder MySQL-Datenbank (einschließlich der Verbindungsanmeldeinformationen) enthält. App Service fügt automatisch die entsprechende freigegebene Datenbankquelle hinzu, wobei ein geeigneter Treiber verwendet wird, der im Container verfügbar ist. Ein End-to-End-Szenario mit diesem Ansatz finden Sie unter Tutorial: Erstellen einer JBoss-Web-App mit Azure App Service für Linux und MySQL.

Es gibt drei wichtige Schritte beim Registrieren einer Datenquelle bei JBoss EAP:

  1. Hochladen des JDBC-Treibers
  2. Hinzufügen des JDBC-Treibers als Modul
  3. Hinzufügen einer Datenquelle mit dem Modul

App Service ist ein zustandsloser Hostingdienst, daher müssen Sie diese Schritte in ein Startskript einfügen und jedes Mal ausführen, wenn der JBoss-Container gestartet wird. Verwenden von PostgreSQL, MySQL und SQL-Datenbank als Beispiele:

  1. 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 zum Erstellen einer PostgreSQL-Datenquelle mit dem JNDI-Namen java:jboss/datasources/postgresDS.

    module add --name=org.postgresql --resources=/home/site/libs/postgresql-42.7.4.jar
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name="org.postgresql.Driver",driver-xa-datasource-class-name="org.postgresql.xa.PGXADataSource")
    data-source add --name=postgresql --driver-name="postgresql" --jndi-name="java:jboss/datasources/postgresDS" --connection-url="jdbc:postgresql://\${env.DB_HOST}:5432/postgres" --user-name="\${env.DB_USERNAME}" --password="\${env.DB_PASSWORD}" --enabled=true --use-java-context=true
    

    Beachten Sie, dass der Befehl module add drei Umgebungsvariablen verwendet (DB_HOST, DB_USERNAMEund DB_PASSWORD), die Sie in App Service als App-Einstellungen hinzufügen müssen. Das Skript fügt sie ohne das --resolve-parameter-values-Flag hinzu, sodass JBoss ihre Werte nicht als Klartext speichert.

  2. Erstellen Sie ein Startskript namens startup.sh, das die JBoss-CLI-Befehle aufruft. Das folgende Beispiel zeigt, wie Sie jboss-cli-commands.cli aufrufen. Später konfigurieren Sie App Service dazu, dieses Skript beim Starten des Containers auszuführen.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss_cli_commands.cli
    
  3. Laden Sie mit einer Bereitstellungsoption Ihrer Wahl den JDBC-Treiber (jboss-cli-commands.cli) und startup.shstartup.sh in die in den jeweiligen Skripts angegebenen Pfade hoch. Laden Sie insbesondere startup.sh als Startdatei hoch. Zum Beispiel:

    export RESOURCE_GROUP_NAME=<resource-group-name>
    export APP_NAME=<app-name>
    
    # The lib type uploads to /home/site/libs by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path postgresql-42.7.4.jar --target-path postgresql-42.7.4.jar --type lib
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path jboss_cli_commands.cli --target-path /home/site/scripts/jboss_cli_commands.cli --type static
    # The startup type uploads to /home/site/scripts/startup.sh by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path startup.sh --type startup
    

    Weitere Informationen finden Sie unter Dateien im App Service bereitstellen.

Um sich zu vergewissern, dass die Datenquelle dem JBoss-Server hinzugefügt wurde, stellen Sie eine SSH-Verbindung mit Ihrer Web-App her, und führen Sie $JBOSS_HOME/bin/jboss-cli.sh --connect aus. Sobald Sie mit JBoss verbunden sind, führen Sie /subsystem=datasources:read-resource aus, um eine Liste der Datenquellen auszugeben.

Wie von jboss-cli-commands.cli zuvor definiert, können Sie über den JNDI-Namen java:jboss/datasources/postgresDS auf die PostgreSQL-Verbindung zugreifen.

Nächste Schritte

Besuchen Sie das Center Azure für Java-Entwickler, um Azure-Schnellstarts, Tutorials und Java-Referenzdokumentation zu finden.