共用方式為


教學課程:使用 Linux 上的 App Service 和 MySQL 建置 Tomcat Web 應用程式

本教學課程示範如何在連線至 MySQL 資料庫的 Azure App Service 中建置、設定及部署安全的 Tomcat 應用程式 (使用適用於 MySQL 的 Azure 資料庫)。 Azure App Service 是高度可調整、自我修補的 Web 裝載服務,可輕鬆在 Windows 或 Linux 上部署應用程式。 完成後,Linux 上的 Azure App Service 上將會執行 Tomcat 應用程式。

Tomcat 應用程式的螢幕擷取畫面,將資料儲存在 MySQL 中。

在本教學課程中,您會了解如何:

  • 為 Azure App 服務 和 適用於 MySQL 的 Azure 資料庫 建立安全預設架構。
  • 使用受控識別和 Key Vault 參考來保護連線祕密。
  • 從 GitHub 存放庫將 Tomcat 範例應用程式部署至 App Service。
  • 在應用程式程式碼中存取 App Service 應用程式設定。
  • 進行更新並重新部署應用程式程式碼。
  • 串流來自 App Service 的診斷記錄。
  • 在 Azure 入口網站中管理應用程式。
  • 使用 Azure Developer CLI 佈建相同的架構並進行部署。
  • 使用 GitHub Codespaces 和 GitHub Copilot 最佳化您的開發工作流程。

必要條件

  • 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 帳戶,可以建立一個免費帳戶
  • GitHub 帳戶。 您也可免費取得
  • 使用 Tomcat 開發的 Java 知識。
  • (選擇性) 若要嘗試 GitHub Copilot,一個 GitHub Copilot 帳戶。 有 30 天免費試用版可用。

跳到結尾

您可以在本教學課程中快速部署範例應用程式,並查看其在 Azure 中執行。 只要在 Azure Cloud Shell 中執行下列命令,然後遵循提示:

mkdir msdocs-tomcat-mysql-sample-app
cd msdocs-tomcat-mysql-sample-app
azd init --template msdocs-tomcat-mysql-sample-app
azd up

1.執行範例

首先,您會將範例資料驅動的應用程式設定為起點。 為了方便起見,範例存放庫 (英文) 包含開發容器 (英文) 設定。 開發容器具有開發應用程式所需的全部內容,包括資料庫、快取,以及範例應用程式所需的所有環境變數。 開發容器可以在 GitHub codespace 中執行,這表示您可以在任何電腦上使用網頁瀏覽器執行範例。

第 1 步:在新的瀏覽器視窗中:

  1. 登入您的 GitHub 帳戶。
  2. 瀏覽至 https://github.com/Azure-Samples/msdocs-tomcat-mysql-sample-app/fork
  3. 取消選取 [僅複製主分支]。 您需要所有分支。
  4. 選取 [建立派生]

螢幕擷取畫面:顯示如何建立範例 GitHub 存放庫的分支。

步驟 2:在 GitHub 分支中:

  1. 為起始分支選取 [主分支]> [starter-no-infra]。 此分支只包含範例專案,沒有與 Azure 相關的檔案或設定。
  2. 選取 [程式碼] > [在 starter-no-infra 上建立 codespace]。 設定 Codespace 需要幾分鐘的時間。

螢幕擷取畫面:顯示如何在 GitHub 中建立 Codespace。

步驟 3:在 codespace 終端機中:

  1. 執行 mvn jetty:run
  2. 當您看到通知 Your application running on port 80 is available. 時,請選取 [在瀏覽器中開啟]。 您應該會在新的瀏覽器索引標籤中看到應用程式範例。若要停止 Jetty 伺服器,請輸入 Ctrl+C

螢幕擷取畫面:顯示如何在 GitHub Codespace 內執行應用程式範例。

提示

您可以向 GitHub Copilot (英文) 詢問有關此存放庫的資訊。 例如:

  • @workspace 此專案有何用途?
  • @workspace .devcontainer 資料夾的功能為何?

有問題嗎? 查看疑難排解區段

2.建立 App Service 和 MySQL

