Blog chevron_right Java

Java 如何应对微服务的挑战

Is Java Right for the Challenges of Microservices?

总结

微服务高度依赖容器进行部署。容器简化了部署流程,因为容器化的服务几乎可以在任何环境中运行。 

在本文中,您将了解: 

  • 微服务架构将单体应用程序拆分为众多组件任务
  • 微服务本质上是分布式的,可能会耗尽资源
  • 随着服务负载的增加,性能可能会下降
  • 在同一物理硬件上支持多个 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 的高性能微服务》了解更多信息。

Teal CTA Band

别走!

了解有关微服务和 Java 的更多信息