Azure 容器应用上的 Java 概述

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

对容器化 Java 应用程序使用容器应用时,你将获得以下优势:

  • 经济高效地缩放:使用消耗计划时,Java 应用可以缩放为零。 当对你的应用需求很少时进行横向缩放,这会自动降低项目的成本。

  • 部署选项:Azure 容器应用与 Buildpacks 集成,这让你能够通过项目文件或自己的 Dockerfile 直接从 Maven 生成项进行部署。

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

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

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

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

  • 生成环境变量(预览版):可以配置自定义键值对来控制源代码中的 Java 映像生成。

本文详细介绍在 Azure 容器应用中构建 Java 应用程序时需要了解的信息。

部署类型

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

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

注意

生成包部署支持 JDK 版本 8、11、17 和 21。

应用程序类型

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

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

类型 示例 实现为...
Web 应用程序和 API 终结点 Spring Boot、Quarkus、Apache Tomcat 和 Jetty 单个容器应用
控制台应用程序、计划任务、任务运行程序、批处理作业 SparkJobs、ETL 任务、Spring Batch 作业、Jenkins 管道作业 容器应用作业

调试

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

疑难解答

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

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

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

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

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

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

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

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

监视

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

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

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

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

诊断

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

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

扩展

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

安全性

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

内存管理

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

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

阈值 CPU 核心数 内存,以千兆字节 (Gi) 为单位
最小值 0.25 0.5
最大 4 8

核心以 0.25 核心为增量提供,内存按 2:1 比率提供。 例如,如果需要 1.25 个核心,则容器应用可使用 2.5 Gi 的内存。

注意

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

Spring 组件支持

Azure 容器应用将以下 Spring 组件作为托管服务提供支持:

  • Eureka Server for Spring:服务注册和发现是维护实时应用实例的列表的关键要求。 应用程序使用此列表来路由和实现入站请求的负载平衡。 手动配置每个客户端会耗费时间,并引入人为错误的可能性。 Eureka Server 通过充当服务注册表来简化服务发现的管理,微服务可以在其中注册自己并发现系统中的其他服务。

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

  • 适用于 Spring 的控制台:适用于 Spring 的控制台托管组件提供的管理界面专为具有执行器终结点的 Spring Boot Web 应用程序设计。 托管组件允许将容器应用绑定到“适用于 Spring 的控制台”组件,从而为容器应用提供集成和管理功能。

后续步骤