首先,您會建立 Azure 資源。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和適用於 MySQL 的 Azure 資料庫。 針對建立程序,您會指定:

  • Web 應用程式的 [名稱]。 其會以 https://<app-name>-<hash>.<region>.azurewebsites.net 的形式作為您應用程式 DNS 名稱的一部分來使用。
  • 要實際執行應用程式的區域。 其也會作為您應用程式的 DNS 名稱的一部分來使用。
  • 應用程式的執行階段堆疊。 您可以在此處選取要用於應用程式的 Java 版本。
  • 應用程式的主控方案。 這是定價層,其中包含應用程式的一組功能和調整限度。
  • 應用程式的 [資源群組]。 資源群組允許您將應用程式所需的所有 Azure 資源分組 (在邏輯容器中)。

登入 Azure 入口網站,遵循下列步驟建立您的 Azure App Service 資源。

步驟 1:在 Azure 入口網站中:

  1. 在 Azure 入口網站頂端的搜尋列中輸入「Web 應用程式資料庫」。
  2. 選取 [Marketplace] 標題下標示為 [Web 應用程式 + 資料庫] 的項目。 您也可以直接瀏覽至建立精靈

螢幕擷取畫面:顯示如何使用頂端工具列中的搜尋方塊以尋找 [Web 應用程式 + 資料庫] 建立精靈。

步驟 2:在 [建立 Web 應用程式 + 資料庫] 頁面上,填寫表單,如下所示。

  1. 資源群組:選取 [新建] 並使用 msdocs-tomcat-mysql-tutorial 的名稱。
  2. [區域]:您附近的任何 Azure 區域。
  3. 名稱msdocs-tomcat-mysql-XYZ,其中 XYZ 是任意三個隨機字元。
  4. 執行階段堆疊Java 17
  5. Java 網頁伺服器堆疊Apache Tomcat 10.1
  6. MySQL - 預設會為您選取彈性伺服器作為資料庫引擎。 如果未選取,請加以選取。 適用於 MySQL 的 Azure 資料庫是 Azure 上完全受控的 MySQL 資料庫即服務,可與最新的社群版本相容。
  7. [主控方案]:[基本]。 一切就緒時,您即可擴大 (部分機器翻譯) 至生產定價層。
  8. 選取 [檢閱 + 建立]。
  9. 驗證完成時,選取 [建立]

螢幕擷取畫面:顯示如何在 [Web 應用程式 + 資料庫] 精靈中設定新的應用程式和資料庫。

步驟 3:部署需要數分鐘的時間才能完成。 在部署完成時,選取 [前往資源] 按鈕。 系統會將您直接帶至 App Service 應用程式,但會建立下列資源:

  • 資源群組:所有已建立資源的容器。
  • App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
  • App Service:代表您的應用程式,並在 App Service 方案中執行。
  • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
  • 適用於 MySQL 的 Azure 資料庫彈性伺服器:只能從虛擬網路存取。 系統會為您在伺服器上建立資料庫和使用者。
  • 私人 DNS 區域:啟用虛擬網路中的資料庫伺服器 DNS 解析。

螢幕擷取畫面:顯示部署流程已完成。

有問題嗎? 查看疑難排解區段

3.安全連線秘密

建立精靈已為您產生連線字串作為應用程式設定。 不過,安全性最佳做法是將祕密完全從 App Service 中移出。 在服務連接器的協助下,您可以將祕密移至金鑰保存庫,並將您的應用程式設定變更為 Key Vault 參考 (部分機器翻譯)。

步驟 1:在 [App Service] 頁面中:

  1. 在左側功能表中,選取 [設定 > 環境變數]
  2. 選取 [AZURE_MYSQL_CONNECTIONSTRING]。 其中包含 JDBC 連接字串。 如果您新增了包含有效 Oracle、SQL Server、PostgreSQL 或 MySQL 連接字串的應用程式設定,App Service 會將其插入作為 Tomcat 伺服器 context.xml 檔案中的 Java 命名和目錄介面 (JNDI) 資料來源。
  3. 在 [新增/編輯應用程式設定] 的 [值] 欄位中,尋找位於字串結尾的 password= 部分。
  4. 複製 Password= 後面的密碼字串,以供後續使用。 此應用程式設定可讓您連線至私人端點後方受保護的 MySQL 資料庫。 不過,秘密會直接儲存在 App Service 應用程式中,這不是最好的方式。 您要變更此設定。

