在 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 - 僅支持免費、進階 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
,並使用更新後的設定。
提示
根據預設,Linux JBoss 容器可以在 JBoss 伺服器中為您自動設定共享數據源。 唯一要做的就是使用容器中可用的適當驅動程式,將包含有效 JDBC 連接字串 的應用程式設定新增至 Oracle、SQL Server、PostgreSQL 或 MySQL 資料庫(包括連接認證),而 App Service 會自動新增對應的共用數據源。 如需使用此方法的端對端案例,請參閱教學課程:在Linux和 MySQL 上建置具有 Azure App 服務 的 JBoss Web 應用程式。
向 JBoss EAP 註冊數據源時,有三個核心步驟:
- 上傳 JDBC 驅動程式。
- 將 JDBC 驅動程式新增為模組。
- 使用 模組新增數據源。
App Service 是無狀態裝載服務,因此您必須將這些步驟放入啟動腳本中,並在每次 JBoss 容器啟動時執行。 使用 PostgreSQL、MySQL 和 SQL 資料庫 作為範例:
將您的 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 參考文件。