本文說明如何在 App Service 中設定 Java SE、Tomcat 或 JBoss 應用程式中的資料來源。
Azure App Service 會以三種變體在完全受控的服務上執行 Java Web 應用程式:
- Java Standard Edition (SE):可以執行部署為 Java Archive (JAR) 套件的應用程式,其中包含內嵌伺服器(例如 Spring Boot、Quarkus、Dropwizard 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
- Tomcat:內建 Tomcat 伺服器可以執行部署為 Web 應用程式封存 (WAR) 套件的應用程式。
- JBoss 企業應用程式平臺 (EAP):內建的 JBoss EAP 伺服器可以執行部署為 WAR 或企業封存 (EAR) 套件的應用程式。 支援 Linux 應用程式中包括免費、進階 v3 和隔離式方案 v2.gti 的一系列價格層。
備註
App Service 上的 JBoss EAP 現在支援「自備授權」(BYOL) 計費,這可讓擁有現有 Red Hat 訂用帳戶的客戶將這些授權直接套用至 Azure App Service 上的 JBoss EAP 部署。 深入瞭解。
設定資料來源
若要連線到 Spring Boot 應用程式中的數據源,建議您建立連接字串,並將其插入 application.properties 檔案中。
在 App Service 頁面的 [設定] 區段中,設定字串的名稱,在 [值] 欄位中貼上 JDBC 連接字串,並將類型設定為 [自訂]。 您可以選擇將此連接字串設定為位置設定。
此連接字串可以名為
CUSTOMCONNSTR_<your-string-name>的環境變數提供應用程式存取。 例如:CUSTOMCONNSTR_exampledb。在您的 application.properties 檔案中,使用環境變數名稱參考此連接字串。 在我們的範例中,我們會使用下列程式碼:
app.datasource.url=${CUSTOMCONNSTR_exampledb}
如需詳細資訊,請參閱有關數據存取和外部化組態的 Spring Boot 檔。
秘訣
Linux Tomcat 容器可以透過將環境變數 WEBSITE_AUTOCONFIGURE_DATABASE 設定為 true,在 Tomcat 伺服器中自動為您設定共用資料來源。 唯一要做的就是將包含有效 JDBC 連接字串的應用程式設定新增至 Oracle、SQL Server、PostgreSQL 或 MySQL 資料庫(包括連接認證),而 App Service 會自動使用容器中可用的適當驅動程式,將對應的共用資料庫新增至 /usr/local/tomcat/conf/context.xml。 如需使用此方法的端對端案例,請參閱 教學課程:使用Linux和 MySQL 上的 Azure App Service 建置 Tomcat Web 應用程式。
這些指示適用於所有資料庫連線。 您必須在預留位置中填入您所選資料庫的驅動程式類別名稱和 JAR 檔案。 下表提供常見資料庫的類別名稱和驅動程式下載。
| 資料庫 | 驅動程式類別名稱 | JDBC 驅動程式 |
|---|---|---|
| PostgreSQL | org.postgresql.Driver |
下載 |
| MySQL | com.mysql.jdbc.Driver |
下載 (選擇[平台獨立] ) |
| SQL Server | com.microsoft.sqlserver.jdbc.SQLServerDriver |
下載 |
若要設定讓 Tomcat 使用「Java 資料庫連線」(JDBC) 或「Java 保存 API」(JPA),請先自訂 Tomcat 在啟動時所讀入的 CATALINA_OPTS 環境變數。 透過 App Service Maven 外掛程式中的應用程式設定來設定這些值:
<appSettings>
<property>
<name>CATALINA_OPTS</name>
<value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
</property>
</appSettings>
或是在 Azure 入口網站的 [設定]>[應用程式設定] 頁面中設定環境變數。
接著,決定資料來源應僅供在 Tomcat Servlet 上執行的一個應用程式還是所有應用程式使用。
應用程式層級資料來源
若要設定應用程式層級資料來源:
在專案的META-INF/ 目錄中建立 context.xml 檔案。 如果 META-INF/ 目錄不存在,請加以建立。
在 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>更新應用程式的 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>
共用伺服器層級資源
秘訣
Linux Tomcat 容器可以使用以下約定對複製到 /home/site/wwwroot 的檔案自動套用 XSLT 檔案:如果 server.xml.xsl 或 server.xml.xslt 存在,將會應用於 Tomcat 的 server.xml。 如果 context.xml.xsl 和 context.xml.xslt 存在,它們將被應用於 Tomcat 的 context.xml。
新增共用的伺服器層級資料來源需要您編輯 Tomcat 的 server.xml。 由於目錄外的 /home 檔案變更是暫時的,因此需要以程式設計方式套用對 Tomcat 設定檔的變更,如下所示:
您的啟動 Script 會將 XSL 轉換 至檔案 server.xml ,並將產生的 XML 檔案輸出至 /usr/local/tomcat/conf/server.xml。 啟動腳本需安裝libxslt或xlstproc,這取決於 Web 應用程式所使用的 Tomcat 版本的發行版。 您的 XSL 檔案和啟動指令碼可以透過 FTP 上傳。 以下是啟動指令碼範例。
# Install the libxslt package on Alpine-based images:
apk add --update libxslt
# Install the xsltproc package on Debian or Ubuntu-based images:
apt install xsltproc
# Also copy the transform file to /home/tomcat/conf/
# 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(., '<Connector') and
(contains(., 'scheme="https"') or
contains(., "scheme='https'"))]">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
<xsl:template match="Service[not(Connector[@scheme = 'https'] or
comment()[contains(., '<Connector') and
(contains(., 'scheme="https"') or
contains(., "scheme='https'"))]
)]
">
<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>
</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 類別路徑中,然後重新啟動您的 App Service。
- 請確定 Tomcat classloader 可以使用 JDBC 驅動程式檔案,方法是將它們放在 [/home/site/lib] 目錄中。 在 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
如果您已建立伺服器層級的資料來源,請重新啟動 App Service Linux 應用程式。 Tomcat 會將 CATALINA_BASE 重設為 /home/tomcat,並使用更新後的設定。
秘訣
根據預設,Linux JBoss 容器可以在 JBoss 伺服器中自動為您設定共用資料來源。 您唯一要做的就是將包含有效 JDBC 連接字串(包括連線認證)的應用程式設定新增至 Oracle、SQL Server、PostgreSQL 或 MySQL 資料庫,並將應用程式設定 / 環境變數 WEBSITE_AUTOCONFIGURE_DATABASE 設定為值 true。 也支援使用 Service Connector 建立的 JDBC 連線。 App Service 會使用容器中可用的適當驅動程式,自動新增對應的共用資料來源 (根據應用程式設定名稱和尾碼 _DS)。 如需使用此方法的端對端案例,請參閱 教學課程:使用Linux和 MySQL 上的 Azure App Service 建置 JBoss Web 應用程式。
向 JBoss EAP 註冊數據源時,有三個核心步驟:
- 上傳 JDBC 驅動程式。
- 將 JDBC 驅動程式新增為模組。
- 使用模組新增資料來源。
App Service 是無狀態裝載服務,因此您必須將這些步驟放入啟動指令碼中,並在每次 JBoss 容器啟動時執行。 以 PostgreSQL、MySQL 和 SQL Database 為例:
備註
App Service 上的 JBoss EAP 現在支援「自備授權」(BYOL) 計費,這可讓擁有現有 Red Hat 訂用帳戶的客戶將這些授權直接套用至 Azure App Service 上的 JBoss EAP 部署。 深入瞭解。
將您的 JBoss CLI 命令放入名為 jboss-cli-commands.cli 的檔案中。 JBoss 命令必須新增模組,並將其註冊為資料來源。 下列範例顯示 JBoss CLI 命令,用來建立具有 JNDI 名稱
java:jboss/datasources/postgresDS的 PostgreSQL 資料來源。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_HOST、DB_USERNAME和DB_PASSWORD),您必須在 App Service 中新增為應用程式設定。 指令碼會新增它們,而不加上--resolve-parameter-values旗標,讓 JBoss 不會以純文字儲存其值。建立會呼叫 JBoss CLI 命令的啟動腳本 startup.sh。 下列範例顯示如何呼叫
jboss-cli-commands.cli。 稍後,您會設定 App Service,以在容器啟動時執行此指令碼。$JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss_cli_commands.cli使用您選擇的部署選項,將 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如需詳細資訊,請參閱 將檔案部署至 App Service。
若要確認資料來源已新增至 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 參考檔。