1. 序章

現在、アプリケーションを作成してクラウドにデプロイすることは非常に一般的であり、インフラストラクチャについて心配する必要はありません。 サーバーレスとFaaSは非常に人気があります。

インスタンスが頻繁に作成および破棄されるこのタイプの環境では、完全に異なるユーザーエクスペリエンスを作成できるため、起動時間と最初の要求までの時間が非常に重要です。

このタイプのシナリオでは、JavaScriptやPythonなどの言語が常に脚光を浴びています。 言い換えれば、JARが太く、起動時間が長いJavaは、決してトップ候補ではありませんでした。

このチュートリアルでは、 Quarkusを紹介し、Javaをより効果的にクラウドに導入するための代替手段であるかどうかについて説明します。

2. QuarkusIO

QuarkusIO 、超音速亜原子ジャワ、 小さなアーティファクト、非常に高速な起動時間、および最初の要求までの時間の短縮を実現します。 と組み合わせると GraalVM 、Quarkusは事前コンパイル(AOT)します。

また、Quarkusは標準に基づいて構築されているため、新しいことを学ぶ必要はありません。したがって、CDIやJAX-RSなどを使用できます。 また、 Quarkusには、Hibernate、Kafka、OpenShift、Kubernetes、Vert.xをサポートする拡張機能が多数あります。

3. 私たちの最初のアプリケーション

新しいQuarkusプロジェクトを作成する最も簡単な方法は、ターミナルを開いて次のように入力することです。

mvn io.quarkus:quarkus-maven-plugin:0.13.1:create \
    -DprojectGroupId=com.baeldung.quarkus \
    -DprojectArtifactId=quarkus-project \
    -DclassName="com.baeldung.quarkus.HelloResource" \
    -Dpath="/hello"

これにより、プロジェクトスケルトン、 / helloエンドポイントが公開されたHelloResource、構成、Mavenプロジェクト、およびDockerfileが生成されます。

IDEにインポートすると、次の画像に示すような構造になります。

HelloResourceクラスの内容を調べてみましょう。

@Path("/hello")
public class HelloResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}

これまでのところすべてが良さそうです。 この時点で、単一のRESTEasyJAX-RSエンドポイントを持つ単純なアプリケーションができました。 ターミナルを開いてコマンドを実行して、テストを進めましょう。

./mvnw compile quarkus:dev:

RESTエンドポイントはlocalhost:8080/helloで公開する必要があります。 curlコマンドでテストしてみましょう。

$ curl localhost:8080/hello
hello

4. ホットリロード

開発モード( ./ mvn compile quarkus:dev )で実行している場合、Quarkusはホットリロード機能を提供します。 つまり、 Javaファイルまたは構成ファイルに加えられた変更は、ブラウザーが更新されると自動的にコンパイルされます。 ここで最も印象的な機能は、ファイルを保存する必要がないことです。 これは、私たちの好みに応じて、良いことも悪いこともあります。

次に、ホットリロード機能を示すために例を変更します。 アプリケーションが停止している場合は、開発モードで再起動するだけです。 出発点として、前と同じ例を使用します。

まず、HelloServiceクラスを作成します。

@ApplicationScoped
public class HelloService {
    public String politeHello(String name){
        return "Hello Mr/Mrs " + name;
    }
}

次に、 HelloResource クラスを変更し、 HelloService を挿入して、新しいメソッドを追加します。

@Inject
HelloService helloService;

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("/polite/{name}")
public String greeting(@PathParam("name") String name) {
    return helloService.politeHello(name);
}

次に、新しいエンドポイントをテストしましょう。

$ curl localhost:8080/hello/polite/Baeldung
Hello Mr/Mrs Baeldung

同じことがプロパティファイルに適用できることを示すために、もう1つ変更を加えます。 application.properties ファイルを編集して、もう1つのキーを追加しましょう。

greeting=Good morning

その後、 HelloService を変更して、新しいプロパティを使用します。

@ConfigProperty(name = "greeting")
private String greeting;

public String politeHello(String name){
    return greeting + " " + name;
}

同じcurlコマンドを実行すると、次のように表示されます。

