教學課程:將 Quarkus Web 應用程式部署至 Azure App 服務 和 PostgreSQL

在本教學課程中,您會使用適用於PostgreSQL的 Azure 資料庫關係資料庫服務,將數據驅動 Quarkus Web 應用程式部署到 Azure App 服務。 Azure App 服務 支援 Windows 或 Linux 伺服器環境中的 Java Standard Edition (Java SE)。

螢幕擷取畫面顯示將資料儲存在 PostgreSQL 中的 Quarkus 應用程式。

在本教學課程中,您將瞭解如何:

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

先決條件

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

跳到結尾

如果您只想查看本教學課程中在 Azure 中執行的範例應用程式,只要在 Azure Cloud Shell執行下列命令,然後遵循提示:

mkdir msdocs-quarkus-postgresql-sample-app
cd msdocs-quarkus-postgresql-sample-app
azd init --template msdocs-quarkus-postgresql-sample-app
azd up

1.執行範例

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

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

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

步驟 2:在 GitHub 分支中:

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

步驟 3:在 codespace 終端機中:

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

如需 Quarkus 應用程式範例建立方式的詳細資訊,請參閱 Quarkus 文件簡化休眠 ORM 與 Panache在 Quarkus 中設定資料來源

秘訣

您可以向 GitHub Copilot 詢問此存放庫。 例如:

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

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

2. 建立 App Service 和 PostgreSQL

在此步驟中,您會建立 Azure 資源。 本教學課程中使用的步驟會建立一組預設保護資源,其中包含 App Service 和 適用於 PostgreSQL 的 Azure 資料庫。 在建立過程中,您會指定:

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

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

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

  1. 在頂端搜尋列中,輸入 App Service
  2. 請在 [服務] 標題下選取標示為 App Service 的項目。
  3. 選取 [建立>Web 應用程式]。 您也可以直接瀏覽至建立精靈

步驟 2:設定新的應用程式 填寫表單,如下所示。

  1. 名稱msdocs-quarkus-postgres。 已為您建立名為 msdocs-quarkus-postgres_group 的資源群組。
  2. 執行階段堆疊JAVA 21
  3. Java 網頁伺服器堆疊Java SE (內嵌網頁伺服器)
  4. 作系統Linux
  5. [區域]:您附近的任何 Azure 區域。
  6. Linux 方案新建 並使用 msdocs-quarkus-postgres 名稱。
  7. 定價方案基本 B1。 準備好時,您可以 升級 至不同的定價層。

步驟 3:新增資料庫

  1. 選取 資料庫 索引標籤。
  2. 選取 [建立資料庫]。
  3. [引擎] 中,選取 [PostgreSQL - 彈性伺服器]。 伺服器名稱和資料庫名稱預設會設定為適當的值。

步驟 4:設定 GitHub 部署

  1. 選取 [部署] 索引標籤。
  2. 選取 [持續部署]。
  3. 如果這是您第一次在 App Service 中設定 GitHub 部署,請選取 [ 授權 ] 並使用您的 GitHub 帳戶進行驗證。
  4. [組織] 中,選取您的 GitHub 別名。
  5. 在 [存放庫] 中,選取 msdocs-quarkus-postgresql-sample-app
  6. 在 [分支] 中,選取 [starter-no-infra]
  7. 選取 [檢閱 + 建立]
  8. 驗證完成時,選取 [建立]。 根據預設,建立精靈 會建立使用者指派的身分識別 ,讓工作流程使用 Microsoft Entra (OIDC 驗證) 進行驗證。 如需替代驗證選項,請參閱使用 GitHub Actions 部署至 App Service

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

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

3.安全連線秘密

建立精靈已為您產生連線變數做為應用程式設定。 不過,安全性最佳做法是將祕密完全從 App Service 中移出。 您將在服務連接器的協助下,將您的秘密移至密鑰保管庫,並將您的應用程式設定更改為 密鑰保管庫參考

