在 Azure App Service 中設定 Tomcat、JBoss 或 Java SE 應用程式的資料來源
本文說明如何在 App Service 中設定 Java SE、Tomcat 或 JBoss 應用程式中的資料來源。
Azure App Service 會以三種變體在完全受控的服務上執行 Java Web 應用程式:
- Java SE - 可以執行部署為包含內嵌伺服器的 JAR 套件的應用程式 (例如 Spring Boot、Dropwizard、Quarkus 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
- Tomcat - 內建 Tomcat 伺服器可以執行部署為 WAR 套件的應用程式。
- JBoss EAP - 僅支援 Premium v3 和隔離 v2 定價層中的 Linux 應用程式。 內建 JBoss EAP 伺服器可以執行部署為 WAR 或 EAR 套件的應用程式。
注意
針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。 如需建議,請參閱 Java 工作負載目的地指導。
設定資料來源
若要連接到 Spring Boot 應用程式中的資料來源,建議您建立連接字串,並將其插入 application.properties 檔案。
在 App Service 頁面的 [設定] 區段中,設定字串的名稱,在 [值] 欄位中貼上 JDBC 連接字串,並將類型設定為 [自訂]。 您可以選擇將此連接字串設定為位置設定。
此連接字串可以名為
CUSTOMCONNSTR_<your-string-name>
的環境變數提供應用程式存取。 例如:CUSTOMCONNSTR_exampledb
。在 application.properties 檔案中,使用環境變數名稱來參考此連接字串。 在我們的範例中,我們會使用下列程式碼:
app.datasource.url=${CUSTOMCONNSTR_exampledb}
如需詳細資訊,請參閱有關資料存取的 Spring Boot 文件和外部化設定。
提示
根據預設,Linux Tomcat 容器可以在 Tomcat 伺服器中自動為您設定共用資料來源。 您唯一的工作是將包含有效 JDBC 連接字串的應用程式設定新增至 Oracle、SQL Server、PostgreSQL 或 MySQL 資料庫 (包括連線認證),App Service 便會自動為您使用容器中可用的適當驅動程式,將對應的共用資料庫新增至 /usr/local/tomcat/conf/context.xml。 如需使用此方法的端對端案例,請參閱教學課程:使用 Linux 上的 App Service 和 MySQL 建置 Tomcat Web 應用程式。
這些指示適用於所有資料庫連線。 您必須在預留位置中填入您所選資料庫的驅動程式類別名稱和 JAR 檔案。 下表提供常見資料庫的類別名稱和驅動程式下載。
Database | 驅動程式類別名稱 | JDBC 驅動程式 |
---|---|---|
PostgreSQL | org.postgresql.Driver |
下載 |
MySQL | com.mysql.jdbc.Driver |
下載 (請選取 [Platform Independent] \(不受平台影響\)) |
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>
共用伺服器層級資源
要新增共用的伺服器層級資料來源就必須編輯 Tomcat 的 server.xml。 最可靠的操作方式如下:
啟動指令碼會對 server.xml 檔案進行 xsl 轉換,並將產生的 xml 檔案輸出至 /usr/local/tomcat/conf/server.xml
。 啟動指令碼會透過 apk 安裝 libxslt。 您可以透過 FTP 上傳 xsl 檔案和啟動指令碼。 以下是啟動指令碼範例。
# 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(., '<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 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>
</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
,並使用更新後的設定。
使用 JBoss EAP 註冊資料來源時有三個核心步驟:上傳 JDBC 驅動程式、將 JDBC 驅動程式新增為模組,以及註冊模組。 App Service 是無狀態裝載服務,因此用於新增和註冊資料來源模組的設定命令,必須編寫到指令碼並於容器啟動時套用。
取得資料庫的 JDBC 驅動程式。
建立 JDBC 驅動程式的 XML 模組定義檔案。 下列範例顯示 PostgreSQL 的模組定義。
<?xml version="1.0" ?> <module xmlns="urn:jboss:module:1.1" name="org.postgres"> <resources> <!-- ***** IMPORTANT : REPLACE THIS PLACEHOLDER *******--> <resource-root path="/home/site/deployments/tools/postgresql-42.2.12.jar" /> </resources> <dependencies> <module name="javax.api"/> <module name="javax.transaction.api"/> </dependencies> </module>
將您的 JBoss CLI 命令放入名為
jboss-cli-commands.cli
的檔案中。 JBoss 命令必須新增模組,並將其註冊為資料來源。 下列範例顯示 PostgreSQL 的 JBoss CLI 命令。#!/usr/bin/env bash module add --name=org.postgres --resources=/home/site/deployments/tools/postgresql-42.2.12.jar --module-xml=/home/site/deployments/tools/postgres-module.xml /subsystem=datasources/jdbc-driver=postgres:add(driver-name="postgres",driver-module-name="org.postgres",driver-class-name=org.postgresql.Driver,driver-xa-datasource-class-name=org.postgresql.xa.PGXADataSource) data-source add --name=postgresDS --driver-name=postgres --jndi-name=java:jboss/datasources/postgresDS --connection-url=${POSTGRES_CONNECTION_URL,env.POSTGRES_CONNECTION_URL:jdbc:postgresql://db:5432/postgres} --user-name=${POSTGRES_SERVER_ADMIN_FULL_NAME,env.POSTGRES_SERVER_ADMIN_FULL_NAME:postgres} --password=${POSTGRES_SERVER_ADMIN_PASSWORD,env.POSTGRES_SERVER_ADMIN_PASSWORD:example} --use-ccm=true --max-pool-size=5 --blocking-timeout-wait-millis=5000 --enabled=true --driver-class=org.postgresql.Driver --exception-sorter-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter --jta=true --use-java-context=true --valid-connection-checker-class-name=org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker
建立啟動指令碼
startup_script.sh
以呼叫 JBoss CLI 命令。 下列範例顯示如何呼叫jboss-cli-commands.cli
。 稍後,您會設定 App Service,以在容器啟動時執行此指令碼。$JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/deployments/tools/jboss-cli-commands.cli
使用您選擇的 FTP 用戶端,將 JDBC 驅動程式
jboss-cli-commands.cli
、startup_script.sh
和模組定義上傳至/site/deployments/tools/
。設定您的網站,使其在容器啟動時執行
startup_script.sh
。 在 Azure 入口網站中,瀏覽至 [設定]>[一般設定]>[啟動命令]。 將啟動命令欄位設定為/home/site/deployments/tools/startup_script.sh
。 儲存您的變更。
若要確認資料來源已新增至 JBoss 伺服器,請透過 SSH 連線到您的 Webapp 並執行 $JBOSS_HOME/bin/jboss-cli.sh --connect
。 連線到 JBoss 之後,請執行 /subsystem=datasources:read-resource
以列印資料來源的清單。
下一步
瀏覽適用於 Java 開發人員的 Azure 中心,以找出 Azure 快速入門、教學課程和 Java 參考文件。