顯示如何查看應用程式設定值的螢幕擷取畫面。

步驟 2:建立金鑰保存庫,以安全地管理秘密。

  1. 在頂端搜尋列中,輸入 "key vault",然後選取 [Marketplace] > [Key Vault]
  2. 在 [資源群組] 中,選取 [msdocs-tomcat-mysql-tutorial]
  3. 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
  4. 在 [區域] 中,將它設定為作為資源群組的範例位置。

顯示如何建立金鑰保存庫的螢幕擷取畫面。

步驟 3:

  1. 選取 [網路] 索引標籤。
  2. 取消選取 [啟用公用存取]
  3. 選取 [建立私人端點]
  4. 在 [資源群組] 中,選取 [msdocs-tomcat-mysql-tutorial]
  5. 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
  6. 在 [區域] 中,將它設定為作為資源群組的範例位置。
  7. 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
  8. 在 [資源群組] 中,選取 [msdocs-tomcat-mysql-tutorial]
  9. 在 [名稱] 中,輸入 msdocs-tomcat-mysql-XYZVaultEndpoint
  10. 在 [虛擬網路] 中,選取 [msdocs-tomcat-mysql-XYZVnet]
  11. 在 [子網路] 中,輸入 msdocs-tomcat-mysql-XYZSubnet
  12. 選取 [確定]。
  13. 選取 [檢閱 + 建立],然後選取 [建立]。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。

顯示如何使用私人端點保護金鑰保存庫的螢幕擷取畫面。

步驟 4:

  1. 在頂端搜尋列中輸入 msdocs-tomcat-sql,然後輸入名為 msdocs-tomcat-mysql-XYZ 的 App Service 資源。
  2. 在 App Service 頁面的左側功能表中,選取 [設定 > 服務連接器]。 已經有連接器,這是為您建立的應用程式建立精靈。
  3. 選取連接器旁的核取方塊,然後選取 [編輯]
  4. 在 [基本] 索引標籤中,將 [用戶端類型] 設定為 Java
  5. 選取 [驗證] 索引標籤。
  6. 在 [密碼] 中,貼上您先前複製的密碼。
  7. 選取 [在 Key Vault 中儲存秘密]
  8. 在 [金鑰保存庫連線] 底下,選取 [新建]。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。

顯示如何使用金鑰保存庫連線編輯服務連接器的螢幕擷取畫面。

步驟 5:在 Key Vault 連線的 [建立連線] 對話方塊中:

  1. Key Vault 中:選取您稍早建立的金鑰保存庫。
  2. 選取 [檢閱 + 建立] 。 您應該會看到 [系統指派的受控識別] 設定為 [已選取]
  3. 驗證完成時,選取 [建立]

顯示如何設定金鑰保存庫服務連接器的螢幕擷取畫面。

步驟 6:您會回到 defaultConnector 的編輯對話方塊中。

  1. 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成時,[Key Vault 連線] 下拉式清單會自動加以選取。
  2. 選取 [下一步:網路]
  3. 選取 [儲存]。 等到 [更新成功] 通知出現為止。

顯示在 defaultConnector 中選取的金鑰保存庫連線的螢幕擷取畫面。

步驟 7:確認您的變更:

  1. 在左側功能表中,再次選取 [環境變數] > [連接字串]
  2. AZURE_MYSQL_CONNECTIONSTRING 旁,選取 [顯示值]。 該值應該是 @Microsoft.KeyVault(...),這表示它是金鑰保存庫參考,因為現在已在金鑰保存庫中管理秘密。

說明如何在 Azure 中查看 MySQL 環境變數值的螢幕擷取畫面。

有問題嗎? 查看疑難排解區段

4.確認 JNDI 資料來源

如果您新增了包含 Oracle、SQL Server、PostgreSQL 或 MySQL 的有效 JDBC 連接字串的應用程式設定,App Service 將會在 Tomcat 伺服器的 context.xml 檔案中新增 Java 命名和目錄介面 (JNDI) 資料來源。 在此步驟中,您會使用應用程式容器的 SSH 連線來驗證 JNDI 資料來源。 在此程序中,您會了解如何存取 Tomcat 容器的 SSH 殼層。

步驟 1:返回 [App Service] 頁面:

  1. 在左側功能表中,選取 [SSH]
  2. 選取 [執行]