步驟 1:擷取現有的連接字串

  1. 在 App Service 頁面的左側功能表中,選取 [ 設定 > 環境變數]。
  2. 選取 [連接字串]。
  3. 選取 [AZURE_POSTGRESQL_CONNECTIONSTRING]
  4. [新增/編輯應用程式] 設定的 [ ] 字段中,尋找字串結尾的使用者 標識元=Password= 元件。
  5. 複製 使用者標識碼=Password= 之後的使用者名稱和密碼字串,以供稍後使用。 此應用程式設定可讓您連線到私人端點後方所保護的Postgres資料庫。 不過,秘密會直接儲存在 App Service 應用程式中,這不是最好的方式。 您要變更此設定。

步驟 2:建立保護 金鑰保存庫 的子網 虛擬網路已經有兩個現有的子網,但其中一個已委派給 App Service,另一個已委派給適用於 PostgreSQL 的 Azure 資料庫。 您可以建立另一個密鑰保存庫,以使用私人端點安全地存取 金鑰保存庫(如需詳細資訊,請參閱 Azure Key Vault 的網路安全性)。

  1. 在 App Service 頁面的左側功能表中,選取 [ 概觀] 索引標籤。
  2. 選取應用程式的資源群組。
  3. 選取資源群組中的虛擬網路。
  4. 在虛擬網路的左側功能表中,選取 [ 設定 > 子網]。
  5. 選取+ 子網路
  6. [名稱] 中,輸入 subnet-keyvault。 接受預設值。
  7. 選取 ,然後新增

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

  1. 在頂端搜尋列中,輸入「密鑰保存庫」,然後選取 [Marketplace>金鑰保存庫]。
  2. [資源群組] 中,選取 [msdocs-quarkus-postgres_group]。
  3. 在 [金鑰保存庫名稱] 中,輸入只包含字母和數字的名稱。
  4. [區域] 中,將它設定為與資源群組相同的位置。

步驟 4:使用私人端點保護金鑰保存庫

  1. 選擇 網路 標籤。
  2. 取消勾選 啟用公用存取
  3. 選取 [建立私人端點]
  4. [資源群組] 中,選取 [msdocs-quarkus-postgres_group]。
  5. 在對話方塊的 [位置] 中,選取與 App Service 應用程式相同的位置。
  6. [名稱] 中,輸入 msdocs-quarkus-postgresVaultEndpoint
  7. [虛擬網络] 中,選取 [vnet-xxxxxxx]。
  8. [子網] 中, 子網密鑰保存庫
  9. 請選擇 [確定]
  10. 選取 [檢閱 + 建立],然後選取 [建立]。 等候金鑰保存庫部署完成。 您應該會看到「您的部署已完成」。

步驟 5:建立 PostgreSQL 連接器

  1. 在頂端搜尋列中,輸入 msdocs-quarkus-postgres,然後選取名為 msdocs-quarkus-postgres 的 App Service 資源。
  2. 在 App Service 頁面的左側功能表中,選取 [ 設定 > 服務連接器 > 建立]。
  3. [服務類型] 中,選取 [適用於 PostgreSQL 的 DB 彈性伺服器]。
  4. PostgreSQL 彈性伺服器中,應該已經選取 msdocs-quarkus-postgres-server
  5. PostgreSQL 資料庫中,選取 msdocs-quarkus-postgres-database
  6. [用戶端類型] 中,選取 [Java]。

步驟 6:將秘密儲存在金鑰保存庫中

  1. 選擇「驗證」索引標籤。
  2. 選取 [ 連接字串]。
  3. 在 [ 用戶名稱 ] 和 [ 密碼] 中,貼上您稍早複製的密碼。
  4. 選取 [在 金鑰保存庫 中儲存秘密]
  5. 在 [金鑰保存庫連線] 底下,選取 [新建]。 [建立連線] 對話方塊會在編輯對話方塊的頂端開啟。

步驟 7:建立 金鑰保存庫 連線

  1. 建立連線 對話方塊中,於 金鑰保管庫 選擇您稍早建立的金鑰保管庫。
  2. [用戶端類型] 中,選取 [Java ] 以取得一致性。 您的應用程式程式代碼實際上不會直接使用金鑰保存庫。
  3. 按一下 檢閱 + 建立
  4. 驗證完成時,請選取 建立

步驟 8:完成 PostgreSQL 連接器設定

  1. 您回到 PostgreSQL 連接器的編輯對話框中。 在 [驗證] 索引標籤中,等候建立金鑰保存庫連接器。 完成時,[金鑰保存庫 連線] 下拉式清單會自動加以選取。
  2. 按一下 檢閱 + 建立
  3. 驗證完成時,請選取 建立。 等到 [建立成功 ] 通知出現為止。

