Google Cloud Functions (Serverless) with RESTEasy, Undertow, or Reactive Routes
quarkus-google-cloud-functions-http
エクステンションは、RESTEasy Reactive (Jakarta REST), Undertow (Servlet), Reactive Routes, Funqy HTTP でマイクロサービスを書き、これらのマイクロサービスをGoogle Cloud Functionsのランタイムにデプロイできるようにするものです。
Google Cloud Functionsのデプロイメント1つで、Jakarta REST、Servlet、Reactive Routes、Funqy HTTP エンドポイントをいくつでも表すことができます。
この技術は、previewと考えられています。 preview では、下位互換性やエコシステムでの存在は保証されていません。具体的な改善には設定や API の変更が必要になるかもしれませんが、 stable になるための計画は現在進行中です。フィードバックは メーリングリスト や GitHub の課題管理 で受け付けています。 とりうるステータスの完全なリストについては、 FAQの項目 を参照してください。 |
前提条件
このガイドを完成させるには、以下が必要です:
-
約15分
-
IDE
-
JDK 11+ がインストールされ、
JAVA_HOME
が適切に設定されていること -
Apache Maven 3.9.3
-
使用したい場合は、 Quarkus CLI
-
Google Cloudのアカウント 。無料アカウントが使えます。
ソリューション
このガイドでは、サンプルプロジェクトを生成し、Jakarta REST API、Servlet API、Reactive Routes、またはFunqy HTTP APIで書かれた3つのHTTPエンドポイントを作成する方法を説明します。ビルドが完了したら、プロジェクトをGoogle Cloudにデプロイすることができるようになります。
これらの手順を順にすべて実行しない場合、完成したサンプルを以下で確認できます。
Gitレポジトリをクローンするか git clone https://github.com/quarkusio/quarkus-quickstarts.git
、 アーカイブ をダウンロードします。
The solution is located in the google-cloud-functions-http-quickstart
directory.
Maven デプロイメントプロジェクトの作成
quarkus-google-cloud-functions-http
のエクステンションを持つアプリケーションを作成します。以下のMavenコマンドで作成することができます:
Windowsユーザーの場合:
-
If using cmd, (don’t use backward slash
\
and put everything on the same line) -
If using Powershell, wrap
-D
parameters in double quotes e.g."-DprojectArtifactId=google-cloud-functions-http"
エンドポイントの作成
今回のサンプルプロジェクトでは、RESTEasy Reactive(Jakarta REST)用、Undertow(Servlet)用、Reactive routes用、Funqy HTTP 用の4つのエンドポイントを作成することにします。
これらの様々なエンドポイントは、デモンストレーションのためのものです。実際のアプリケーションでは、これらの技術の中から1つを選び、それにこだわるべきです。 |
各タイプのエンドポイントが不要な場合は、対応するエクステンションを pom.xml
から削除することができます。
Quarkusは、Cloud Functionsの第1世代と第2世代をサポートしています。Cloud Functions gen 2の概要については、Google Cloud Functionsのドキュメントの このページを 参照してください。gen 2を使用するには、 --gen2 パラメータを追加する必要があります。
|
Jakarta RESTエンドポイント
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello from RESTEasy Reactive";
}
}
サーブレットエンドポイント
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name = "ServletGreeting", urlPatterns = "/servlet/hello")
public class GreetingServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setStatus(200);
resp.addHeader("Content-Type", "text/plain");
resp.getWriter().write("hello");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String name = req.getReader().readLine();
resp.setStatus(200);
resp.addHeader("Content-Type", "text/plain");
resp.getWriter().write("hello " + name);
}
}
Reactive Routesエンドポイント
import static io.quarkus.vertx.web.Route.HttpMethod.GET;
import io.quarkus.vertx.web.Route;
import io.vertx.ext.web.RoutingContext;
public class GreetingRoutes {
@Route(path = "/vertx/hello", methods = GET)
void hello(RoutingContext context) {
context.response().headers().set("Content-Type", "text/plain");
context.response().setStatusCode(200).end("hello");
}
}
ビルドとGoogle Cloudへのデプロイ
Google Cloud FunctionのデプロイにはシングルJARが必要なため、Quarkusでは強制的に uber-jar タイプのパッケージを作成しています。
|
標準の mvn clean package
コマンドを使用して、アプリケーションをパッケージ化します。前述のコマンドの結果、 target/deployment
ディレクトリ内に、プロジェクトのクラスと依存関係を含む単一の JAR ファイルが作成されます。
そして、 gcloud
を使って、機能を Google Cloud にデプロイすることができるようになります。
ここではJava 17ランタイムを使用しますが、デプロイコマンドで --runtime=java17 の代わりに --runtime=java11 を使用することで、Java 11ランタイムに切り替えることが可能です。
|
gcloud functions deploy quarkus-example-http \
--entry-point=io.quarkus.gcp.functions.http.QuarkusHttpFunction \
--runtime=java17 --trigger-http --allow-unauthenticated --source=target/deployment
このクラスはCloud FunctionsとQuarkusを統合するクラスであるため、エントリーポイントは常に |
このコマンドを初めて起動したときには、以下のようなエラーメッセージが表示されることがあります:
これは、Cloud Buildがまだ有効化されていないことを意味します。このエラーを解決するには、エラーに表示されているURLを開き指示に従った後、数分待ってからコマンドを再試行してください。 |
このコマンドは、作成したCloud Functions 関数をトリガーするための httpsTrigger.url
を出力します。
そして、エンドポイントを経由して呼び出すことができます:
-
Jakarta RESTの場合: {httpsTrigger.url}/hello
-
サーブレットの場合: {httpsTrigger.url}/servlet/hello
-
リアクティブルートの場合: {httpsTrigger.url}/vertx/hello
-
Funqyの場合: {httpsTrigger.url}/funqy
ローカルでのテスト
関数をローカルでテストする最も簡単な方法は、Cloud Function invoker JAR を使用することです。
以下のコマンドでMaven経由でダウンロードできます:
mvn dependency:copy \
-Dartifact='com.google.cloud.functions.invoker:java-function-invoker:1.3.0' \
-DoutputDirectory=.
invokerを使用する前に、mvn package
で関数をビルドする必要があります。
そして、それを使ってローカルに機能を立ち上げることができます。
java -jar java-function-invoker-1.3.0.jar \
--classpath target/deployment/google-cloud-functions-http-1.0.0-SNAPSHOT-runner.jar \
--target io.quarkus.gcp.functions.http.QuarkusHttpFunction
--classpath パラメーターには、関数クラスとQuarkus関連のすべてのクラスを含む、先の手順でパッケージ化されたJARを指定する必要があります。
|
エンドポイントは http://localhost:8080 で利用できます。
次のステップ?
Google Cloud Functions Funqy バインディング を使用すると、プロバイダに依存しない Service as a Service フレームワークである Funqy を使用することができ、HTTP 関数や Background 関数を Google Cloud にデプロイすることができます。