你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

Azure 容器应用上的 Java 概述

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


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

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

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

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

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

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

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

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

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

部署类型

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

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

注意

Buildpacks 部署支持 Java 开发工具包(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 处理 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 组件提供支持:

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

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

  • Spring 网关:适用于 Spring 的网关提供了一种高效且强大的方法来路由、管理和处理 API 请求,作为微服务体系结构的一部分。 它充当将外部请求路由到不同服务的 API 网关 ,添加筛选和负载均衡等功能。

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