步驟 9:驗證 金鑰保存庫 整合

  1. 從左側功能表中,再次選取 [ 設定 > 環境變數 ]。
  2. AZURE_POSTGRESQL_CONNECTIONSTRING 旁,選取 [顯示值]。 此值應該是 @Microsoft.KeyVault(...),這表示它是 密鑰保存庫參考 ,因為密碼現在已在密鑰保存庫中管理。

步驟 10:從 App Service 刪除資料庫認證

  1. 選取 連線字串 索引標籤。
  2. AZURE_POSTGRESQL_CONNECTIONSTRING右側,選取 [ 刪除]。 請記住,建立精靈會在開頭為您建立此連接字串。

總結來說,確保您的連接密鑰的過程包括:

  • 從 App Service 應用程式的環境變數擷取連線秘密。
  • 使用私人端點建立金鑰保存庫。
  • 使用系統指派的受控識別建立 金鑰保存庫 連線。
  • 建立服務連接器,以將連線秘密儲存在金鑰保存庫中。
  • 從 App Service 應用程式刪除舊的連線秘密。

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

4.部署範例程式碼

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

請注意:

  • Quarkus 預設會接聽埠 8080。 在生產環境中,它必須設定為接聽 App Service 中環境變數所 PORT 指定的埠。
  • 您部署的 Java 套件必須是 Uber-Jar
  • 為了簡化本教學課程,您將在部署程序期間停用測試。 GitHub Actions 執行器無法存取 Azure 中的 PostgreSQL 資料庫,因此任何需要資料庫存取的整合測試都會失敗,例如 Quarkus 應用程式範例的情況。

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

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

  1. 選取 [聊天] 檢視,然後選取 +,即可啟動新的聊天工作階段。
  2. 問:「@workspace應用程式如何連線至資料庫?」Copilot 可能會提供您在 src/main/resources/application.properties 中如何設定 Quarkus 數據源設定的一些說明。
  3. 例如:「@workspace我在 Azure App 服務 中使用 Java 用戶端類型建立 PostgreSQL 服務連接器,而應用程式設定名稱AZURE_POSTGRESQL_CONNECTIONSTRING。我想要在生產環境中執行應用程式時使用此連接字串。Copilot 可能會提供類似 選項 2 中的程式代碼建議:沒有下面的 GitHub Copilot 步驟,甚至告訴您在 src/main/resources/application.properties 檔案中進行變更。
  4. 在文件總管中,開啟 src/main/resources/application.properties 並新增代碼建議。
  5. 說:「@workspace,如何設定這個專案以便建立 Uber Jar?」Copilot 可能會提供與下面選項 2:不使用 GitHub Copilot步驟類似的程式碼建議,並告訴您在src/main/resources/application.properties檔案中進行變更。
  6. 在文件總管中,開啟 src/main/resources/application.properties 並新增代碼建議。
  7. 說「@workspace 我要如何使用 App Service 連接埠?」Copilot 提供類似以下 [選項 2:沒有 GitHub Copilot] 步驟中的程式碼建議,甚至告訴您在 src/main/resources/application.properties 檔案中進行變更。
  8. 在文件總管中,開啟 src/main/resources/application.properties 並新增代碼建議。 GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需秘訣,請參閱 如何在我的程式代碼空間中使用 GitHub Copilot?

步驟 2 (選項 2:不含 GitHub Copilot):

  1. 在總管中開啟 src/main/resources/application.properties。 Quarkus 會使用此檔案來載入 Java 屬性。
  2. 取消註解行 10-12。 這些設定會使用您使用 PostgreSQL 連接器建立的應用程式設定、建立 Uber Jar,並將埠設定為 App Service 所使用的埠。

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

  1. 詢問「@workspace針對 GitHub Actions 部署,我想略過測試以避免資料庫相關錯誤」。Copilot 可能會提供類似 選項 2 中的程式代碼建議:沒有下面的 GitHub Copilot 步驟,甚至告訴您在 .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml 檔案中進行變更。
  2. 在檔案總管中開啟 .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml,並增加程式碼建議。 如需秘訣,請參閱 如何在我的程式代碼空間中使用 GitHub Copilot?

