Object Computing, Inc.(OCI)は、フルスタック JVM ベースのフレームワーク「Micronaut 2.0」を正式にリリースした。これは、Java、Groovy、Kotlin などの言語を利用したマイクロサービスベースのクラウドネイティブでサーバレスなアプリケーションを作成できる。
この新しいリリースでは、Micronaut Launch、完全に刷新され高速化された Micronaut CLI、新しい Maven プラグイン、Gradle バージョンへのアップグレードなど、開発者の経験を大幅にアップグレードする。これは、Java 14、Groovy 3 で書かれたアプリケーション、RxJava 3 や Reactor などのリアクティブフレームワークをサポートする。Azure Functions と Google Cloud Functions のサポートを追加したことで、サーバレス機能が拡充された。また、HTTP/2とサーブレットのサポートとセキュリティ設計の見直しも提供している。最後に、新しいリリースでは、GraalVMとのより深い統合によるパフォーマンスの向上、メモリ消費の最適化、フレームワーク全体の平均で最大 20% の起動時間の改善を実現している。
「Micronaut 2.0 は、Micronautにとってもう一つの大きな前進だ。 私たちはランタイムオプションを導入することで、Micronautのリーチを拡大してきました。これにはサーブレットのサポートと、さらに優れたGraalVMネイティブイメージのサポートが含まれています。 サーバレスへの継続的な投資は、ユーザーの需要に支えられています。これが Micronaut のもう一つの重要な特徴です」
— Jeff Scott Brown 氏は、Micronaut 財団の共同創設者でありディレクター、GrailsとObject Computing 社で Micronaut プラクティスリードを務めている。
それでは、新作の見どころを見ていこう。
Micronaut 2.0 には、Micronaut をベースにしたアプリケーションの足場を整えるための新しいスターターサービス、Micronaut Launch が含まれている。ブラウザベースのツールとしても、REST API としても利用可能な Launch は、Micronaut ベースのアプリケーションを迅速に構築し、生成するのに役立つ。また、生成されたアプリケーションのプレビューを提供する。従来の Micronaut CLI は、GraalVM ネイティブイメージを使用してパフォーマンスと効率性に重点を置いて完全に再設計された。Micronaut Launch は、Micronaut CLI のラッパーであり、相互運用性を保証する。
Maven のサポートがアップグレードされ、現在の Gradle の機能セットと同等の機能を持つようになった。新しい Maven プラグインが提供される(mn:run)。これは、自動再コンパイルと再起動機能によって Maven 経由で Micronaut アプリケーションを実行するのに役立つ。これに加えて、Maven プロジェクトは新しい親 POM を継承する。これは依存関係管理をよりクリーンに設定するためだ。
Gradle のバージョンが 6.5 にアップグレードされ、Micronaut 2.0 プロジェクトのコンパイルをサポートするようになった。これは本質的に、Micronaut がビルドごとに完全なアノテーションプロセッサを実行する必要がないことを意味する。
AWS Lambda の機能セットを改善しつつ、Google Cloud Functions と Azure Functions を追加したことで、サーバレス対応がより強固なものになった。Micronaut は、サーバレスアプリケーションの構築を支援する 2 つのアプローチを提供している。最初のアプローチでは、従来の Micronaut アプリケーションを定義し、それに対応するサーバレス機能を追加する(例:Cloud functions、Azure Functions、Lambda)。選択したサーバレスプラットフォームに応じて、Micronaut は、ファンクションの要求をアプリケーションにルーティングするために必要な配管となるインフラストラクチャを提供する。
2 つ目のアプローチは、「サーバレスファンクション」アプリケーションタイプを定義する。 これにより、開発者は選択したサーバレスファンクション機能に特化した低レベルのファンクションのコードを直接書ける。 (例: pub-sub メッセージを購読する Google Cloud のバックグラウンドファンクション)。
Google Cloud functions serverless platform 用に Micronaut で書かれた低レベルのサーバレスファンクションの例を以下に示す。
public class Function extends GoogleFunctionInitializer
implements BackgroundFunction<PubSubMessage> {
@Inject LoggingService loggingService;
@Override
public void accept(PubSubMessage message, Context context) {
loggingService.logMessage(message);
}
}
class PubSubMessage {
String data;
Map<String, String> attributes;
String messageId;
String publishTime;
}
他の機能としては、新しいバージョンでは、サーバレスプラットフォームが提供しMicronaut が依存関係として含む SDK を利用してローカルで機能をテストする機能が追加された。 また、AWS SDK 2 のための GraalVM ネイティブイメージのサポートを提供している。
Nettyに加えて、Micronaut 2.0 では、組み込みサーブレットランタイムのサポート(Jetty/Tomcat/Undertow)が追加された。これにより、開発者は従来のサーブレットベースの機能を Micronaut アプリケーションで使用できる。サーブレットベースの Micronaut アプリケーションの開発経験は、Netty を使って自動再コンパイル/高速化テストなどを含めた開発経験と同じだ。これには、サーブレットベースのuber jar 用の GraalVM ベースのネイティブイメージを作成する機能も含まれている。
CLI を使ってサーブレットベースの Micronaut アプリケーションを作成し、それを実行する例を以下に示す。これは jetty-server の機能を利用している。
mn> create-app demo-servlet --features jetty-server
$ cd demo-servlet
$ ./gradlew run
org.eclipse.jetty.server.Server - Started @1219ms
io.micronaut.runtime.Micronaut - Startup completed in 615ms.Server Running: http://localhost:8080/
Micronaut 2.0はHTTP/2のサポートを追加し、Micronautアプリケーションのapplication.ymlファイルの簡単な変更で有効にできる。現在のところ、このサポートは Netty ベースの HTTP サーバとクライアントのみとなる。
サーバ側の構成は以下のようになる。
micronaut:
ssl:
build-self-signed: true
application:
name: http2Demo
server:
http-version: http_2_0
GraalVM ネイティブイメージのサポートは、実験的なステータスから移行された。これにより、フレームワーク全体でのサポートが非常に良くなり、GraalVM へのコミットメントがさらに強固なものとなった。これは静的リソースの自動設定、JDBCドライバ、Hibernate、Flyway、AWS SDK 2などが含まれる。