你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 应用服务中为 Tomcat、JBoss 或 Java SE 应用配置数据源

本文介绍如何在应用服务中配置 Java SE、Tomcat 或 JBoss 应用中的数据源。

Azure 应用服务以三种形式在完全托管的服务上运行 Java Web 应用程序:

  • Java SE - 可以运行作为 JAR 包(其中包含嵌入式服务器)部署的应用(例如 Spring Boot、Dropwizard、Quarkus,或包含嵌入式 Tomcat 或 Jetty 服务器的应用)。
  • Tomcat - 内置的 Tomcat 服务器可以运行作为 WAR 包部署的应用。
  • JBoss EAP - 仅支持“免费”、“高级 v3”和“独立 v2”定价层中的 Linux 应用。 内置的 JBoss EAP 服务器可以运行作为 WAR 或 EAR 包部署的应用。

注意

对于 Spring 应用程序,我们建议使用 Azure Spring Apps。 但是,你仍然可以使用 Azure 应用服务作为目标。 请参阅 Java 工作负荷目标指南以获取建议。

配置数据源

若要连接 Spring Boot 中的数据源,我们建议创建连接字符串并将它们注入 application.properties 文件中。

  1. 在应用服务页面的“配置”部分,为字符串设置一个名称,将 JDBC 连接字符串粘贴到值字段中,然后将类型设置为“自定义”。 你可以选择将此连接字符串设置为槽设置。

    此连接字符串可作为名为 CUSTOMCONNSTR_<your-string-name> 的环境变量供应用程序访问。 例如 CUSTOMCONNSTR_exampledb

  2. application.properties 文件中,通过环境变量名称引用此连接字符串。 在我们的示例中,我们将使用以下代码:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

有关详细信息,请参阅有关数据访问的 Spring Boot 文档外部化配置

提示

默认情况下,Linux Tomcat 容器可以自动在 Tomcat 服务器中为你配置共享数据源。 你需要执行的唯一操作是将包含有效 JDBC 连接字符串的应用设置添加到 Oracle、SQL Server、PostgreSQL 或 MySQL 数据库(包括连接凭据),然后,应用服务会自动使用容器中提供的适当驱动程序将相应共享数据库添加到 /usr/local/tomcat/conf/context.xml。 有关使用此方法的端到端方案,请参阅教程:使用 Linux 上的 Azure 应用服务和 MySQL 生成 Tomcat Web 应用

这些说明适用于所有数据库连接。 你需要使用你所选数据库的驱动程序类名称和 JAR 文件来填充占位符。 下面提供了一个表,其中包含了常见数据库的类名称和驱动程序下载。

数据库 驱动程序类名称 JDBC 驱动程序
PostgreSQL org.postgresql.Driver 下载
MySQL com.mysql.jdbc.Driver 下载(选择“独立于平台”)
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver 下载

若要将 Tomcat 配置为使用 Java Database Connectivity (JDBC) 或 Java 持久性 API (JPA),请先自定义在启动时由 Tomcat 读取的 CATALINA_OPTS 环境变量。 在应用服务 Maven 插件中通过某个应用设置来设置这些值:

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

或者在 Azure 门户的“配置”>“应用程序设置”页中设置环境变量。

接下来,确定数据源应当供一个应用程序使用,还是供在 Tomcat servlet 上运行的所有应用程序使用。

应用程序级的数据源

  1. 在项目的 META-INF/ 目录中创建一个 context.xml 文件。 如果没有 META-INF/ 目录,请创建一个。

  2. context.xml 中,添加一个 Context 元素以将数据源链接到 JNDI 地址。 将 driverClassName 占位符替换为上表中你的驱动程序的类名称。

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. 更新应用程序的 web.xml 以便在应用程序中使用该数据源。

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

共享的服务器级资源

添加共享的服务器级数据源需要编辑 Tomcat 的 server.xml。 执行此操作的最可靠方法是:

  1. 上传启动脚本,然后在“配置”>“启动命令”中设置指向该脚本的路径。 你可以使用 FTP 上传启动脚本。

启动脚本将进行 xsl 转换,转换为 server.xml 文件,并将所得的 xml 文件输出到 /usr/local/tomcat/conf/server.xml。 启动脚本应通过 apk 安装 libxslt。 你的 xsl 文件和启动脚本均可通过 FTP 上传。 下面是一个示例启动脚本。

# 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

以下示例 XSL 文件向 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 Connector 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>

完成配置

最后,将驱动程序 JAR 放置在 Tomcat 类路径中并重启你的应用服务。

  1. 将 JDBC 驱动程序文件放入 /home/site/lib 目录,确保它们可供 Tomcat 类加载器使用。 在 Cloud Shell 中,为每个驱动程序 JAR 运行 az webapp deploy --type=lib
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

如果你创建了服务器级数据源,请重启应用服务 Linux 应用程序。 Tomcat 会将 CATALINA_BASE 重置为 /home/tomcat 并使用更新的配置。

提示

默认情况下,Linux JBoss 容器可以自动在 JBoss 服务器中为你配置共享数据源。 你需要执行的唯一操作是将包含有效 JDBC 连接字符串的应用设置添加到 Oracle、SQL Server、PostgreSQL 或 MySQL 数据库(包括连接凭据),然后,应用服务会自动使用容器中提供的适当驱动程序添加相应的共享数据源。 有关使用此方法的端到端方案,请参阅教程:在 Linux 上使用 Azure 应用服务和 MySQL 生成 JBoss Web 应用

使用 JBoss EAP 注册数据源时,需要执行三个核心步骤:

  1. 上传 JDBC 驱动程序。
  2. 将 JDBC 驱动程序添加为模块。
  3. 使用模块添加数据源。

应用服务是无状态托管服务,因此,每次 JBoss 容器启动时,都必须将这些步骤放入启动脚本中并运行它。 使用 PostgreSQL、MySQL 和 SQL 数据库作为示例:

  1. 将 JBoss CLI 命令放入名为“jboss-cli-commands.cli”的文件中。 JBoss 命令必须添加模块,并将其注册为数据源。 以下示例演示了用于创建 JNDI 名称为 java:jboss/datasources/postgresDS 的 PostgreSQL 数据源的 JBoss CLI 命令。

    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
    

    请注意,该 module add 命令使用了三个环境变量(DB_HOSTDB_USERNAMEDB_PASSWORD),在应用服务中,必须将其添加为应用设置。 该脚本在没有 --resolve-parameter-values 标志的情况下添加它们,以便 JBoss 不会以纯文本形式保存其值。

  2. 创建调用 JBoss CLI 命令的启动脚本 startup.sh。 以下示例展示了如何调用你的 jboss-cli-commands.cli。 稍后,将应用服务配置为在容器启动时运行此脚本。

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss_cli_commands.cli
    
  3. 使用所选的部署选项,将 JDBC 驱动程序、jboss-cli-commands.cli 和 startup.sh 上传到相应脚本中指定的路径。 特别要将 startup.sh 作为启动文件上传。 例如:

    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
    

    有关详细信息,请参阅将文件部署到应用程序服务

要确认是否已将数据源添加到 JBoss 服务器,请使用 SSH 进入 webapp 并运行 $JBOSS_HOME/bin/jboss-cli.sh --connect。 连接到 JBoss 后,请运行 /subsystem=datasources:read-resource 来打印数据源列表。

如之前由 jboss-cli-commands.cli 定义所示,可以使用 JNDI 名称 java:jboss/datasources/postgresDS 访问 PostgreSQL 连接。

后续步骤

请访问面向 Java 开发人员的 Azure 中心查找 Azure 快速入门、教程和 Java 参考文档。