QuarkusIOのガイド

  • link:/category/cloud/ [クラウド]

  • DevOps

1. 前書き

今日では、インフラストラクチャについて心配せずに、アプリケーションを作成してクラウドにデプロイすることが非常に一般的です。 サーバーレスとFaaSは非常に人気があります。
インスタンスの作成と破棄が頻繁に行われるこのタイプの環境では、起動時間と最初のリクエスト時間は非常に重要です。まったく異なるユーザーエクスペリエンスを作成できるからです。
このタイプのシナリオでは、JavaScriptおよびPythonとしての言語が常に注目されています。 言い換えれば、太いJARと長い起動時間を備えたJavaは決して最有力候補ではありませんでした。
このチュートリアルでは、* Quarkusを紹介し、Javaをクラウドにより効率的に導入するための代替手段であるかどうかについて説明します*。

2. QuarkusIO

https://quarkus.io [QuarkusIO]、超音速亜原子Java、*小さなアーティファクト、非常に高速な起動時間、およびより短い時間での最初のリクエストを提供することを約束します。https://www.baeldungと組み合わせた場合。 com / graal-java-jit-compiler [GraalVM]、Quarkusは事前にコンパイル(AOT)します。
*そして、Quarkusは標準に基づいて構築されているため、新しいことを学ぶ必要はありません。*その結果、とりわけCDIとJAX-RSを使用できます。 また、Hibernate、Kafka、OpenShift、Kubernetes、およびVert.xをサポートするものを含むhttps://quarkus.io/extensions/[Quarkusには多くの拡張機能があります]。

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プロジェクト、およびDockerfilesが生成されます。
IDEにインポートすると、次の画像に示すような構造になります。
画像:https://www.baeldung.com/uploads/quarkus-project-100x113.png%20100w [image]
_HelloResource_クラスの内容を調べてみましょう。
@Path("/hello")
public class HelloResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}
これまでのところすべてがよさそうです。 この時点で、単一のRESTEasy JAX-RSエンドポイントを持つ単純なアプリケーションができました。 ターミナルを開いてコマンドを実行して、テストを実行しましょう。
./mvnw compile quarkus:dev:
画像:https://www.baeldung.com/uploads/mvn_compile_quarkus_dev-100x44.png%20100w [image]
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 —を含む実行可能jar
    _target / lib_にコピーされた依存関係

  • quarkus-project-1.0-SNAPSHOT.jar —クラスとリソースが含まれています
    ファイル

    これで、パッケージ化されたアプリケーションを実行できます。
java -jar target/quarkus-project-1.0-SNAPSHOT-runner.jar

5. ネイティブ画像

次に、アプリケーションのネイティブイメージを作成します。 ネイティブイメージは、起動時間と最初の応答までの時間を改善します。 つまり、アプリケーションの実行に必要な最小限のJVMなど、実行に必要なすべてのものが含まれています。
まず、https://www.graalvm.org [GraalVM]をインストールし、GRAALVM_HOME環境変数を構成する必要があります。
アプリケーションを停止し(Ctrl C)、まだ停止していない場合は、コマンドを実行します。
./mvnw package -Pnative
これが完了するまでに数秒かかる場合があります。 ネイティブイメージはすべてのコードAOTを作成してブートを高速化しようとするため、結果としてビルド時間が長くなります。
_./mvnw verify -Pnative_を実行して、ネイティブアーティファクトが適切に構築されたことを確認できます。
画像:https://www.baeldung.com/uploads/native-verify-100x63.png%20100w [image]
次に、*ネイティブの実行可能ファイルを使用して*コンテナイメージを作成します*。 そのためには、コンテナランタイム(つまり、 link:/docker-test-containers[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
image:https://www.baeldung.com/uploads/docker-native-100x7.png%20100w [image]コンテナは0.009秒という非常に低い時間で起動しました。 それがQuarkusの強みの1つです。
最後に、変更したRESTをテストして、アプリケーションを検証する必要があります。
$ curl localhost:8080/hello/polite/Baeldung
Good morning Baeldung

6. OpenShiftへのデプロイ

Dockerを使用してローカルでテストが完了したら、コンテナーをlink:/spring-boot-deploy-openshift[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
最後に、同じエンドポイントにアクセスします(URLはIPアドレスによって異なる場合があることに注意してください)。
$ curl http://quarkus-project-myproject.192.168.64.2.nip.io/hello/polite/Baeldung
Good morning Baeldung

7. 結論

この記事では、QuarkusがJavaをより効果的にクラウドにもたらすことができる優れた追加機能であることを示しました。 たとえば、AWS LambdaでJavaを想像することが可能になりました。 また、Quarkusは、JPAやJAX / RSなどの標準に基づいています。 したがって、新しいことを学ぶ必要はありません。
Quarkusは最近多くの注目を集めており、毎日多くの新機能が追加されています。 https://github.com/quarkusio/quarkus-quickstarts[Quarkus GitHubリポジトリ]でQuarkusを試すためのクイックスタートプロジェクトがいくつかあります。
いつものように、この記事のコードはlink://github.com/eugenp/tutorials/tree/master/quarkus [GitHubで]から入手できます。 ハッピーコーディング!