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

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

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 应用服务作为目标。

配置数据源

若要连接 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 服务器中为你配置共享数据源。 你唯一需要做的就是添加包含用于连接到 Oracle、SQL Server、PostgreSQL 或 MySQL 数据库的有效 JDBC 连接字符串(包括连接凭据)的应用设置,这样应用服务便会自动使用容器中可用的适当驱动程序来将相应共享数据库添加到 /usr/local/tomcat/conf/context.xml。

这些说明适用于所有数据库连接。 你需要使用你所选数据库的驱动程序类名称和 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/ 目录中创建一个 META-INF/ 文件 。 如果没有 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 安装,因为安装位置是只读的。 若要对 Windows Tomcat 安装进行服务器级配置更改,最简单的方法是在应用启动时执行以下操作:

  1. 将 Tomcat 复制到本地目录 (%LOCAL_EXPANDED%),并将其用作 CATALINA_BASE(请参阅有关此变量的 Tomcat 文档)。
  2. 使用 XSL 转换将共享数据源添加到 %LOCAL_EXPANDED%\tomcat\conf\server.xml

添加启动文件

%HOME%\site\wwwroot 目录中创建名为 startup.cmd 的文件。 此文件在 Tomcat 服务器启动之前自动运行。 该文件应包含以下内容:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -File  %HOME%\site\configure.ps1

添加 PowerShell 配置脚本

接下来,使用以下代码将名为 configure.ps1 的配置脚本添加到 %HOME%_\site 目录中:

# Locations of xml and xsl files
$target_xml="$Env:LOCAL_EXPANDED\tomcat\conf\server.xml"
$target_xsl="$Env:HOME\site\server.xsl"

# Define the transform function
# Useful if transforming multiple files
function TransformXML{
    param ($xml, $xsl, $output)

    if (-not $xml -or -not $xsl -or -not $output)
    {
        return 0
    }

    Try
    {
        $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
        $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
        $xslt_settings.EnableScript = 1;

        $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
        $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);
        $xslt.Transform($xml, $output);
    }

    Catch
    {
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        echo  'Error'$ErrorMessage':'$FailedItem':' $_.Exception;
        return 0
    }
    return 1
}

# Start here

# Check for marker file indicating that config has already been done
if(Test-Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker"){
    return 0
}

# Delete previous Tomcat directory if it exists
# In case previous config isn't completed or a new config should be forcefully installed
if(Test-Path "$Env:LOCAL_EXPANDED\tomcat"){
    Remove-Item "$Env:LOCAL_EXPANDED\tomcat" Recurse
}

md -Path "$Env:LOCAL_EXPANDED\tomcat"

# Copy Tomcat to local
# Using the environment variable $AZURE_TOMCAT90_HOME uses the 'default' version of Tomcat
New-Item "$Env:LOCAL_EXPANDED\tomcat" -ItemType Directory
Copy-Item -Path "$Env:AZURE_TOMCAT90_HOME\*" "$Env:LOCAL_EXPANDED\tomcat" -Recurse

# Perform the required customization of Tomcat
$success = TransformXML -xml $target_xml -xsl $target_xsl -output $target_xml

# Mark that the operation was a success if successful
if($success){
    New-Item -Path "$Env:LOCAL_EXPANDED\tomcat\config_done_marker" -ItemType File
}

此 PowerShell 将完成以下步骤:

  1. 检查自定义 Tomcat 副本是否已存在。 如果是,则启动脚本可以在此处结束。
  2. 本地复制 Tomcat。
  3. 使用 XSL 转换将共享数据源添加到自定义 Tomcat 的配置中。
  4. 指示配置已成功完成。

添加 XSL 转换文件

自定义内置 Tomcat 安装的常见用例是修改 server.xmlcontext.xmlweb.xml Tomcat 配置文件。 应用服务已修改这些文件以提供平台功能。 若要继续使用这些功能,请在对这些文件进行更改时保留其内容,这一点很重要。 为此,请使用 XSL 转换 (XSLT)

将名为 configure.ps1 的 XSL 转换文件添加到 %HOME%_\site 目录。 可以使用以下 XSL 转换代码将新的连接器节点添加到 server.xml。 开头的“identity transform”将会保留配置文件的原始内容。

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

    <!-- Identity transform: this ensures that the original contents of the file are included in the new file -->
    <!-- Ensure that your transform files include this block -->
    <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>

设置 CATALINA_BASE 应用设置

平台还需要了解自定义版本的 Tomcat 的安装位置。 可以在 CATALINA_BASE 应用设置中设置安装的位置。

可以使用 Azure CLI 更改此设置:

    az webapp config appsettings set -g $MyResourceGroup -n $MyUniqueApp --settings CATALINA_BASE="%LOCAL_EXPANDED%\tomcat"

或者,可以在 Azure 门户中手动更改设置:

  1. 请转到“设置”>“配置”>“应用程序设置”。
  2. 选择“新建应用程序设置”。
  3. 使用以下值创建设置:
    1. 名称CATALINA_BASE
    2. "%LOCAL_EXPANDED%\tomcat"

完成配置

最后,将驱动程序 JAR 放置在 Tomcat 类路径中并重启你的应用服务。 将 JDBC 驱动程序文件放入 /home/site/lib 目录,确保它们可供 Tomcat 类加载器使用。 在 bash 中,为每个驱动程序 JAR 运行 az webapp deploy --type=lib

az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --target-path <jar-name>.jar

后续步骤

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