Spring開発者のためのQuarkus

この記事は、Quarkus.io のブログ記事、Quarkus for Spring Developers の翻訳記事です。

Quarkus 1.0の登場により、LinuxコンテナネイティブおよびkubernetesネイティブのJavaマイクロサービスを開発するための革新的なプラットフォームがもたらされました。開発者は通常、新しい革新的なランタイム・フレームワークを評価する際に、既存の知識を脇に置いておく必要があります。Quarkusが他と異なるのは、Java技術に広く深く専門知識を持つエンジニア達によって作成されたことです。これにはSpring APIの互換性も含まれており、Red Hat RuntimesにSpring Bootのサポートを提供したエンジニアによってQuarkusにもたらされました。

私はSpringの開発者です。なぜQuarkus?

一般にコンテナ化と特にKubernetes化が、クラウドネイティブアプリケーション開発のためにJavaの再評価を強いていることは、ますます明らかになってきています。Kubernetesは非常に動的な共有インフラストラクチャであり、クラスタがホストできるアプリケーションの数が増え、再配置やスケールアップ/スケールダウンなどのアプリケーションライフサイクルの変化に対する応答性が改善されると、コスト効率が向上します。従来のJavaクラウドネイティブのランタイムは、基礎となるスタック自体を再検討することなく、既存のスタックに新しい機能を重ねてきました。その結果、メモリ消費量が増えて起動時間が遅くなり、GoやNode.jsのためにJavaの深い専門知識を再教育や再ツール化し、Kubernetesクラスタへの多大な投資からより多くの価値を引き出すことに組織が諦めています。

https://quarkus.io/assets/images/posts/quarkus-for-spring-developers/TraditionalStack.png

これは非常に大きな問題で、Quarkusはまさにこの問題に取り組んでいます。Quarkusは、メモリ密度と高速起動時間に最適化されています。JVM上で動作するQuarkusアプリケーションは、他のクラウドネイティブJavaスタックと比較して、同じRAM容量で2倍近い数のアプリケーションインスタンスを提供することができ、ネイティブバイナリとしてパッケージ化した場合は、最大7倍のインスタンスを提供することができます。これは単にSubstrateVM(GraalVMの機能)を使ってネイティブバイナリにコンパイルする以上のものです。Quarkusは従来から「非常にダイナミックな」フレームワークをKubernetesの変更不可能なインフラストラクチャに最適化しており、メモリ使用率の低減と初期化の高速化を実現しています。これらの最適化され、十分に文書化されたフレームワークは「拡張機能(extensions)」と呼ばれ、最善の組み合わせと標準APIで構成されています。その結果、実行時の効率が大幅に向上します。

https://quarkus.io/assets/images/posts/quarkus-for-spring-developers/QuarkusStack.png

Spring開発者はどのような既存の知識をQuarkusにもたらすことができますか?

QuarkusのSpring API互換にはSpring DI、Spring Web、Spring Data JPAが含まれます。また、Spring SecurityやSpring Configのような追加のSpring APIも計画されています。JVM上で実行する場合、Quarkusアプリケーションは事実上すべてのJavaライブラリを利用できます。Javaのリフレクションを使用しない限り、多くのライブラリーはネイティブにコンパイルされます。例えば、LombokはSpring開発者に人気のあるライブラリで、ネイティブコンパイルで動作します。念のために言っておくと、QuarkusにおけるSpring APIの互換性は、既存のSpringアプリケーションを再ホストするための完全なSpringプラットフォームを意図したものではありません。その目的は、Quarkusを使って新しいアプリケーションを開発するのが自然な入門体験になるように、十分なSpring APIの互換性を提供することです。事前に最適化された拡張機能と組み合わせることで、Quarkusはマイクロサービス開発のための驚くべき数の拡張機能を提供します。以上のように、開発者はSpringアプリケーションをQuarkusに移行することに成功しています。

Spring Frameworkは事実上、非常に動的です。この問題に対処するため、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開発者に以下の利点を提供します。

Function as a Service(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など)、リアクティブストリーム、メッセージングなどをサポートします。同じプロジェクトでSpring APIとMicroProfile APIを一緒に使うには「@Autowire MicroProfileをSpring Bootへ」を読んでみてください。

Spring開発者はどのようにしてQuarkusを使い始めるべきでしょうか?

推奨される手順は次のとおりです。

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。