1.1 Quarkus 的概念和特征
Quarkus 的概念定义有多个方面的解释,本书采用的是官方定义:Quarkus 是一个全栈Kubernetes云原生Java开发框架,Quarkus 可以配合Java虚拟机做本地应用编译,它是专门针对容器进行优化的 Java 框架。Quarkus 可以促使 Java 成为 Serverless(无服务)、云原生和Kubernetes环境中的高效开发基础。
Red Hat官网将Quarkus 定位为超音速亚原子Java,宣称这是一个用于编写Java应用且以容器优先的云原生框架,其核心特点如下。
■ 容器优先(Container First):基于 Quarkus 的 Java 应用程序占用的空间很小,很适合在容器中运行。
■ 云原生(Cloud Native):支持在Kubernetes等环境中采用十二要素。
■ 统一命令式和响应式(Unify Imperative and Reactive):在统一的编程模型下实现非阻塞式和命令式开发模式的协同。
■ 基于 Java 规范(Standards-based):基于标准的 Java 规范和实现这些规范的翘楚框架,如 RESTEasy 和 JAX-RS 规范、Hibernate ORM 和 JPA 规范、Netty、Eclipse Vert.x、Eclipse MicroProfile、Jakarta EE等。
■ 微服务优先(Microservice First):可以实现Java应用快速启动和Java代码的迅速迭代。
■ 开发者的乐趣(Developer Joy):以开发体验为核心,让开发者的应用程序能迅速生成、测试和投入应用。
为什么会出现Quarkus 呢?这还要从Java的历史谈起。
Java诞生于20多年前,软件产业在这20年里经历了多次革命,但Java总是能够自我改造以与时俱进。多年来,大多数应用程序都运行在拥有大量 CPU 和内存资源的大型计算机和服务器上,在这种环境条件下,应用程序都独自占有 CPU 和内存。可是现在应用程序运行在虚拟化云上或容器中,其受限于环境、资源共享等要求,单位面积运行应用程序的密度发生了变化。每个节点都会尽可能多地运行小型应用程序(或微服务),并通过添加更多的应用实例而不是获得更强大的单个实例来进行扩展。
20年前设计的 Java已经不太适合这种新环境。当年 Java的核心理念是跨平台运行,Java应用程序被设计成可以全天候运行数月甚至数年,JIT 随着时间的推移优化执行,GC 有效地管理内存……但是所有这些特性都有代价。当部署20或50个微服务而不是一个应用程序时,运行 Java 应用程序所需的内存和启动时间就需要特别注意了。在引入微服务和高分布式架构后,启动时间甚至成为区分 Java 框架优劣的主要标志。同时,伴随着云平台和容器技术不断运用到软件开发中,计算和内存资源消耗情况同样也成为技术选型的主要关注点。这些关注点并不是Java虚拟机(JVM)本身的缺陷,而是需要重新打造Java生态系统。
Quarkus 就是Java重新改造后的产物,这是一个基于Java云原生的开发框架,它配合Java虚拟机做本地应用编译并专门针对容器进行了优化,使 Java 成为 Serverless、云原生和Kubernetes环境中的高效开发基础。可以说,Quarkus 推动了 Java在云原生开发方面的运用,使Java这门古老的编程语言再一次焕发了青春。
Quarkus 建议推广“提前技术”。当构建Quarkus 应用程序时,一些通常在运行时处理的工作会提前转移到构建时。因此,当应用程序运行时,所有的运行初始化内容都已经预先准备好,所有的注解扫描、XML 解析等都不会再执行。这样做带来了两个直接的好处:启动快多了和内存消耗低多了。
因此,如图 1-1 所示,Quarkus 确实针对基础设施进行了一些改造。首先其用于支持构建时元数据发现(如注解),声明哪些类在运行时需要反射。Quarkus 在构建时启动,并且通常无偿地提供大量的 GraalVM 优化。事实上,由于所有这些元数据,Quarkus 可以配置原生编译器,例如SubstrateVM编译器,为Java应用程序生成原生可执行程序文件,消除一些死代码,最终的结果就是可执行文件更小、启动更快、使用的内存更少。
图1-1 Quarkus 编译的优化过程图
Quarkus 还提供了很好的开发者体验。其统一了响应式和命令式编程方式,以便可以在同一个应用程序中混合常规 JAX-RS 和面向事件的代码。最后,Quarkus 与很多流行的框架兼容,比如Eclipse Vert.x、Apache Camel、Undertow……