螢幕擷取畫面:顯示如何從 Azure 入口網站開啟您應用程式的 SSH 殼層。

第 2 步:在 SSH 終端機中,執行 cat /usr/local/tomcat/conf/context.xml。 您應該會看到已新增名為 jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS 的 JNDI 資源。 您稍後會使用此資料來源。

螢幕擷取畫面:顯示要在 SSH 殼層及其輸出中執行的命令。

注意

只有 /home 中檔案的變更才能在應用程式重新開機之後保存。 例如,如果您編輯 /usr/local/tomcat/conf/server.xml,則變更不會保存到應用程式重新啟動之後。

有問題嗎? 查看疑難排解區段

5.部署範例程式碼

在此步驟中,請使用 GitHub Actions 來設定 GitHub 部署。 這只是部署至 App Service 的許多方式之一,但也是在部署程序中持續整合的絕佳方式。 根據預設,每次對您的 GitHub 存放庫執行 git push 都會開始建置和部署動作。

如同 Tomcat 慣例,如果您想要部署到 Tomcat 的根內容,請將建置成品命名為 ROOT.war

步驟 1:回到 [App Service] 頁面上的左側功能表,選取 [部署中心]

螢幕擷取畫面:顯示如何在 App Service 中開啟 [部署中心]。

步驟 2:在 [部署中心] 頁面中:

  1. 在 [來源] 中,選取 [GitHub]。 根據預設,系統會選取 GitHub Actions 作為組建提供者。
  2. 登入您的 GitHub 帳戶,並遵循提示來授權 Azure。
  3. 在 [組織] 中,選取您的帳戶。
  4. 在 [存放庫] 中,選取 msdocs-tomcat-mysql-sample-app
  5. 在 [分支] 中,選取 [starter-no-infra]。 這是您搭配應用程式範例使用的相同分支,未包含任何 Azure 相關檔案或設定。
  6. 對於 [驗證類型],選取 [使用者指派的身分識別]
  7. 在最上層的功能表中,選取 [儲存]。 App Service 會將工作流程檔案認可至 .github/workflows 目錄中選擇的 GitHub 存放庫。 根據預設,部署中心會為工作流程建立使用者指派的身分識別,以使用 Microsoft Entra 進行驗證 (OIDC 驗證)。 如需替代驗證選項,請參閱使用 GitHub Actions 部署至 App Service

螢幕擷取畫面:顯示如何使用 GitHub Actions 設定 CI/CD。

步驟 3:回到範例分支的 GitHub codespace 中,執行 git pull origin starter-no-infra。 這會將新認可的工作流程檔案提取到您的 Codespace。

螢幕擷取畫面:顯示 GitHub Codespace 內的 Git 提取。

步驟 4 (選項 1:使用 GitHub Copilot):

  1. 按一下 [聊天] 檢視,然後按一下 +,即可啟動新的聊天工作階段。
  2. 問:「@workspace 應用程式如何連線到資料庫?」Copilot 可能會提供有關 jdbc/MYSQLDS 資料來源以及如何設定的一些說明。
  3. 問:「@workspace 我想以 Tomcat 中現有的 JNDI 資料來源取代 persistence.xml 中定義的資料來源,但我想以動態方式執行。」。 Copilot 可能會提供與下列選項 2:不使用 GitHub Copilot 步驟中的程式碼建議類似的程式碼建議,甚至告訴您在 ContextListener 類別中進行變更。
  4. 在總管中開啟 src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java,並在 contextInitialized 方法中新增程式碼建議。 GitHub Copilot 不會每次都提供您相同的回應,您可能需要提出更多問題來微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

螢幕擷取畫面:顯示如何在新的 GitHub Copilot 聊天工作階段中詢問問題。

步驟 4 (選項 2:不使用 GitHub Copilot):

  1. 在總管中開啟 src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java。 當應用程式啟動時,這個類別會在 src/main/resources/META-INF/persistence.xml 中載入資料庫設定。
  2. contextIntialized() 方法中,尋找已註解的程式碼 (第 29-33 行),並將其取消註解。 此程式碼會檢查 AZURE_MYSQL_CONNECTIONSTRING 應用程式設定是否存在,並將資料來源變更為 java:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS,這是您稍早在 SSH 殼層的 context.xml 中找到的資料來源。

