Oracleは先頃、マイクロサービスベースのアプリケーション開発用にデザインされたJavaライブラリのコレクションであるProject Helidonを新たに公開して、Payara MicroやThorntail(改名前はWildFly Swarm)、OpenLiberty、TomEEなどのMicroProfileファミリに参加した。
かつてJ4C(Java for Cloud)という名称であったHelidonは、シンプルで高速に動作するように設計されており、 Helidon SEとHelidon MPという 2つのバージョンから構成される。 Helidon SEは、マイクロサービスを作成するための3つのコアAPIとして、マイクロサービスベースのアプリケーション構築に必要なWebサーバ、コンフィギュレーション、セキュリティを備え、アプリケーションサーバを必要としない。一方のHelidon MPは、マイクロサービスベースのアプリケーション構築においてMicroProfile 1.1仕様をサポートする。
Webサーバ
NodeJSなどのJavaフレームワークにヒントを得たHelidonのWebサーバは、 Netty上で動作する、非同期かつリアクティブなAPIである。WebServer
インターフェースでは、コンフィギュレーション、ルーティング、エラー処理、およびメトリクスと稼働状態を公開するエンドポイントがサポートされている。
以下のコード例は、簡単なHelidon Webサーバを起動して使用可能なポートをランダムに選び、“It works!”というテキストを表示する、というものだ。
// starts the server on a random available port
public void startWebServerUsingRandomPort() throws Exception {
WebServer webServer = WebServer
.create(Routing.builder()
.any((req,res) -> res.send("It works!" + "\n"))
.build())
.start()
.toCompletableFuture()
.get(10,TimeUnit.SECONDS);
System.out.println("Server started at: http://localhost:" + webServer.port() + "\n");
webServer.shutdown().toCompletableFuture();
}
コンフィギュレーション
コンフィギュレーションコンポーネントのConfig
は、構成プロパティをキー/値形式でロードおよび処理する。デフォルトでは、構成プロパティはapplication.properties
、または/src/main/resources
ディレクトリに置かれたファイルapplication.yaml
に定義され、そこから読み込まれる。
以下のコード例は、先程の例にConfig
を使用して、Webサーバを起動するポートの指定にapplications.yaml
ファイルを読み込む方法について示している。
// application.yaml
server:
port: 8080
host: 0.0.0.0
// starts the server on a port defined in application.yaml
public void startWebServerUsingDefinedPort() throws Exception {
Config config = Config.create();
ServerConfiguration serverConfig = ServerConfiguration.fromConfig(config.get("server"));
WebServer webServer = WebServer
.create(serverConfig,Routing.builder()
.any((req,res) -> res.send("It works!" + "\n"))
.build())
.start()
.toCompletableFuture()
.get(10,TimeUnit.SECONDS);
System.out.println("Server started at: http://localhost:" + webServer.port() + "\n");
webServer.shutdown().toCompletableFuture();
}
セキュリティ
Security
クラスは認証、承認、監査のサポートを提供する。Heldonアプリケーション用に多数のセキュリティプロバイダが実装されており、ビルダ経由で、コンフィギュレーションを使用して、およびそのハイブリッドで、という3つの方法で組み込むことができる。
以下のコード例は、Security
インスタンスを構築し、Config
を使用してユーザ認証を(暗号化されたパスワードによって)取得し、サーバの時刻を表示する方法を示すものだ。
// application.yaml
http-basic-auth:
users:
login: "mpredli"
password: "${CLEAR=somePassword}"
roles: ["user","admin"]
Config config = Config.create();
Security security = Security.builder()
.config(config)
.addProvider(...)
.build();
String user = config.get("http-basic-auth.users.login").asString();
String password = config.get("http-basic-auth.users.password").asString();
System.out.println("\n");
System.out.println("INFO: user = " + user);
System.out.println("INFO: password = " + password);
SecurityTime time = SecurityTime.builder().build();
time = security.getServerTime();
System.out.println("INFO: server time = " + time.toString());
System.out.println("\n");
より包括的なセキュリティの実装例がGitHubで公開されている。
Helidonのアーキテクチャ
Helidon SEとHelidon MPの関係をアーキテクチャ図で示す。
次のチャートでは、Helidon SEとHelidon MPが、マイクロサービスフレームワークのどのようなカテゴリに適しているのかを示している。
始めるには
Helidonにはクイックスタート用のサンプルが用意されており、Helidon SEとHelidon MPの違いが示されている。
以下のMavenコマンドとJavaコマンドは、HelidonのWebサーバを使用してRESTサービスを作成するHelidon SE用のサンプルを生成し、パッケージするためのものだ。
$ mvn archetype:generate -DinteractiveMode=false \
-DarchetypeGroupId=io.helidon.archetypes \
-DarchetypeArtifactId=helidon-quickstart-se \
-DarchetypeVersion=0.10.1 \
-DgroupId=io.helidon.examples \
-DartifactId=quickstart-se \
-Dpackage=io.helidon.examples.quickstart.se
$ cd quickstart-se
$ mvn package
$ java -jar target/quickstart-se.jar
次のMavenコマンドとJavaコマンドでは、MicroProfileのJAX-RS APIを使ったRESTサービスを生成するHelidon MPのサンプルを生成し、パッケージする。
$ mvn archetype:generate -DinteractiveMode=false \
-DarchetypeGroupId=io.helidon.archetypes \
-DarchetypeArtifactId=helidon-quickstart-mp \
-DarchetypeVersion=0.10.1 \
-DgroupId=io.helidon.examples \
-DartifactId=quickstart-mp \
-Dpackage=io.helidon.examples.quickstart.mp
$ cd quickstart-mp
$ mvn package
$ java -jar target/quickstart-mp.jar
サーバが起動すれば、以下のコマンドを実行することができる。
Helidonプロジェクト全体はGitHubに公開されている。
Oracleの上級ソフトウェア開発マネージャであるDmitry Kornilov氏が、この新しいプロジェクトについて話してくれた。
InfoQ: Oracleが今回、新たにマイクロサービスフレームワークを開発した理由は何だったのでしょう?
Dmitry Kornilov: Helidonの開発が始まったのは少し前のことです。クラウドサービスを開発する方法としてのマイクロサービスアーキテクチャが広く普及したことで、開発者のエクスペリエンスも変わる必要がありました。Java EEは安定したテクノロジですが、古いコードがたくさんあります。マイクロサービスをJava EE上に構築するのではなく、マイクロサービスを開発するためにスクラッチから設計された新たなフレームワークが必要だと思ったのです。Helidonはこのような理由から生まれました。
InfoQ: OpenLibertyやThrotail、Payara Micro、TomEEといった他のMicroProfile実装に対して、Helidonのユニークな点は何ですか?
Kornilov: Helidonは単なるMicroProfileの実装ではありません。Helidon SEとHelidon MPという、2つのフレーバーがあります。
Helidon SEはHelidonのコアの部分です。それぞれが独立して使用可能な軽量ライブラリのセットなのですが、一緒に使用することで、コンフィギュレーション、セキュリティ、Webサーバという、開発者がマイクロサービスを作成するために必要な基盤を提供しています。開発者好みの、より現代的でリアクティブなアプローチを実現します。私たちはクリアであることに努めています - インジェクション’マジック’は使用していないので、Helidon SEアプリケーションはデバッグが容易になっています。特別なjar形式や、専用のクラスローダもありません。開発されるのは、純粋なJava SEアプリケーションになります。これは同時に、すべてのIDEで専用のプラグインを必要とせずに開発できるということでもあります。
Helidon MPは我々のMicroProfile実装で、Helidon SE上に構築されています。アプリケーションサーバから派生したものではないので、デプロイメントモデルやJava EEパッケージといった、必要のない余分なものはありません。
InfoQ: 最新バージョンではなく、MicroProfie 1.1仕様を実装したのはなぜですか?
Kornilov: Helidonの開発が始まったのが少し前だったので、当時最新であったMicroProfileバージョンを採用することにしたのです。Helidonの改善は継続的に行なっていますので、新しいMicroProfileバージョンも近々サポートします。
InfoQ: Helidonの今後の開発計画について、特にJakarta EEとMicroProfile仕様の最新版のサポートに関して教えてください。
Kornilov: 先程話したように、MicroProfileの最新バージョンのサポートについては開発中です。新しいJakarta EE仕様が明らかになれば、その開発に参加して、Helidonでサポートしようと思っています。Oracle Cloudとの統合機能のHelidonへの追加やHTTPクライアントのサポート、プロジェクトスタータWebアプリの計画もありますし、サンプルやドキュメントも絶えず改善しています。
リソース
- Helidon Takes Flight - Dmitry Kornilov (2018/9/7)
- Oracle Releases New Java Microservices Framework - John Waters (2018/9/10)
- Microservices From Dev to Deploy, Part 1: Getting Started with Helidon - Todd Sharp (2018/10/3)
この記事を評価
- 編集者評
- 編集長アクション