步驟 3 (選項 2:沒有 GitHub Copilot):

  1. 在總管中開啟 .github/workflows/starter-no-infra_msdocs-quarkus-postgres.yml。 這是建置精靈為您建立的 GitHub Actions 工作流程。
  2. 尋找Build with Maven步驟,並將run命令修改為mvn clean install -DskipTests-DskipTests 告知 Maven 略過測試,讓部署不會在資料庫錯誤時失敗。 GitHub Actions 容器無法連線到 PostgreSQL 伺服器。

步驟4:

  1. 選取 [原始檔控制] 延伸模組。
  2. 在文字方塊中,輸入提交訊息,例如 Configure DB and deployment。 或者,選取 並讓 GitHub Copilot 為您產生認可訊息。
  3. 選取 [認可],然後使用 [是] 來確認。
  4. 選取 [同步變更 1],然後使用 [確定] 來確認。

步驟 5:

  1. 從左側功能表中,選取 [部署>中心>記錄]。
  2. 在部署執行的記錄項目中,選取時間戳記最新的 [建置/部署記錄] 項目。

步驟 6: 系統會帶您前往 GitHub 存放庫,並查看 GitHub 動作正在執行。 工作流程檔案會定義兩個不同的階段:建置和部署。 等候 GitHub 執行顯示成功狀態。 需要約 5 分鐘的時間。

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

5.瀏覽至應用程式

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

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

步驟 2:將一些水果新增至清單。 恭喜,您正在 Azure App 服務 中執行 Web 應用程式,並安全地連線至 PostgreSQL 的適用於 PostgreSQL 的 Azure 資料庫。

6.資料流診斷記錄

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

private static final Logger LOGGER = Logger.getLogger(FruitEntityResource.class.getName());

@GET
public List<FruitEntity> get() {
    LOGGER.info("In FruitEntityResource.get()");
    return FruitEntity.listAll(Sort.by("name"));
}

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

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

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

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

7.清除資源

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

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

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

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

步驟 3:

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

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

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

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

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

  1. 從 GitHub Codespace 的存放庫根目錄中,執行 azd init

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

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

    azd auth login
    
  4. 使用 azd provision 命令建立必要的 Azure 資源。 請遵循提示選取 Azure 資源所需的訂用帳戶和位置。

    azd provision
    

    azd provision 命令需要大約 15 分鐘才能完成 (時間多半用在 Redis 快取上)。 稍後,您將修改程式碼以使用 App Service,並使用 azd deploy 部署這些變更。 執行時,此命令會提供佈建和部署程序的相關資訊,包括 Azure 中部署的連結。

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

    • 資源群組:所有已建立資源的容器。
    • App Service 方案:定義 App Service 的計算資源。 系統會建立基本層中的 Linux 方案。
    • App Service:代表您的應用程式,並在 App Service 方案中執行。
    • 虛擬網路:與 App Service 應用程式整合,並隔離後端網路流量。
    • 私人端點:虛擬網路中的金鑰保存庫和 Redis 快取的存取端點。
    • 網路介面:代表私人 IP 位址,每個私人端點各有一個位址。
    • 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器:只能從虛擬網路內部存取。 系統會為您在伺服器上建立資料庫和使用者。
    • 私人 DNS 區域:啟用虛擬網路中 PostgreSQL 伺服器的 DNS 解析。
    • Log Analytics 工作區:作為應用程式傳送記錄的目標容器,您也可以在其中查詢記錄。
    • Azure Managed Redis:僅能從其私有端點背後存取。
    • 金鑰保存庫:只能從其私人端點後方存取。 用於管理 App Service 應用程式的秘密。
  5. 布建完成後,請在 AZD 輸出中尋找設定 AZURE_POSTGRESQL_CONNECTIONSTRING 。 為了保護祕密安全,只會顯示設定名稱。 其在 AZD 輸出中看起來像這樣:

     App Service app has the following connection settings:
             - AZURE_POSTGRESQL_CONNECTIONSTRING
             - AZURE_REDIS_CONNECTIONSTRING
             - AZURE_KEYVAULT_RESOURCEENDPOINT
             - AZURE_KEYVAULT_SCOPE
     

    您使用的 AZD 範本已為您產生連線變數作為應用程式設定,並將其輸出至終端機以方便使用。 應用程式設定是將連線秘密保留在程式碼存放庫外部的一個方法。 您也可以找到所建立 App Service 應用程式之應用程式設定頁面的直接連結。

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

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

