Quarkus for Spring Developers

Quarkus 1.0 的发布,为开发 Linux 容器和 Kubernetes 原生 Java 微服务带来了创新的平台。开发人员在评估新的创新运行时框架时,通常需要放下他们现有的知识。Quarkus 与众不同,因为它是由一群在广泛 Java 技术领域拥有深厚专业知识的工程师创建的。这包括 Spring API 兼容性,由为 Red Hat Runtimes 提供 Spring Boot 支持的工程师带到 Quarkus。

Quarkus for Spring Developers

一本免费的 140 页书籍《Quarkus for Spring Developers》现已发布,该书更详细、更全面地讨论了这一主题。

我是 Spring 开发人员。为什么选择 Quarkus?

现在越来越明显的是,容器化(特别是 Kubernetes)正在迫使我们重新评估 Java 在云原生应用程序开发中的作用。Kubernetes 是一个高度动态的共享基础设施,随着集群托管的应用程序数量的增长,以及对应用程序生命周期变化的响应速度(如重新部署和扩展/缩减)的提高,它变得更具成本效益。传统的 Java 云原生运行时在现有堆栈上添加了新功能,而没有真正重新思考底层堆栈本身。这会导致内存消耗更大、启动时间更慢,以至于组织现在愿意放弃他们深厚的 Java 专业知识,转而培训和重新学习 Go 和 Node.js,以便从其在 Kubernetes 集群上的大量投资中获得更多价值。

Traditional Java Stack

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

Quarkus Stack

Spring 开发人员可以带来哪些现有知识来使用 Quarkus?

Quarkus 的 Spring API 兼容性包括 Spring DISpring WebSpring 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 函数。(AzureAWS 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?

建议的步骤包括: