2021.50 Quarkus
2018年的一次内部会议上,红帽中间件副总裁Mark Little说,他最担心的是一种新的编程语言(如go)能给用户提供更快的运行速度及更丰富的类库来支持从Java应用的迁移,因为在云环境不断完善并进入用户的上产系统后,应用的替换和迁移代价会不断降低,使得用户更倾向于用新的更快的编程语言来开发,而这对有很多基于Java中间件产品的红帽是很不利的,所以必须要让Java更快一些来应对云的挑战。后来,便有了Quarkus。
Quarkus 围绕容器优先理念进行设计,基于GraalVM native image,把应用程序编译为本地影像时,启动速度更快,占用内存更小。Quarkus的内核围绕着CDI设计,核心是一个微型的CDI容器,支持异步编程模型如Netty和Vert.x,可直接用Kotlin开发。Quarkus框架采用了Extensions进行扩展,包含了红帽中间件大部分的产品,如Hibernate ORM、 Artemis、Resteasy、Undertow、Narayana、 Infinispan、Camel、KeyCloak 等。
Quarkus的更新速度很快,从1.4版本开始,Java 8 逐步被抛弃,这里有详细的原因:Why Dropping Java 8 · quarkusio/quarkus Wiki · GitHub
Quarkus 的 Spring API 兼容性包括 Spring DI、Spring Web 和 Spring Data JPA。在 JVM 上运行时,Quarkus 应用程序几乎可以利用任何 Java 库。只要不使用 Java 反射,这些Java库就可以编译为原生。Spring 框架本质上是高度动态的。为了解决这个问题,Quarkus的Spring 兼容性扩展将 Spring API 映射到现有扩展中的 API,这些扩展已经针对快速启动、降低内存利用率和原生编译进行了优化,例如 RestEasy 和 CDI。这里有更详细的介绍,微服务框架之争--Spring Boot和Quarkus
许多 Java 库和框架的发展方式都是在运行时执行一组增强,但这有一个缺点,运行时需要扫描类路径及获取元数据。这是一个消耗时间和内存的昂贵操作。Quarkus 通过将昂贵的操作(如字节码增强、动态类加载、代理等)转移到编译时解决了这个问题,从而使应用消耗的内存和 CPU 更少、启动速度更快,这非常适合云原生的应用场景。
其实,Spring 社区也在实践用 Graal VM 来构建 Native 应用,项目网站是https://github.com/spring-projects-experimental/spring-graal-native。目前这个项目还处于验证阶段,和 Quarkus 相比还有差距。
、