您必須在應用程式程式代碼中進行一些變更,才能讓它與 App Service 搭配運作:

  • Quarkus 預設會接聽埠 8080。 在生產環境中,它必須設定為接聽 App Service 中環境變數所 PORT 指定的埠。
  • 您部署的 Java 套件必須是 Uber-Jar
  • 為了簡化本教學課程,您將在部署程序期間停用測試。 GitHub Actions 執行器無法存取 Azure 中的 PostgreSQL 資料庫,因此任何需要資料庫存取的整合測試都會失敗,例如 Quarkus 應用程式範例的情況。
  1. 在 GitHub codespace 中,選取 聊天 檢視,然後選取 + 以啟動新的聊天會話。

  2. 問:「@workspace應用程式如何連線至資料庫?」Copilot 可能會提供您在 src/main/resources/application.properties 中如何設定 quarkus 數據源設定的一些說明。

  3. 例如:「@workspace我已使用 Java 用戶端類型在 Azure App 服務 中建立 PostgreSQL 服務連接器,且應用程式設定名稱AZURE_POSTGRESQL_CONNECTIONSTRING。我想要在生產環境中執行應用程式時使用此連接字串。Copilot 可能會提供類似 選項 2 中的程式代碼建議:沒有下面的 GitHub Copilot 步驟,甚至告訴您在 src/main/resources/application.properties 檔案中進行變更。

  4. src/main/resources/application.properties 中新增程式碼建議。

  5. 說:「@workspace,如何設定這個專案以便建立 Uber Jar?」Copilot 可能會提供與下面選項 2:不使用 GitHub Copilot步驟類似的程式碼建議,並告訴您在src/main/resources/application.properties檔案中進行變更。

  6. src/main/resources/application.properties 中新增程式碼建議。

  7. 說「@workspace 我要如何使用 App Service 連接埠?」Copilot 提供類似以下 [選項 2:沒有 GitHub Copilot] 步驟中的程式碼建議,甚至告訴您在 src/main/resources/application.properties 檔案中進行變更。

  8. src/main/resources/application.properties 中新增程式碼建議。

    GitHub Copilot 不會每次都提供相同的回應,而且這些回應不一定正確。 您可能需要詢問更多問題,以微調其回應。 如需秘訣,請參閱 如何在我的程式代碼空間中使用 GitHub Copilot?

  9. 在終端機中,執行 azd deploy

    azd deploy
    

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

5.瀏覽至應用程式

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

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: https://<app-name>.azurewebsites.net/
     
  2. 將一些水果新增至清單。

    Quarkus Web 應用程式的螢幕擷取畫面,其中在 Azure 中執行的 PostgreSQL 會顯示水果清單。

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

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

6.資料流診斷記錄

Azure App 服務 會擷取主控台記錄,以協助您診斷應用程式的問題。 為了方便起見,AZD 範本已經 啟用了本地文件系統的記錄功能,並將 日誌傳送至 Log Analytics 工作區

如下所示,應用程式範例包含可示範這項功能的標準 JBoss 記錄陳述式。

private static final Logger LOGGER = Logger.getLogger(FruitEntityResource.class.getName());

@GET
public List<FruitEntity> get() {
    LOGGER.info("In FruitEntityResource.get()");
    return FruitEntity.listAll(Sort.by("name"));
}

在 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 應用程式中的記錄。

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

7.清除資源

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

azd down

疑難排解

GitHub Actions 執行在建置階段失敗

選取失敗的建置階段,以查看哪個步驟失敗。 如果是 使用 Maven 構建 階段,展開步驟以確認使用了 -DskipTests 選項。 如果沒有,請返回 4。部署範例程序代碼 ,並根據指示修改 GitHub 工作流程檔案。

應用程式無法啟動,並在記錄數據流中顯示下列錯誤:「模型類別是針對預設持續性單位 <預設值> 所定義,但找不到已設定的數據源 <預設值> :將不會建立預設 EntityManagerFactory。」