顯示 GitHub Codespace 和已開啟 ContextListener.java 檔案的螢幕擷取畫面。

步驟 5:

  1. 選取 [原始檔控制] 延伸模組。
  2. 在文字方塊中,輸入提交訊息,例如 Configure Azure data source
  3. 選取 [認可],然後使用 [是] 來確認。
  4. 選取 [同步變更 1],然後使用 [確定] 來確認。

螢幕擷取畫面:顯示要認可並推送至 GitHub 的變更。

步驟 6:返回 Azure 入口網站的 [部署中心] 頁面:

  1. 選取 [記錄] 。 新的部署執行已從您認可的變更開始。
  2. 在部署執行的記錄項目中,選取最新時間戳記的 [建置/部署記錄] 項目。

螢幕擷取畫面:顯示如何在 [部署中心] 開啟部署記錄。

第 7 步:您已前往 GitHub 存放庫,並看到 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行到顯示 [完成] 狀態。 需要約 5 分鐘的時間。

螢幕擷取畫面:顯示 GitHub 執行進行中。

有問題嗎? 查看疑難排解區段

6.瀏覽至應用程式

步驟 1:在 [App Service] 頁面中:

  1. 從左側功能表中選取 [概觀]
  2. 選取應用程式的 URL。

螢幕擷取畫面:顯示如何從 Azure 入口網站啟動 App Service。

第 2 步:將幾項工作新增至清單。 恭喜,您正在 Azure App Service 中執行 Web 應用程式,並安全地連線至適用於 MySQL 的 Azure 資料庫。

在 Azure 中執行的使用 MySQL 的 Tomcat Web 應用程式的螢幕擷取畫面。

有問題嗎? 查看疑難排解區段

7.資料流診斷記錄

Azure App Service 會擷取輸出到主控台的所有訊息,以協助您診斷應用程式的問題。 如下列程式碼片段所示,應用程式範例包含可示範這項功能的標準 Log4j 記錄陳述式:

@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
    private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        logger.info("GET /");

        EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");

步驟 1:在 [App Service] 頁面中:

  1. 從左側功能表中,選取 [App Service 記錄]
  2. 在 [應用程式記錄] 下,選取 [檔案系統]
  3. 在最上層的功能表中,選取 [儲存]

螢幕擷取畫面:顯示如何在 Azure 入口網站中啟用 App Service 的原生記錄。

步驟 2:從左側功能表中,選取 [記錄串流]。 您會看到應用程式的記錄,包括平台記錄和來自容器內的記錄。

螢幕擷取畫面:顯示如何在 Azure 入口網站中檢視記錄串流。

啟用適用於 .NET、Node.js、Python 和 Java 應用程式的 Azure 監視器 OpenTelemetry 系列中深入了解 Java 應用程式中的記錄。

有問題嗎? 查看疑難排解區段

8.清除資源

完成後,您可以刪除資源群組,以從 Azure 訂用帳戶中刪除所有資源。

步驟 1:在 Azure 入口網站頂端的搜尋列中:

  1. 輸入資源群組名稱。
  2. 選取資源群組。

螢幕擷取畫面:顯示如何在 Azure 入口網站中搜尋並瀏覽至資源群組。

步驟 2:在資源群組頁面中,選取 [刪除資源群組]

顯示 Azure 入口網站中 [刪除資源群組] 按鈕位置的螢幕擷取畫面。

步驟 3:

  1. 輸入資源群組名稱以確認刪除。
  2. 選取 [刪除]
  3. 再次使用 [刪除] 來確認。

Azure 入口網站中刪除資源群組確認對話方塊的螢幕擷取畫面。

2.建立 Azure 資源並部署應用程式範例

在此步驟中,您會建立 Azure 資源,並將範例應用程式部署至 Linux 上的 App Service。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和適用於 MySQL 的 Azure 資料庫。

開發容器已具備 Azure Developer CLI (AZD)。

  1. 從存放庫根路徑中執行 azd init

    azd init --template tomcat-app-service-mysql-infra
    
  2. 出現提示時,請提供下列答案:

    問題 回答
    目前的目錄不是空的。 您是否要在「<您的目錄>」初始化專案? Y
    您要對這些檔案執行什麼動作? 維持現有的檔案不變
    輸入新的環境名稱 輸入唯一名稱。 AZD 範本會使用此名稱作為 Azure 中 Web 應用程式的 DNS 名稱一部分 (<app-name>-<hash>.azurewebsites.net)。 允許英數字元與連字號。
  3. 執行 azd auth login 命令並遵循提示來登入 Azure:

    azd auth login
    
  4. 使用 azd up 命令建立必要的 Azure 資源,並部署應用程式程式碼。 請遵循提示選取 Azure 資源所需的訂用帳戶和位置。

    azd up
    

    azd up 命令需要大約 15 分鐘才能完成 (時間多半用在 Redis 快取上)。 這也會編譯及部署您的應用程式程序代碼,但稍後會修改程序代碼以使用 App Service。 執行時,命令會提供佈建和部署程式的相關資訊,包括 Azure 中部署的連結。 完成時,命令也會顯示部署應用程式的連結。

    此 AZD 範本包含使用下列 Azure 資源產生預設安全架構的檔案 (azure.yamlinfra 目錄):

    • 資源群組:所有已建立資源的容器。
    • App Service 方案:定義 App Service 的計算資源。 系統會在 B1 層中建立 Linux 方案。
    • App Service:代表您的應用程式,並在 App Service 方案中執行。
    • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
    • 適用於 MySQL 的 Azure 資料庫彈性伺服器:只能透過 DNS 區域整合從虛擬網路存取。 系統會為您在伺服器上建立資料庫。
    • Azure Cache for Redis:只能從虛擬網路中存取。
    • 私人端點:虛擬網路中的金鑰保存庫和 Redis 快取的存取端點。
    • 私人 DNS 區域:啟用虛擬網路中的金鑰保存庫、資料庫伺服器和 Redis 快取的 DNS 解析。
    • Log Analytics 工作區:作為應用程式傳送記錄的目標容器,您也可以在其中查詢記錄。
    • 金鑰保存庫:當您使用 AZD 重新部署時,用來保留資料庫密碼。

    命令第一次完成建立資源並部署應用程式程式碼之後,已部署的範例應用程式尚無法運作,因為您必須進行小型變更,使其連線到 Azure 中的資料庫。

有問題嗎? 查看疑難排解區段

3.驗證連接字串

您使用的 AZD 範本已為您產生連線變數作為應用程式設定,並將其輸出至終端機以方便使用。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。

  1. 在 AZD 輸出中,尋找應用程式設定 AZURE_MYSQL_CONNECTIONSTRING。 只會顯示設定名稱。 其在 AZD 輸出中看起來像這樣:

     App Service app has the following connection strings:
             - AZURE_MYSQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
     

    AZURE_MYSQL_CONNECTIONSTRING 包含 Azure 中 MySQL 資料庫的連接字串。 您稍後必須在程式碼中使用該連接字串。

  2. 為了方便起見,AZD 範本會顯示應用程式的應用程式設定頁面直接連結。 尋找該連結,並在新的瀏覽器索引標籤中開啟該連結。

    如果您新增包含有效 Oracle、SQL Server、PostgreSQL 或 MySQL 連接字串的應用程式設定,App Service 會將其新增為 Tomcat 伺服器 context.xml 檔案中的 Java 命名和目錄介面 (JNDI) 資料來源。

有問題嗎? 查看疑難排解區段

4.確認 JNDI 資料來源

在此步驟中,您會使用應用程式容器的 SSH 連線來驗證 Tomcat 伺服器中的 JNDI 資料來源。 在此程序中,您會了解如何存取 Tomcat 容器的 SSH 殼層。

  1. 在 AZD 輸出中,尋找 SSH 工作階段的 URL,並在瀏覽器中瀏覽至目標。 輸出中看起來像這樣:

     Open SSH session to App Service container at: https://<app-name>-<hash>.scm.azurewebsites.net/webssh/host
     
  2. 在 SSH 終端機中,執行 cat /usr/local/tomcat/conf/context.xml。 您應該會看到已新增名為 jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS 的 JNDI 資源。 您稍後會使用此資料來源。

    螢幕擷取畫面:顯示要在 SSH 殼層及其輸出中執行的命令。

注意

