Quarkus for Spring Developers
Quarkus 1.0 的发布,为开发 Linux 容器和 Kubernetes 原生 Java 微服务带来了创新的平台。开发人员在评估新的创新运行时框架时,通常需要放下他们现有的知识。Quarkus 与众不同,因为它是由一群在广泛 Java 技术领域拥有深厚专业知识的工程师创建的。这包括 Spring API 兼容性,由为 Red Hat Runtimes 提供 Spring Boot 支持的工程师带到 Quarkus。
![]() 一本免费的 140 页书籍《Quarkus for Spring Developers》现已发布,该书更详细、更全面地讨论了这一主题。 |
我是 Spring 开发人员。为什么选择 Quarkus?
现在越来越明显的是,容器化(特别是 Kubernetes)正在迫使我们重新评估 Java 在云原生应用程序开发中的作用。Kubernetes 是一个高度动态的共享基础设施,随着集群托管的应用程序数量的增长,以及对应用程序生命周期变化的响应速度(如重新部署和扩展/缩减)的提高,它变得更具成本效益。传统的 Java 云原生运行时在现有堆栈上添加了新功能,而没有真正重新思考底层堆栈本身。这会导致内存消耗更大、启动时间更慢,以至于组织现在愿意放弃他们深厚的 Java 专业知识,转而培训和重新学习 Go 和 Node.js,以便从其在 Kubernetes 集群上的大量投资中获得更多价值。

这正是 Quarkus 所要解决的问题。Quarkus 针对内存密度和快速启动时间进行了优化。与其他的云原生 Java 堆栈相比,在 JVM 上运行的 Quarkus 应用程序可以提供近乎两倍的应用程序实例,而消耗的 RAM 相同;当打包为原生二进制文件时,可以提供多达 7 倍的实例。这不仅仅是使用 SubstrateVM(GraalVM 的一个特性)编译为原生二进制文件。Quarkus 已经针对 Kubernetes 不可变基础设施优化了传统上“高度动态”的框架,从而减少了内存利用率和初始化时间。这些经过优化且文档齐全的框架称为“扩展”,由一流的标准 API 组成。结果是运行时效率显著提高。

Spring 开发人员可以带来哪些现有知识来使用 Quarkus?
Quarkus 的 Spring API 兼容性包括 Spring DI、Spring Web 和 Spring Data JPA。其他 Spring API 正在计划中,如 Spring Security 和 Spring Config。在 JVM 上运行时,Quarkus 应用程序几乎可以使用任何 Java 库。许多库,只要它们不使用 Java 反射,都可以编译为原生。例如,Lombok 是 Spring 开发人员中流行的库,它与原生编译兼容。需要明确的是,Quarkus 中的 Spring API 兼容性并不是为了提供一个完整的 Spring 平台来重新托管现有的 Spring 应用程序。其目的是提供足够的 Spring API 兼容性,以使使用 Quarkus 开发新应用程序成为一种自然而然的上手体验。结合预优化的扩展,Quarkus 为微服务开发提供了惊人的功能。尽管如此,开发人员已经成功地将 Spring 应用程序迁移到了 Quarkus :-)
Spring 框架本质上是高度动态的。为了解决这个问题,Quarkus Spring 兼容性扩展将 Spring API 映射到现有扩展中的 API,这些扩展已经过优化,可实现快速启动、降低内存利用率和原生编译,如 RestEasy 和 CDI。此外,Quarkus Spring 兼容性扩展不使用 Spring 应用程序上下文。因此,尝试使用其他 Spring 库很可能无效。 |
Quarkus Spring Web 示例
import java.util.List;
import java.util.Optional;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/person")
public class PersonController {
@GetMapping(path = "/greet/{id}", produces = "text/plain")
public String greetPerson(@PathVariable(name = "id") long id) {
String name="";
// ...
return name;
}
@GetMapping(produces = "application/json")
public Iterable<Person> findAll() {
return personRepository.findAll();
}
Quarkus Spring Repository 示例
package org.acme.springmp;
import java.util.List;
import org.springframework.data.repository.CrudRepository;
public interface PersonRepository extends CrudRepository<Person, Long> {
List<Person> findByAge(int age);
}
Quarkus Spring Service + MicroProfile Fault Tolerance 示例
import org.eclipse.microprofile.faulttolerance.Fallback;
import org.eclipse.microprofile.faulttolerance.Timeout;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service // Spring
public class PersonService {
@Autowired // Spring
@RestClient // MicroProfile
SalutationMicroProfileRestClient salutationRestClient;
@Value("${fallbackSalutation}") // Spring
String fallbackSalutation;
@CircuitBreaker(delay=5000, failureRatio=.5) // MicroProfile
@Fallback(fallbackMethod = "salutationFallback")// MicroProfile
public String getSalutation() {
return salutationRestClient.getSalutation();
}
对 Spring 开发人员还有其他好处吗?
除了改进的内存利用率和启动时间之外,Quarkus 还为 Spring 开发人员提供了以下好处:
-
函数即服务 (FaaS) 运行时。 编译为原生二进制文件时,Quarkus 应用程序可以在 0.0015 秒内启动,从而可以使用现有的 Spring 和 Java API 知识来开发 FaaS 函数。(Azure、AWS Lambda)
-
实时编码。 从一个“Hello World”示例应用程序开始,将其转化为复杂的微服务,而无需重新启动应用程序。只需保存并重新加载浏览器即可查看过程中发生的变化。Quarkus 实时编码“开箱即用”,无论使用何种 IDE。
-
支持响应式和命令式模型。 Quarkus 具有响应式核心,支持传统的命令式模型、响应式模型,或在同一应用程序中同时支持两者。
-
提前检测依赖注入错误。 Quarkus 在编译时捕获依赖注入错误,而不是在运行时。
-
一起使用一流的框架和标准。 Quarkus 在同一应用程序中支持 Spring API 兼容性、Eclipse Vert.x、MicroProfile(JAX-RS、CDI 等)、响应式流和消息传递等。请阅读《“@Autowire MicroProfile into Spring Boot”》了解如何在同一项目中使用 Spring 和 MicroProfile API。
Spring 开发人员应该如何开始使用 Quarkus?
建议的步骤包括:
-
遵循《入门指南》作为 Quarkus 的一般介绍。
-
遵循《Spring DI》、《Spring Web》和《Spring Data JPA》指南。
-
使用 code.quarkus.io 创建新应用。
-
可以选择观看 Devoxx 的演示文稿《Kubernetes Native Spring Apps on Quarkus》。