Good morning Baeldung

次のコマンドを実行することで、アプリケーションを簡単にパッケージ化できます。

./mvnw package

これにより、targetディレクトリ内に2つのjarファイルが生成されます。

  • quarkus-project-1.0-SNAPSHOT-runner.jar —依存関係が target /libにコピーされた実行可能jar
  • quarkus-project-1.0-SNAPSHOT.jar —クラスとリソースファイルが含まれています

これで、パッケージ化されたアプリケーションを実行できます。

java -jar target/quarkus-project-1.0-SNAPSHOT-runner.jar

5. ネイティブイメージ

次に、アプリケーションのネイティブイメージを作成します。 ネイティブイメージは、起動時間と最初の応答までの時間を改善します。 つまり、には、アプリケーションの実行に必要な最小限のJVMを含め、実行に必要なすべてのものが含まれています。

まず、 GraalVM をインストールし、GRAALVM_HOME環境変数を構成する必要があります。

まだ停止していない場合は、アプリケーションを停止し(Ctrl + C)、次のコマンドを実行します。

./mvnw package -Pnative

これが完了するまでに数秒かかる場合があります。 ネイティブイメージはすべてのコードAOTを作成して起動を高速化しようとするため、結果としてビルド時間が長くなります。

./ mvnw verify -Pnative を実行して、ネイティブアーティファクトが適切に構築されたことを確認できます。

次に、ネイティブ実行可能ファイルを使用してコンテナイメージを作成します。 そのためには、コンテナランタイムが必要です(つまり、 Docker )が私たちのマシンで実行されています。 ターミナルウィンドウを開いて実行してみましょう。

./mvnw package -Pnative -Dnative-image.docker-build=true

これにより、Linux 64ビット実行可能ファイルが作成されるため、別のOSを使用している場合は、実行できなくなる可能性があります。 今のところ大丈夫です。

プロジェクトの生成により、Dockerfile.nativeが作成されました。

FROM registry.fedoraproject.org/fedora-minimal
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

ファイルを調べると、次に何が起こるかについてのヒントがあります。 まず、Dockerイメージを作成します

docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-project .

これで、次を使用してコンテナを実行できます。

docker run -i --rm -p 8080:8080 quarkus/quarkus-project

コンテナは0.009秒という信じられないほど短い時間で起動しました。 それがQuarkusの強みの1つです。

最後に、変更したRESTをテストして、アプリケーションを検証する必要があります。

$ curl localhost:8080/hello/polite/Baeldung
Good morning Baeldung

6. OpenShiftへのデプロイ

Dockerを使用してローカルでのテストが完了したら、コンテナーをOpenShiftにデプロイします。 レジストリにDockerイメージがあるとすると、次の手順に従ってアプリケーションをデプロイできます。

oc new-build --binary --name=quarkus-project -l app=quarkus-project
oc patch bc/quarkus-project -p '{"spec":{"strategy":{"dockerStrategy":{"dockerfilePath":"src/main/docker/Dockerfile.native"}}}}'
oc start-build quarkus-project --from-dir=. --follow
oc new-app --image-stream=quarkus-project:latest
oc expose service quarkus-project

これで、次のコマンドを実行してアプリケーションのURLを取得できます。

oc get route

最後に、同じエンドポイントにアクセスします(IPアドレスによってはURLが異なる場合があることに注意してください)。

$ curl http://quarkus-project-myproject.192.168.64.2.nip.io/hello/polite/Baeldung
Good morning Baeldung

7. 結論

この記事では、QuarkusがJavaをより効果的にクラウドにもたらすことができる優れた追加機能であることを示しました。 たとえば、AWSLambdaでJavaを想像することができます。 また、QuarkusはJPAやJAX/RSなどの標準に基づいています。 したがって、新しいことを学ぶ必要はありません。

Quarkusは最近多くの注目を集めており、毎日多くの新機能が追加されています。 QuarkusGitHubリポジトリでQuarkusを試すためのクイックスタートプロジェクトがいくつかあります。

いつものように、この記事のコードはGitHubから入手できます。 ハッピーコーディング!