总结
微服务高度依赖容器进行部署。容器简化了部署流程,因为容器化的服务几乎可以在任何环境中运行。
在本文中,您将了解:
- 微服务架构将单体应用程序拆分为众多组件任务
- 微服务本质上是分布式的,可能会耗尽资源
- 随着服务负载的增加,性能可能会下降
- 在同一物理硬件上支持多个 JVM 实例可能是一项挑战
- 想快速、高效地启动新实例可能并非易事
- Azul Platform Prime 为许多类别的应用程序(包括微服务)提供了增强的性能
从传统的角度看,软件一直以单体应用程序的形式开发,被打包成单个统一的代码库。
单体应用程序自成体系,并且独立于其他应用程序。它能够作为单一单元轻松部署,但即便发生最微小的改动,整个应用程序也需要重新构建和重新部署。
微服务架构将单体应用程序拆分为众多组件任务。微服务架构本质上是分布式的,这可能会导致单体应用程序中不存在的问题。
- 当应用程序中的一项服务同步调用另一项服务时,若被调用方不可用,可能会导致整个应用程序陷入瘫痪。
- 调用方在等待被调用服务响应时,可能会消耗有限的资源(例如线程)。
要以可靠的方式实现这类系统,会面临诸多挑战。这些技术的许多核心概念构成了微服务的基础。Java 与微服务架构非常契合。
微服务给 JVM 带来了诸多挑战
在部署基于 Java 的微服务之前,需仔细考虑 JVM 在此类环境中的工作方式。有三个具体问题需要解决,而这正是高性能 Java 平台可能更有优势的地方。
为了应对这些挑战,Azul 开发了 Azul Platform Prime,这是一款高性能 Java 平台。Prime 是一款 JVM,可为许多类别的应用程序(包括在容器内运行的微服务)提供增强的性能。如下表所示,Prime 相较于标准 JVM 应用程序,在应对微服务带来的挑战方面具有显著优势:
挑战 | JVM 应用程序 | Azul Platform Prime |
---|---|---|
随着服务负载的增加,性能不应下降。 | 启动新的服务实例,确保现有实例在负载下提供一致的性能。随着服务实例负载的增加,这通常会导致更多的对象创建和 JVM 垃圾收集器的负载增加,这一点必须在服务部署配置中加以考虑。 | 即使在高负载下,Platform Prime 的 C4 垃圾收集器也不会触发全局停顿的压缩收集。JVM 内存管理的性能始终保持一致。如果服务内存受限,可以轻松增加分配的堆空间来解决内存不足问题,而不会影响性能。C4 算法带来的显著延迟降低和一致性影响也适用于断路器。断路器在系统中的激活频率以及重置前的长超时时间显著减少。 |
挑战 | JVM 应用程序 | Azul Platform Prime |
---|---|---|
在同一物理硬件上支持多个 JVM 实例。 | 问题不在于如何管理多个版本的 Java 运行时,而在于如何处理在同一台计算机上运行多个 JVM 进程。优化资源使用对于在特定服务器上扩展服务至关重要。 | Platform Prime 可与 Linux 操作系统结合使用,以优化内存管理子系统。Prime 的系统工具将保留一个可配置大小的物理内存区域,,供该机器上运行的所有 Prime VM 实例共享。Prime 重复利用已经在缓存中的内存页(热页),而不像传统的 JVM 那样在堆上分配新对象时频繁从操作系统获取冷页。 |
挑战 | JVM 应用程序 | Azul Platform Prime |
---|---|---|
如何快速高效地添加(“启动”)新服务实例以处理不同级别的工作负载。 | 随着负载的增加,需要启动新的服务实例,这要求这些服务必须能够尽快可用并达到最佳性能水平。传统的 JVM 需要时间来预热,因为它会分析正在使用的字节码并将常用方法编译为本机指令。 | Azul Platform Prime 的 ReadyNow 功能非常适合让新的服务实例快速启动并立即提供完整的性能表现。ReadyNow 帮助开发人员管理 Java 运行时去优化,并让他们更好地控制 Java 编译。ReadyNow 还允许保存和重复使用累积的编译器优化配置文件。 |
您可以在我们的电子书《使用 Java 的高性能微服务》中找到微服务挑战和 Platform Prime 功能的完整表格。
Azul Platform Prime 和微服务
Azul Platform Prime 基于开源 OpenJDK 源代码,它是 Java SE 标准的参考实现。为了提供比标准 JVM 更优的性能,Azul 替换了核心 JVM 的组件,采用自主实现的替代方案。这包括内存管理系统和部分即时 (JIT) 编译系统。
更快的 JIT 编译提升性能:传统的 JVM 采用两种 JIT 编译器。而 Azul Platform Prime 使用了名为 Falcon 的全新改进版编译器。Falcon 基于开源 LLVM 编译器项目,该项目得到了包括 Intel、NVidia、Apple 和 Sony 在内的众多公司和个人的支持。
使用 ReadyNow 加快预热:Azul 的 ReadyNow 技术从一开始就加速了生产环境中的应用程序预热。 每次应用程序启动时,JVM 和 JIT 都会执行其通常要做的所有工作,从而消除预热,使应用程序在启动时几乎都能立即达到全速运行状态。
使用云原生编译器留出可用资源:JIT 编译可提供现代企业应用程序所需的性能,但需要付出预热时间的代价。云原生编译器 (CNC) 将 JIT 编译器的工作转移到 JVM 之外处理,因此 JVM 会将详细信息发送给 CNC,从而为本地 JVM 留出可用资源。
借助 C4 垃圾收集改善 JVM 内存管理:在传统 JVM 中,应用程序会在垃圾收集期间停顿。这些停顿时间从毫秒到数小时不等,且时间不可预测。Azul Platform Prime 使用了不同的垃圾收集算法,即连续并发压缩收集器 (C4)。与其他商业垃圾收集算法不同,在 C4 垃圾收集器工作时,应用程序的线程可以继续运行。
结语
软件开发正在转向云端,并使用微服务以灵活、可扩展的方式实现这一目标。相比其他语言开发的微服务,Java 微服务也具有诸多优势。但是,如果您使用的是传统的 JVM,请在选择应用程序架构时仔细考虑几个部署问题。Azul Platform Prime 在垃圾收集和 JIT 编译系统的某些部分中采用了不同的内部算法。结合 ReadyNow 技术,Platform Prime 可以有效消除微服务性能的预热阶段,使其成为在微服务上进行现代 Java 应用程序开发的理想之选。阅读电子书《使用 Java 的高性能微服务》了解更多信息。