只有 /home 中檔案的變更才能在應用程式重新開機之後保存。 例如,如果您編輯 /usr/local/tomcat/conf/server.xml,則變更不會保存到應用程式重新啟動之後。

有問題嗎? 查看疑難排解區段

5.修改範例程式碼並重新部署

  1. 在 GitHub codespace 中,按一下 [聊天] 檢視,然後按一下 +,以啟動新的聊天工作階段。

  2. 問:「@workspace 應用程式如何連線到資料庫?」Copilot 可能會提供有關 jdbc/MYSQLDS 資料來源以及如何設定的一些說明。

  3. 問:「@workspace 我想以 Tomcat 中現有的 JNDI 資料來源取代 persistence.xml 中定義的資料來源,但我想以動態方式執行。」Copilot 可能會提供類似於以下選項 2:不使用 GitHub Copilot步驟的建議,甚至告訴您在 ContextListener 類別中進行變更。

  4. 在總管中開啟 src/main/java/com/microsoft/azure/appservice/examples/tomcatmysql/ContextListener.java,並在 contextInitialized 方法中新增程式碼建議。

    GitHub Copilot 不會每次都提供您相同的回應,您可能需要提出其他問題來微調其回應。 如需提示,請參閱我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

  5. 在 codespace 終端機中,執行 azd deploy

    azd deploy
    

提示

您也可以只使用 azd up,這會執行所有 azd packageazd provisionazd deploy

若要了解 War 檔案的封裝方式,您可以執行 azd package --debug 本身。

有問題嗎? 查看疑難排解區段

6.瀏覽至應用程式

  1. 在 AZD 輸出中,尋找您應用程式的 URL,並在瀏覽器中瀏覽至目標。 AZD 輸出中 URL 看起來像這樣:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>-<hash>.azurewebsites.net/
     
  2. 將幾項工作新增至清單。

    在 Azure 中執行的使用 MySQL 的 Tomcat Web 應用程式的螢幕擷取畫面,顯示工作。

    恭喜,您正在 Azure App Service 中執行 Web 應用程式,並安全地連線至適用於 MySQL 的 Azure 資料庫。

有問題嗎? 查看疑難排解區段

7.資料流診斷記錄

Azure App Service 會擷取主控台記錄,以協助您診斷應用程式的問題。 為了方便起見,AZD 範本已啟用本機檔案系統記錄,並將記錄送至 Log Analytics 工作區

如下列程式碼片段所示,應用程式範例包含可示範這項功能的標準 Log4j 記錄陳述式:

@WebServlet(urlPatterns = "/")
public class ViewServlet extends HttpServlet {
    private static Logger logger = LogManager.getLogger(ViewServlet.class.getName());
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        logger.info("GET /");

        EntityManagerFactory emf = (EntityManagerFactory) req.getServletContext().getAttribute("EMFactory");

在 AZD 輸出中,尋找串流 App Service 記錄的連結,並在瀏覽器中瀏覽至該連結。 連結在 AZD 輸出中看起來像這樣:

Stream App Service logs at: https://portal.azure.com/#@/resource/subscriptions/<subscription-guid>/resourceGroups/<group-name>/providers/Microsoft.Web/sites/<app-name>/logStream

啟用適用於 .NET、Node.js、Python 和 Java 應用程式的 Azure 監視器 OpenTelemetry 系列中深入了解 Java 應用程式中的記錄。

有問題嗎? 查看疑難排解區段

8.清除資源

若要刪除目前部署環境中的所有 Azure 資源,請執行 azd down 並遵循提示。

azd down

疑難排解

我看到從多個位置掃描的許多<類別>,具有 mvn jetty:run 的警告

您可以忽略這些警告。 Maven Jetty 外掛程式會顯示警告,因為應用程式的 pom.xml 包含 jakarta.servlet.jsp.jstl 的相依性,Jetty 已提供現成可用的項目。 您需要 Tomcat 的相依性。

適用於 MySQL 的 Azure 資料庫彈性伺服器的入口網站部署檢視顯示衝突狀態

根據所選取的訂用帳戶和區域,您可能會看到適用於 MySQL 的 Azure 資料庫彈性伺服器的部署狀態為 Conflict,且作業詳細資料中顯示下列訊息:

InternalServerError: An unexpected error occured while processing the request.

此錯誤很可能是由所選區域的訂用帳戶限制所造成。 請嘗試為部署選擇不同的區域。

已部署範例應用程式不會顯示工作清單應用程式

如果您看到 Hey, Java developers! 頁面,而不是工作清單應用程式,App Service 很可能仍然會從您最近的程式碼部署載入更新的容器。 等待幾分鐘,然後重新整理頁面。

我在已部署範例應用程式中看到「404 找不到頁面」錯誤

請確定您已進行程式碼變更,以使用 java:comp/env/jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS 資料來源。 如果您進行變更並重新部署程式碼,App Service 很可能仍會載入更新的容器。 等待幾分鐘,然後重新整理頁面。

常見問題集

這設定會產生多少費用?

建立資源的定價如下:

