Azure 容器应用 中的 Java 概述

Azure 容器应用可以在云中运行任何容器化Java应用程序,同时提供灵活选项来部署应用程序。

将容器应用用于容器化Java应用程序时,可以:

  • 具成本效益的扩展:使用 Consumption 计划时,Java应用可缩减至零。 当对你的应用需求很少时进行缩减规模,会自动降低项目成本。

  • 部署选项:Azure 容器应用与 Buildpacks 集成,它允许你直接从 Maven 生成、使用项目文件或自己的 Dockerfile 进行部署。

    • JAR 部署(预览版):可以直接从 JAR 文件部署容器应用。

    • WAR 部署(预览版):可以直接从 WAR 文件部署容器应用。

    • IDE 支持:可以直接从 IntelliJ 部署容器应用。

  • 自动内存拟合(预览版):容器应用优化Java虚拟机(JVM)管理内存的方式,使Java应用程序最可能的内存可用。

  • Build 环境变量(预览版):可以配置 自定义键值对来控制 Java 镜像从源代码构建。

本文介绍在 Azure 容器应用上生成 Java 应用程序时需要了解的信息。

部署类型

运行容器化应用程序通常意味着需要为应用程序创建 Dockerfile,但在容器应用中运行Java应用程序可提供一些选项。

类型 描述 使用 Buildpacks(生成包) 使用 Dockerfile
源代码生成 可以直接从源代码部署到容器应用。 是 否
工件生成 可以创建 Maven 生成项以部署到容器应用 是 否
Dockerfile 可以手动创建 Dockerfile 并完全控制部署。 否 是

注意

Buildpacks 部署支持 Java 开发工具包(JDK)版本 8、11、17 和 21。

应用程序类型

不同的应用程序类型作为单个容器应用或 容器应用作业实现。 使用下表帮助你确定哪种应用程序类型最适合你的方案。

此表中列出的示例并不详尽,但有助于最好地了解不同应用程序类型的意图。

类型 示例 实现为...
Web 应用程序和 API 接口 Spring Boot、Quarkus、Apache Tomcat 和 Jetty 单个容器应用
控制台应用程序、计划任务、任务运行程序、批处理作业 Spark 作业、ETL 任务、Spring Batch 作业、Jenkins 流水线作业 容器应用的任务

调试

在容器应用中调试Java应用程序时,请务必检查 Java 进程代理日志流和控制台调试消息。

疑难解答

开发Java应用程序时,请记住以下各项:

  • 默认资源:默认情况下,应用有一半的 CPU 和 1 GB 空间可用。

  • 无状态进程:随着容器应用横向缩减和扩展,会创建新进程和关闭进程。 请确保提前计划,以便将数据写入共享存储,例如数据库和文件系统共享。 不要期望直接写入到容器文件系统的任何文件都可供任何其他容器使用。

  • 默认设置是缩放为零:如果需要确保应用程序的一个或多个实例持续运行,请确保定义缩放规则,以最大程度地满足需求。

  • 意外行为:如果容器应用无法生成、启动或运行,请验证是否已在容器中正确设置项目路径。

  • Buildpack 支持问题:如果 Buildpack 不支持依赖项或所需的Java版本,请创建自己的 Dockerfile 来部署应用。 可以查看 sample Dockerfile以供参考。

  • SIGTERM 和 SIGINT 信号:默认情况下,JVM 处理 SIGTERM 和 SIGINT 信号,并且不会将它们传递到应用程序,除非你截获这些信号并在应用程序中相应地对其进行处理。 容器应用使用 SIGTERM 和 SIGINT 来控制进程。 如果未捕获这些信号,并且应用程序意外终止,则可能会丢失这些信号,除非将其保存到存储中。

  • 访问容器映像:如果将项目或源代码部署与默认注册表结合使用,则无权直接访问容器映像。

监视

所有标准可观测性工具都适用于Java应用程序。 生成要在容器应用上运行的Java应用程序时,请记住以下各项:

  • Metrics:Java虚拟机(JVM)指标对于监视Java应用程序的运行状况和性能至关重要。 收集的数据包括对 JVM 的内存使用情况、垃圾回收和线程计数的见解。 你可以检查指标以帮助确保应用程序的运行状况和稳定性。

  • 日志记录:将应用程序和错误消息发送到 stdout 或 stderror,以便它们可显示在日志流中。 不要在使用常用日志记录服务时直接登录到容器的文件系统。

  • 性能监视配置:将性能监视服务部署为容器应用环境中的单独容器,以便它可以直接访问应用程序。

诊断

Azure 容器应用专门为Java开发人员提供内置诊断工具。 此支持简化了Azure 容器应用上运行的Java应用程序的调试和故障排除,以提高效率和简化操作。

  • 动态记录器级别:允许你访问和检查不同级别的日志详细信息,而无需修改代码或强制重启应用。 可以查看设置动态记录器级别,以供参考。

扩展

如果需要确保来自前端应用程序的请求到达同一服务器,或者前端应用在多个容器之间拆分,请确保启用粘性会话。

安全性

容器应用运行时会终止容器应用环境中的 TLS。

内存管理

为了帮助优化 Java 应用程序中的内存管理,请确保在应用中启用 JVM 内存拟合 。

内存以 gibibytes (GiB) 和 CPU 核心对为单位进行度量。 下表显示了容器应用可用的资源范围。

阈值 CPU 核心数 Gibibytes 中的内存 (GiB)
最小值 0.25 0.5
最大 4 8

核心以每0.25核心为单位提供,内存按照2:1的比例提供。 例如,如果需要 1.25 个核心,容器应用可以使用 2.5 GiB 内存。

注意

对于使用 JDK 版本 9 及更低版本的应用,请确保定义自定义 JVM 内存设置,以匹配Azure 容器应用中的内存分配。

Java组件支持

Azure 容器应用支持以下Java组件作为托管服务:

  • Config Server for Spring:Config Server 为分布式系统提供集中式外部配置管理。 此组件旨在解决在云原生环境中 跨多个微服务管理配置设置 的挑战。