Delen via


Gegevensbronnen configureren voor een Tomcat-, JBoss- of Java SE-app in Azure-app Service

In dit artikel wordt beschreven hoe u gegevensbronnen configureert in een Java SE-, Tomcat- of JBoss-app in App Service.

Azure-app Service voert Java-webtoepassingen uit op een volledig beheerde service in drie varianten:

  • Java SE: kan een app uitvoeren die is geïmplementeerd als een JAR-pakket dat een ingesloten server bevat (zoals Spring Boot, Dropwizard, Quarkus of een met een ingesloten Tomcat- of Jetty-server).
  • Tomcat: de ingebouwde Tomcat-server kan een app uitvoeren die is geïmplementeerd als een WAR-pakket.
  • JBoss EAP : alleen ondersteund voor Linux-apps in de prijscategorieën Free, Premium v3 en Isolated v2. De ingebouwde JBoss EAP-server kan een app uitvoeren die is geïmplementeerd als WAR- of EAR-pakket.

Notitie

Voor Spring-toepassingen wordt u aangeraden Azure Spring Apps te gebruiken. U kunt echter nog steeds Azure-app Service als bestemming gebruiken. Zie de richtlijnen voor java-workloadbestemmingen voor advies.

De gegevensbron configureren

Als u verbinding wilt maken met gegevensbronnen in Spring Boot-toepassingen, raden we u aan om verbindingsreeks s te maken en deze in uw bestand application.properties te injecteren.

  1. Stel in de sectie Configuratie van de App Service-pagina een naam in voor de tekenreeks, plak uw JDBC-verbindingsreeks in het waardeveld en stel het type in op 'Aangepast'. U kunt deze verbindingsreeks desgewenst instellen als site-instelling.

    Deze verbindingsreeks is toegankelijk voor onze toepassing als een omgevingsvariabele met de naam CUSTOMCONNSTR_<your-string-name>. Bijvoorbeeld: CUSTOMCONNSTR_exampledb.

  2. Raadpleeg in het bestand application.properties deze verbindingsreeks met de naam van de omgevingsvariabele. In ons voorbeeld gebruiken we de volgende code:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

Zie de Spring Boot-documentatie over gegevenstoegang en externe configuraties voor meer informatie.

Tip

Standaard kunnen de Linux Tomcat-containers automatisch gedeelde gegevensbronnen voor u configureren op de Tomcat-server. U hoeft alleen maar een app-instelling toe te voegen die een geldige JDBC-verbindingsreeks bevat aan een Oracle-, SQL Server-, PostgreSQL- of MySQL-database (inclusief de verbindingsreferenties) en App Service voegt automatisch de bijbehorende gedeelde database toe aan /usr/local/tomcat/conf/context.xml, met behulp van een geschikt stuurprogramma dat beschikbaar is in de container. Zie Zelfstudie: Een Tomcat-web-app bouwen met Azure-app Service op Linux en MySQL voor een end-to-end scenario met behulp van deze benadering.

Deze instructies zijn van toepassing op alle databaseverbindingen. U moet tijdelijke aanduidingen invullen met de stuurprogrammaklassenaam en het JAR-bestand van de gekozen database. Opgegeven is een tabel met klassenamen en stuurprogrammadownloads voor algemene databases.

Database Naam van stuurprogrammaklasse JDBC-stuurprogramma
PostgreSQL org.postgresql.Driver Downloaden
MySQL com.mysql.jdbc.Driver Downloaden (Platformonafhankelijk selecteren)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver Downloaden

Als u Tomcat wilt configureren voor het gebruik van Java Database Connectivity (JDBC) of de Java Persistence-API (JPA), past u eerst de CATALINA_OPTS omgevingsvariabele aan die wordt gelezen door Tomcat bij het opstarten. Stel deze waarden in via een app-instelling in de App Service Maven-invoegtoepassing:

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

Of stel de omgevingsvariabelen in op de pagina Configuratietoepassingsinstellingen> in Azure Portal.

Bepaal vervolgens of de gegevensbron beschikbaar moet zijn voor één toepassing of voor alle toepassingen die worden uitgevoerd op de Tomcat-servlet.

Gegevensbronnen op toepassingsniveau

  1. Maak een context.xml-bestand in de META-INF/ -map van uw project. Maak de META-INF/ -map als deze niet bestaat.

  2. Voeg in context.xml een Context element toe om de gegevensbron te koppelen aan een JNDI-adres. Vervang de tijdelijke aanduiding door de driverClassName klassenaam van het stuurprogramma uit de bovenstaande tabel.

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. Werk de web.xml van uw toepassing bij om de gegevensbron in uw toepassing te gebruiken.

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

Gedeelde resources op serverniveau