  • App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價
  • MySQL 彈性伺服器是在 B1ms 層中建立,並可相應增加或減少。 使用 Azure 免費帳戶時,B1ms 層免費 12 個月,最多可達每月限制。 請參閱適用於 MySQL 的 Azure 資料庫定價
  • Azure Cache for Redis 是在最低快取大小的基本層級中建立。 與此層級相關的成本不高。 您可以擴大至較高的效能層級以取得高可用性、叢集和其他功能。 請參閱 Azure Cache for Redis 定價
  • 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 Azure 虛擬網路定價
  • 私人 DNS 區域會產生少量費用。 請參閱 Azure DNS 定價

如何使用其他工具連線到虛擬網路後方的 MySQL 資料庫?

  • Tomcat 容器目前也沒有 mysql-client 終端機。 如果您想要的話,必須手動安裝。 請記住,您安裝的任何項目都不會保存到應用程式重新啟動之後。
  • 若要從 MySQL Workbench 之類的桌面工具連線,您的電腦必須位於虛擬網路內。 例如,該電腦可以是其中一個子網路中的 Azure VM,或內部部署網路中具有與 Azure 虛擬網路站對站 VPN 連線的電腦。
  • 您也可以將 Azure Cloud Shell 與虛擬網路整合

本機應用程式開發如何與 GitHub Actions 搭配運作?

使用 App Service 自動產生的工作流程檔案為例,每個 git push 都會開始執行新的組建和部署。 從 GitHub 存放庫的本機複本,並將所需的更新推送至 GitHub。 例如:

git add .
git commit -m "<some-message>"
git push origin main

我沒有權限可建立使用者指派的身分識別

請參閱透過部署中心設定 GitHub Actions 部署

我可以在 Codespace 中使用 GitHub Copilot 執行哪些作業?

您可能注意到建立 codespace 時,GitHub Copilot 聊天檢視已可供您使用。 為了方便起見,我們會在容器定義中包含 GitHub Copilot 聊天延伸模組 (請參閱 .devcontainer/devcontainer.json)。 不過,您需要一個 GitHub Copilot 帳戶 (英文) (可免費試用 30 天)。

與 GitHub Copilot 交談時,有幾項提示可供您使用:

  • 在單一聊天工作階段中,問題和答案相互關聯,您可以調整問題來微調取得的答案。
  • 根據預設,GitHub Copilot 無法存取存放庫中的任何檔案。 若要詢問檔案相關問題,請先在編輯器中開啟檔案。
  • 為了讓 GitHub Copilot 在準備其解答時存取存放庫中的所有檔案,請在問題開頭加上 @workspace。 如需詳細資訊,請參閱Use the @workspace agent
  • 在聊天工作階段中,GitHub Copilot 可以建議變更,(使用 @workspace) 甚至可以建議在何處進行變更,但系統不允許為您進行變更。 您可以自行新增建議的變更並加以測試。

您可以述說以下一些其他內容來微調取得的答案:

  • 請變更此程式碼以使用資料來源 jdbc/AZURE_MYSQL_CONNECTIONSTRING_DS。
  • 程式碼中的某些匯入使用 javax,但我有 Jakarta 應用程式。
  • 我希望此程式碼只在已設定環境變數 AZURE_MYSQL_CONNECTIONSTRING 時才執行。
  • 我希望此程序碼只能在 Azure App Service 中執行,而不是在本機執行。

下一步

在開發人員指南中深入了解如何在 App Service 上執行 Java 應用程式。

了解如何使用自訂網域和憑證保障您的應用程式。