此 Quarkus 錯誤很可能是因為應用程式無法連線到 Azure 資料庫。 請確定應用程式設定 AZURE_POSTGRESQL_CONNECTIONSTRING 尚未變更,且 application.properties 已正確使用應用程式設定。

應用程式無法啟動,日誌流顯示「等候容器熱身請求的回應」

您的應用程式可能未設定為接聽 App Service PORT 環境變數指定的埠,因此無法回應任何要求。 如果 App Service 未從您的應用程式取得回應,則會假設應用程式無法啟動。 返回 4。部署範例程序代碼 ,並確認 application.properties 已正確設定。

應用程式運作正常,但我看到錯誤記錄檔「ERROR [org.acm.hib.orm.pan.ent.FruitEntityResource] (vert.x-eventloop-thread-0) 無法處理要求:jakarta.ws.rs.NotFoundException: HTTP 404 Not Found“。

這是 Vert.x 錯誤 (請參閱 Quarkus 回應式架構),指出用戶端要求未知的路徑。 當用戶端在Hibernate資料庫移轉發生之前要求REST API時,第一次啟動應用程式時就會發生此情況。

在 App Service 中,每個應用程式啟動時也會發生此錯誤,因為 App Service 會透過將要求傳送 GET/robots933456.txt來驗證應用程式是否啟動。

常見問題集

這設定會產生多少費用?

建立資源的定價如下:

  • App Service 方案是在基本層中建立,並可擴大或縮小。 請參閱 App Service 定價
  • PostgreSQL 彈性伺服器是在最低的高載層 Standard_B1ms 中建立,搭配最少的儲存體大小,儲存體大小可以相應增加或減少。 請參閱 Azure PostgreSQL Database 定價
  • 除非您設定額外的功能 (例如對等互連),否則虛擬網路不會產生費用。 請參閱 Azure 虛擬網路定價
  • 私人 DNS 區域會產生少量費用。 請參閱 Azure DNS 定價

如何使用其他工具連線至虛擬網路後方受保護的 PostgreSQL 伺服器?

  • 若要從命令列工具進行基本存取,您可以從應用程式的 SSH 終端機執行 psql
  • 若要從桌面工具連線,您的電腦必須位於虛擬網路內。 例如,該電腦可以是連線到其中一個子網路的 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 工作流程期間使用 PostgreSQL 執行測試,該怎麼辦?

預設 Quarkus 應用程式範例包含具有資料庫連線能力的測試。 若要避免連線錯誤,您新增了 -skipTests 屬性。 如有需要,您可以針對 PostgreSQL 服務容器執行測試。 例如,在 GitHub 分支 (.github/workflows/main_cephalin-quarkus.yml) 中自動產生的工作流程檔案中,進行下列變更:

  1. 將 PostgreSQL 容器的 YAML 程式碼新增至 build 作業,如下列程式碼片段所示。

    ...
    jobs:
      build:
        runs-on: ubuntu-latest
    
        # BEGIN CODE ADDITION
        container: ubuntu
        services:
          # Hostname for the PostgreSQL container
          postgresdb:
            image: postgres
            env:
              POSTGRES_PASSWORD: postgres
              POSTGRES_USER: postgres
              POSTGRES_DB: postgres
            # Set health checks to wait until postgres has started
            options: >-
              --health-cmd pg_isready
              --health-interval 10s
              --health-timeout 5s
              --health-retries 5
    
        # END CODE ADDITION
    
        steps:
          - uses: actions/checkout@v4
          ...
    

    container: ubuntu 會指示 GitHub 在容器中執行 build 作業。 如此一來,當工作流程執行時,您開發環境 jdbc:postgresql://postgresdb:5432/postgres 中的連接字串就可以如往常運作。 如需 GitHub Actions 中 PostgreSQL 連線能力的詳細資訊,請參閱建立 PostgreSQL 服務容器

  2. Build with Maven 步驟中,移除 -DskipTests。 例如:

          - name: Build with Maven
            run: mvn clean install -Dquarkus.package.type=uber-jar
    

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

請參閱 部署中心中的 GitHub Actions 部署設定

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

您可能已經注意到建立 Codespace 時,GitHub Copilot 聊天檢視已可供您使用。 不過,您需要一個 GitHub Copilot 帳戶 (英文) (可免費試用 30 天)。

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

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

後續步驟

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

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