Als u een gedeelde gegevensbron op serverniveau toevoegt, moet u de server.xml van Tomcat bewerken. De meest betrouwbare manier om dit te doen is als volgt:

  1. Upload een opstartscript en stel het pad in naar het script in de configuratie-opstartopdracht>. U kunt het opstartscript uploaden met FTP.

Uw opstartscript maakt een xsl-transformatie naar het server.xml-bestand en voert het resulterende XML-bestand uit naar /usr/local/tomcat/conf/server.xml. Het opstartscript moet libxslt installeren via apk. Het xsl-bestand en het opstartscript kunnen worden geüpload via FTP. Hieronder ziet u een voorbeeld van een opstartscript.

# 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

In het volgende voorbeeld voegt het XSL-bestand een nieuw connectorknooppunt toe aan de Tomcat-server.xml.

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

Configuratie voltooien

Plaats ten slotte het stuurprogramma-JAR's in het Tomcat-klassepad en start uw App Service opnieuw op.

  1. Zorg ervoor dat de JDBC-stuurprogrammabestanden beschikbaar zijn voor de Tomcat-klasseloader door ze in de map /home/site/lib te plaatsen. Voer in Cloud Shell uit az webapp deploy --type=lib voor elk JAR-stuurprogramma:
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

Als u een gegevensbron op serverniveau hebt gemaakt, start u de App Service Linux-toepassing opnieuw. Tomcat wordt opnieuw ingesteld CATALINA_BASE /home/tomcat op en gebruikt de bijgewerkte configuratie.

Tip

Standaard kunnen de Linux JBoss-containers automatisch gedeelde gegevensbronnen voor u configureren op de JBoss-server. U hoeft alleen maar een app-instelling toe te voegen die een geldige JDBC-verbindingsreeks bevat aan een Oracle-, SQL Server-, PostgreSQL- of MySQL-database (inclusief de verbindingsreferenties) en App Service voegt automatisch de bijbehorende gedeelde gegevensbron toe met behulp van een geschikt stuurprogramma dat beschikbaar is in de container. Zie Zelfstudie: Een JBoss-web-app bouwen met Azure-app Service op Linux en MySQL voor een end-to-end scenario met behulp van deze benadering.

Er zijn drie kernstappen bij het registreren van een gegevensbron bij JBoss EAP:

  1. Upload het JDBC-stuurprogramma.
  2. Voeg het JDBC-stuurprogramma toe als een module.
  3. Voeg een gegevensbron toe met de module.

App Service is een staatloze hostingservice, dus u moet deze stappen in een opstartscript plaatsen en uitvoeren telkens wanneer de JBoss-container wordt gestart. PostgreSQL, MySQL en SQL Database gebruiken als voorbeelden:

  1. Plaats uw JBoss CLI-opdrachten in een bestand met de naam jboss-cli-commands.cli. De JBoss-opdrachten moeten de module toevoegen en registreren als gegevensbron. In het volgende voorbeeld ziet u de JBoss CLI-opdrachten voor het maken van een PostgreSQL-gegevensbron met de JNDI-naam 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
    

    Houd er rekening mee dat de module add opdracht gebruikmaakt van drie omgevingsvariabelen (DB_HOSTDB_USERNAMEenDB_PASSWORD) die u als app-instellingen in App Service moet toevoegen. Het script voegt ze toe zonder de --resolve-parameter-values vlag, zodat JBoss de waarden niet in tekst zonder opmaak opslaat.

  2. Maak een opstartscript, startup.sh, dat de JBoss CLI-opdrachten aanroept. In het volgende voorbeeld ziet u hoe u uw jboss-cli-commands.cliaanroept. Later configureert u App Service om dit script uit te voeren wanneer de container wordt gestart.

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss_cli_commands.cli
    
  3. Upload met behulp van een implementatieoptie naar keuze uw JDBC-stuurprogramma, jboss-cli-commands.cli en startup.sh naar de paden die zijn opgegeven in de respectieve scripts. Upload startup.sh met name als opstartbestand. Voorbeeld:

    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
    

    Zie Bestanden implementeren in App Service voor meer informatie.

Om te bevestigen dat de gegevensbron is toegevoegd aan de JBoss-server, SSH in uw web-app en voert u deze uit $JBOSS_HOME/bin/jboss-cli.sh --connect. Nadat u verbinding hebt gemaakt met JBoss, voert u de /subsystem=datasources:read-resource opdracht uit om een lijst met de gegevensbronnen af te drukken.

Zoals eerder gedefinieerd door jboss-cli-commands.cli , hebt u toegang tot de PostgreSQL-verbinding met behulp van de JNDI-naam java:jboss/datasources/postgresDS.

Volgende stappen

Ga naar het Azure voor Java-ontwikkelaarscentrum om azure-snelstartgidsen, zelfstudies en Java-referentiedocumentatie te vinden.