Azure 容器應用程式可以在雲端中執行任何容器化 Java 應用程式,同時提供部署應用程式的彈性選項。
針對容器化 Java 應用程式使用容器應用程式時,您會獲得:
符合成本效益的調整:使用使用量方案時,您的 Java 應用程式可以調整為零。 當應用程式需求較低時,縮容操作會自動降低專案的成本。
部署選項:Azure 容器應用與 Buildpacks 整合,讓你能直接從 Maven 建置、使用工件檔案,或是使用自己的 Dockerfile 部署。
自動調整記憶體 (預覽):容器應用程式可將 Java 虛擬機器 (JVM) 管理記憶體 的方式最佳化,讓您的 Java 應用程式有最多記憶體可使用。
組建環境變數 (預覽):您可以設定自訂機碼值組,以從原始程式碼控制 Java 映像組建。
本文說明您在 Azure 容器應用程式上建置 Java 應用程式時需要知道的資訊。
部署類型
執行容器化應用程式通常表示您必須為應用程式建立 Dockerfile,但在容器應用程式上執行 Java 應用程式會提供一些選項。
| 類型 | 描述 | 使用 Buildpacks | 使用 Dockerfile |
|---|---|---|---|
| 原始程式碼編譯 | 您可以從原始程式碼直接部署至容器應用程式。 | 是 | No |
| 成品組建 | 您可以建立 Maven 組建以部署至容器應用程式 | 是 | No |
| Dockerfile | 您可以手動建立 Dockerfile,並完全掌控部署。 | No | 是 |
注意
Buildpacks 部署支援 Java Development Kit(JDK)版本 8、11、17 和 21。
應用程式類型
不同的應用程式類型會以單一容器應用程式或容器 應用程式工作的形式實作。 使用下表可協助您決定最適合您案例的應用程式類型。
下表所列的範例不是要鉅細靡遺,而是為了協助您更好地了解不同應用程式類型的意圖。
| 類型 | 範例 | 實作為…… |
|---|---|---|
| Web 應用程式和 API 端點 | Spring Boot、Quarkus、Apache Tomcat 和 Jetty | 個別容器應用程式 |
| 主控台應用程式、排程工作、工作執行器、批次工作 | SparkJobs、ETL 工作、Spring Batch 工作、Jenkins 管線工作 | 容器應用程式任務 |
偵錯
當您在 Container Apps 上偵錯 Java 應用程式時,請務必檢查 Java 進程代理程式是否有日誌流和控制台偵錯訊息。
疑難排解
當您開發 Java 應用程式時,請記住下列項目:
預設資源:依預設,應用程式有一半的 CPU 和 1 GB 可用。
無狀態處理序:隨著容器應用程式縮減和擴增,新處理序即會建立並關閉。 務必事先規劃,以便將資料寫入共用儲存體,例如資料庫和檔案系統共用。 請勿預期任何直接寫入容器檔案系統的檔案都可供任何其他容器使用。
調整為零是預設值:如果您需要確保應用程式的一或多個執行個體持續執行,請確定您定義調整規則以最符合您的需求。
非預期的行為:如果您的容器應用程式無法建置、啟動或執行,請驗證您的容器中已正確設定成品路徑。
Buildpack 支援問題:如果您的 Buildpack 不支援相依性或所需的 Java 版本,請建立自己的 Dockerfile 來部署您的應用程式。 您可以檢視範例 Dockerfile (英文) 來參考。
SIGTERM 和 SIGINT 訊號:根據預設,JVM 會處理
SIGTERM和SIGINT訊號,而且不會將它們傳遞至應用程式,除非您攔截這些訊號並據以處理應用程式中的訊號。 容器應用程式會同時使用SIGTERM和SIGINT來進行流程控制。 如果您未擷取這些訊號,且應用程式意外終止,除非您將這些訊號保存到儲存體,否則可能會遺失訊號。存取容器映像:如果您將人工制品或原始程式碼部署與預設登錄結合使用,則無法直接存取您的容器映像。
監視
所有標準可觀測性工具都可搭配您的 Java 應用程式使用。 建置 Java 應用程式以在容器應用程式上執行時,請記住下列項目:
計量:Java 虛擬機器 (JVM) 計量對於監視 Java 應用程式的健康情況和效能而言非常重要。 收集的資料包括有關 JVM 的記憶體使用量、垃圾回收和執行緒數量的資訊。 您可以檢查指標,以協助確保您的應用程式的健康狀況和穩定性。
記錄:將應用程式和錯誤訊息傳送至
stdout或stderror,使得它們可以出現在記錄資料流中。 避免如同使用普通記錄服務時一樣,直接記錄至容器的檔案系統。效能監控設定:將效能監控服務部署為容器應用程式環境中的個別容器,使得它可以直接存取您的應用程式。
診斷
Azure 容器應用程式專為 Java 開發人員提供內建的診斷工具。 此支援可簡化在 Azure 容器應用程式上執行的 Java 應用程式的偵錯和疑難排解,以提升效率並簡化。
- 動態日誌等級:允許你在不修改程式碼或強制重新啟動應用程式的情況下,存取並檢查不同層級的日誌細節。 您可以檢視設定動態記錄器層級 作為參考。
調整大小
如果您需要確保來自前端應用程式的要求到達相同的伺服器,或是您的前端應用程式被分散到多個容器中,請務必啟用黏性工作階段。
安全性
容器應用程式執行環境會幫你終止 TLS。
記憶體管理
為了幫助優化 Java 應用程式中的記憶體管理,請確保應用程式中啟用 了 JVM 記憶體擬合 。
記憶體的單位是 GiB(Gibibyte)和 CPU 核心對。 下表顯示容器應用程式可用的資源範圍。
| 臨界值 | CPU 核心 | 以吉比位元組(GiB)為單位的記憶體 |
|---|---|---|
| 最小值 | 0.25 | 0.5 |
| 最大值 | 4 | 8 |
核心以每次增加 0.25 核心的方式提供,記憶體則以 2:1 的比例提供。 舉例來說,如果你需要 1.25 核心,容器應用程式就有 2.5 GiB 的記憶體可用。
注意
對於使用 JDK 版本 9 和更低版本的應用程式,請務必定義自訂 JVM 記憶體設定,以符合 Azure 容器應用程式中的記憶體配置。
Java 元件支援
Azure Container Apps 支援下列 Java 元件作為受控服務:
Eureka Server for Spring:服務註冊和探索是維護即時應用程式執行個體清單的重要需求。 你的應用程式會用這個清單來路由和負載平衡入站請求。 手動設定每個用戶端需要時間,因此可能引進人為錯誤。 Eureka Server 藉由作為服務註冊中心來簡化服務探索的管理,微服務可以在其中自行註冊,並發現系統內的其他服務。
Config Server for Spring:Config Server 為分散式系統提供集中式外部組態管理。 此元件旨在解決在雲端原生環境中 管理多個微服務配置設定 的挑戰。
Gateway for Spring:Gateway for Spring 提供一種高效且強大的路由、管理及處理 API 請求的方式,作為微服務架構的一部分。 它作為 一個 API 閘道 器,將外部請求路由至不同服務,並新增過濾與負載平衡等功能。
Admin for Spring:Admin for Spring 管理元件提供為具有執行端點的 Spring Boot 網頁應用程式設計的管理介面。 受控元件可讓您將容器應用程式繫結至 Admin for Spring 元件,以提供容器應用程式的整合和管理。