BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ アーティクル Micronautフレームワークを使ったクラウドネイティブJava

Micronautフレームワークを使ったクラウドネイティブJava

キーポイント

  • The Micronaut framework provides a solid foundation for building Cloud Native Java microservices based on a compilation-time approach. 
  • Tight integration with GraalVM Native Image Ahead-of-Time Compilation (AOT) makes it easy to convert applications to native executables, which has massive benefits, particularly for serverless and microservice workloads. 
  • Reducing the use of Java reflection, runtime proxy generation, and dynamic classloading has resulted in performance, memory & startup improvements and makes it easier to debug and test Micronaut applications. 
  • Active compilation-time checking increases type safety and improves developer productivity by surfacing errors at build time rather than runtime. 
  • A large ecosystem of modules and integrations, such as Micronaut Data for database access, has helped provide further innovations within the Micronaut framework.

原文(投稿日:2022/05/03)へのリンク

この記事は、記事シリーズ「Native Compilations Boosts Java」の一部です。サブスクライブすると、RSSを介して、このシリーズの新しい記事に関する通知を受け取ることができます。

Javaはエンタープライズアプリケーションの多くを占めています。しかし、クラウドでは、Javaは一部の競合に比べてコストが割高です。GraalVMを使ったネイティブコンパイルにより、クラウドにおけるJavaが安価になります。起動がはるかに速く、メモリの使用量が少ないアプリケーションを作ることができます。

そのため、ネイティブコンパイルによって、すべてのJavaユーザが多くの疑問を持つことになります。ネイティブJavaは開発をどのように変えるか。いつネイティブJavaに切り替えるべきか。いつすべきではないか。そして、ネイティブJavaにはどのフレームワークを使うべきか。このシリーズでは、これらの質問に答えます。

サーバサイドJavaの認識が変わる

2017年、Javaサーバサイドを取り巻く認識に関して問題がありました。マイクロサービスへの移行と、多くの場合コンテナ化されたランタイムの軽量化に伴い、開発者は、従来のJavaアプリケーションが相対的に肥大化していることに気づき始めていました。このJavaアプリケーションは、パッケージ化され、サーブレットコンテナ上の共有Java仮想マシン(JVM)にデプロイされます。サーバレスの出現により、この認識はさらに加速しました。

オブジェクトコンピューティングのチームがJavaフレームワークをゼロから設計する方法を再考し始めたのは、この時期でした。その結果がMicronautフレームワークです。このJavaフレームワークでは、まったく異なるアプローチを採用しています。Javaアノテーションを使って、フレームワークがどのように接続されるかの計算をコンパイルフェーズにシフトしているのです。これにより、従来のJavaフレームワークに存在した、リフレクション、ランタイム生成プロキシ、複雑な動的クラスローディングが完全に排除できるようになります。

2018年4月のMicronautフレームワークの最初の公開リリースは、Java領域での考え方に大きな変化をもたらしました。Javaの速度が遅く肥大化しているという認識を変えました。多くの新たな取り組みで、同様のアプローチが採用されています。アプリケーションの起動を最適化し、リフレクションを排除するために、より多くのロジックをアプリケーションのビルド・コンパイルフェーズに移動するのです。

ビルド時アプローチの利点は明らかです。コンパイル中により多くの計算を行うことにより、フレームワークはその時点で最適な方法で実行できるように準備されます。また、リフレクション、動的なクラスローディング、プロキシの実行時生成を排除することで、実行フェーズにおけるさらなる最適化の機会が得られます。この最適化は、JITと、非常に重要な点として、GraalVMのNative Imageツールの両方に対して得られます。このアプローチのおかげで、Native Imageでは、Micronautフレームワークアプリケーションのクローズドワールド静的分析を実行するために追加で設定することはありません。

MicronautフレームワークとGraalVMの間のこの相乗効果を生み出すため、Micronautフレームワークの共同創設者であるGraeme Rocher氏がOracle Labsに加わりました。Oracle LabsはGraalVMを所有しているだけではありません。オブジェクトコンピューティングに加えて、Micronautフレームワークの進行中の開発に大きく貢献しています。

Micronautフレームワークとは何か

Micronautフレームワークに関するよくある誤解は、それがマイクロサービス専用に設計されているというものです。実際には、Micronautフレームワークは、さまざまなアプリケーションのタイプに対応する極めてモジュール化されたアーキテクチャを備えています。

そのベースとして、MicronautフレームワークはJSR-330依存性注入仕様を実装しています。このフレームワークでは、追加の組み込み機能がいくつか提供されています。そのため、これは汎用フレームワークとして最適な選択肢であり、アノテーションベースのプログラミングモデルをベースとしています。

Micronautは、Netty I/Oツールキット上に構築されたHTTPサーバHTTPクライアントを備えています。

ユーザは、サーバレスアプリケーションコマンドラインアプリケーションさらにはJavaFXアプリケーションを構築するために、Micronautフレームワークを採用しています。

Micronautフレームワークの強固なコア基盤では、Micronautがさまざまな問題を解決できるようにするモジュールの広範なエコシステムの基盤が提供されています。この柔軟性が、Micronautフレームワークが開発者の間で、人気が急激に伸びている理由です。次のアーキテクチャ図では、フレームワークがどのように構成されているかを示しています。

基本層はJavaアノテーション処理(APT)をベースとしています。コンパイル時の依存性注入が実装されており、NettyベースのHTTPサーバを含むさまざまなモジュールの構築をサポートします。ただし、データアクセス、セキュリティ、JSONシリアル化などの他の領域もカバーしています。

なぜMicronautフレームワークを使うべきか

Micronautフレームワークの目標は、従来のJavaフレームワークの動的な部分を完全に排除することにより、それに代わる軽量の代替手段を提供することです。動的の部分とは、Javaリフレクション、動的クラスローディング、プロキシとバイトコードの実行時生成などの機能です。

従来のフレームワークのこれらの側面を排除することは、パフォーマンス、メモリ消費、セキュリティ、堅牢性、デバッグの容易さ、テストの改善に大きな影響を及ぼします。また、他のソリューションと異なり、MicronautフレームワークアプリケーションはJVMでもすばやく起動します。

起動時間の改善により、多くの場合、統合テストと単体テストでコードを分ける必要が全くなくなり、コードからテストまでのサイクル時間が大幅に改善されます。過去にあまりにも頻繁に、アプリケーションの起動が遅かったために、統合テストのコード記述が少なくなりました。Micronautフレームワークはこの懸念を排除しており、そのため、HTTPレイヤー用の広範なモック機能は含まれていません。多くのフレームワークでは、アプリケーションを起動するためのコストを回避するためにモックを使います。

リフレクションの排除により、従来のフレームワークでは非常に大きくなる可能性のあるスタックトレースのサイズを小さくして、デバッグできるようになります。

Micronautフレームワークでは、自身のコードをビルド時アプローチに移行するためのメカニズムとAPIも提供されます。そのため、Javaコンパイラと直接統合することで、Micronautフレームワークでは、アノテーションが誤って使われた場合にコンパイルエラーが生成できます。これによって、コードの型安全性と全体的な開発者エクスペリエンスが向上します。

Micronautフレームワークを始める

このセクションでは、Micronautフレームワークを使ってCloud Native Javaマイクロサービスを構築する方法について説明します。

Micronautフレームワークを使うには、いくつかの方法があります。少なくとも、Java SE 8以降用のJDKが必要です。ネイティブイメージ機能を使うには、GraalVM JDK for Java 11かそれ以降のバージョンが必要です。

Micronautアプリケーションを作成するために、お気に入りのIDEに統合されているウィザードの1つを使用できます。たとえば、IntelliJ IDEA UltimateGraalVM Tools for Micronaut Extension for VSCodeなどです。

また、Micronaut Launchを使って、Web経由で新しいMicronautアプリケーションを簡単に作成できます。これは、ビルドしたいアプリケーションの種類と含める機能を選択できるプロジェクト作成ウィザードです。次に、ダウンロードできるアプリケーションを含むZIPファイルを生成するか、選んだGithubリポジトリにコードをプッシュします。

コマンドラインに慣れている場合は、SDKMAN!、Homebrewなどの一般的な方法でMicronaut CLIをインストールして、アプリケーションを作成することもできます。インストールされると、新しいアプリケーションの作成は次のように簡単になります。

mn create-app demo –build gradle

ただし、追加のCLIアプリケーションのインストールに乗り気でない場合でも、問題ありません。 Micronaut Launch APIは、curlを介して直接使用できます。

curl https://start.micronaut.io/demo.zip\?build\=gradle -o demo.zip && unzip demo.zip && cd demo

上記のコマンドにより、Gradleビルドツールを使ってアプリケーションが作成されます。「gradle」という単語を「maven」に置き換えることで、代わりにMavenを使えます。

プロジェクト構造に関しては、Micronautフレームワークプロジェクトは他のJavaプロジェクトと同じように構造化されます。

  • GradleあるいはMavenビルド(ただし、いずれのビルドツール(Bazelなど)でも設定できます)
  • 設定は、デフォルトで src/main/resources/application.ymlを介して提供される。ただし、YAMLファンでない場合は、代わりにJavaプロパティ、JSON、HOCON、TOMLを使ってもよい。
  • デフォルトのロギングはsrc/main/resources/logback.xmlを介したSLF4J + Logbackの組み合わせに基づいている。SLF4Jアダプターを他のロギング・システムと入れ替えられる。
  • テストはJUnit5にベースとしている。しかし、代替手段としてSpockやKotest for Kotlinなどの他のテストフレームワークもサポートする。

新しく作成されたプロジェクトには、作業を進めるために役立つJavaソースが含まれています。1つ目は、src/main/java内にあるApplication.javaクラスで、Micronautアプリケーションのメインエントリポイントが含まれています。

package demo;
 
import io.micronaut.runtime.Micronaut;
 
public class Application {
 
   public static void main(String[] args) {
       Micronaut.run(Application.class, args);
   }
}

Micronaut.run(..)(..)を呼び出すと、フレームワークの起動シーケンスがトリガーされます。

2つ目に生成されたクラスはsrc/test/javaディレクトリにあり、アプリケーションがエラーなしで正常に起動できることがテストされます。

package demo;
 
import io.micronaut.runtime.EmbeddedApplication;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Assertions;
 
import jakarta.inject.Inject;
 
@MicronautTest
class DemoTest {
 
   @Inject
   EmbeddedApplication<?> application;
 
   @Test
   void testItWorks() {
       Assertions.assertTrue(application.isRunning());
   }
}

このJUnit5テストには、@MicronautTestというアノテーションが付けられます。これは、JUnit 5の拡張機能です。これにより、JUnit 5テストでは任意のコンポーネントをテスト自体に挿入できるようになります。この場合、実行中のアプリケーションをモデル化するのはEmbeddedApplicationタイプです。

Micronaut開発用のIDEのセットアップ

一般的に言えば、Javaアノテーション処理(APT)をベースとするMicronautフレームワークの利点の1つは、フレームワークを機能させるために特別なビルドツールがまったく必要ないということです。一般的なIDEはすべてアノテーション処理をサポートしていますが、Eclipseなど、一部では、アノテーション処理を明示的に有効にする必要があります。

そうは言っても、Micronautフレームワークの人気の高まりにより、IDEベンダーはフレームワークの個別のサポートを提供しています。 JetBrainのIntelliJ Ultimateでは、Micronautフレームワークのユーザ向けの素晴らしいツールが提供されている。例えば、プロジェクトウィザード、構成用のコード補完、Micronaut Dataサポートなどです。

さらに、Visual Studio Codeに、無料のGraalVM Extension Packによるすばらしいサポートがあります。これはNetBeans IDEをベースとしています。これには、Micronautプロジェクト作成ウィザード、設定のためのコード補完、Micronautアプリケーション用の統合されたネイティブイメージ機能が含まれています。

これらのオプションのいずれかをインストールしたら、IDEでGradleかMavenプロジェクトを開くだけですべてがセットアップされ、準備が整います。

REST APIの作成

Micronautフレームワークでは、幅広いサーバ側の処理をサポートします。例えば、REST、gRPC、GraphQL、そして、Kafka、RabbitMQ、JMS、MQTTなどのメッセージングテクノロジーを持ったメッセージ駆動型マイクロサービスがあります。この導入部では、デフォルトのNettyベースのHTTPサーバを使ったRESTアプリケーションの構築に焦点を当てます。

Micronautアプリケーションにおける各HTTPのルートは、@Controllerアノテーションが付けられたJavaクラスによって定義されます。アノテーションの名前は、Model View Controller MVCパターンに由来します。@Controllerのアノテーションが付けられた型では、特定のHTTP動詞とURIにマップするメソッドを1つ以上指定できます。

標準的な「Hello World」の例は、Micronautコントローラーを使って次のように実装できます。

package demo;
 
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
 
@Controller("/hello")
public class HelloController {
 
   @Get(uri="/{name}", produces=MediaType.TEXT_PLAIN)
   String hello(String name) {
       return "Hello " + name;
   }
}

このコントローラはURI /helloにマップされます。@Getのアノテーションが付けられた1つのメソッドではHTTP GETを処理し、RFC 5741 URIテンプレートを使ってメソッドのnameパラメーターをバインドします。IDEからApplicationクラスのmainメソッドを実行するか、./gradlew runまたは./mvnw mn:runを使って、サーバを起動します。これで、Micronaut HTTPサーバが使うデフォルトの8080ポートにcurlリクエストを送信して、エンドポイントを手動でテストできます。

curl -i http://localhost:8080/hello/John
HTTP/1.1 200 OK
date: Mon, 28 Mar 2022 13:08:54 GMT
Content-Type: text/plain
content-length: 10
connection: keep-alive

Hello John

Micronautフレームワークはテストに重点を置いている。それでも、テストよりもAPIを試すのに良い方法はあるでしょうか。以下は、上記のHelloControllerの例に対するシンプルなJUnit 5テストです。

package demo;
 
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
 
import io.micronaut.http.client.HttpClient;
import io.micronaut.http.client.annotation.Client;
import io.micronaut.test.extensions.junit5.annotation.MicronautTest;
 
@MicronautTest
public class HelloControllerTest {
 
   @Test
   void testHello(@Client("/") HttpClient client) {
       var message = client
       .toBlocking()
       .retrieve("/hello/John");
       assertEquals("Hello John", message);
   }
}

上記のテストは、MicronautのHTTPクライアントを挿入し、GETリクエストを/hello/John URIに送信して、結果が正しいことを確認(assert)します。

Micronautフレームワークの大きな利点の1つは、上記のようなテストを実行することが非常に高速で、通常の単体テストに匹敵することです。@MicronautTestアノテーションがMicronautサーバを起動し、テストが完全なHTTP要求/応答サイクルを実行する場合でも、テストの実行速度は低下しません。HTTPサーバ用の広範なモックAPIを学ぶ必要はありません!そのため、開発者は、長期的な保守性とコード品質に大きなメリットをもたらす統合テストをさらに多く作成することができるようになります。

データベースへのアクセス

データベースへのアクセスはサーバ側アプリケーションでは非常に一般的な動作です。多くのフレームワークでアクセスを簡素化し、この領域における開発者の生産性を向上させている。Micronautフレームワークも例外ではありません。

Micronaut Dataは、ひねりを加えたデータベースアクセスツールキットです。Micronautコンパイラとの統合を活用して、Micronaut Dataでは、データベースクエリのコンパイル時のチェックとビルド時の計算を加えることで、実行時の効率を向上させています。

Spring Data JPAと同様に、Micronaut Dataではリポジトリパターンを使ってJavaインターフェイスを指定できます。このパターンにより、コンパイル時にデータベースクエリを自動的に実装できます。

Micronaut Dataでは、リポジトリインターフェイスのメソッドシグネチャに対してコンパイル時の分析が実行されます。可能であればインターフェイスが実装されます。そうしないと、コンパイルエラーが発生します。

Micronaut Dataは、いくつかのデータベースとクエリ形式をサポートします。例は次の通りです。

  • HibernateとJPA - JPAとHibernateを使用でき、Micronaut Data JPAによりコンパイル中にJPAクエリが計算されます(上記のとおり)。
  • JDBCとSQL - オブジェクトリレーショナルマッピング(ORM)よりも生のSQLと単純なデータマッパーを好む人のために、Micronaut Data JDBCは、リレーショナルデータベースとの間でJava17+レコードとPOJOを読み書きするための単純なソリューションを提供します。
  • MongoDB - 最新の追加として、Micronaut Data Mongo DBはMongoDBドライバーと直接統合され、Micronaut Serializationを使って完全にリフレクションのない方法でBSONとの間でオブジェクトをエンコードします。
  • R2DBC - Micronautフレームワークは、Nettyをべーとして、リアクティブなノンブロッキングコアを備えている。Micronaut NettyサーバをReactive Database Connectivity(R2DBC)仕様とサポートされているデータベースと組み合わせることにより、エンドツーエンドのブロックを回避するSQLアプリケーションを作成できます。
  • Oracle Coherence - 大規模な分散データグリッドのCoherenceは、Micronaut Dataとの専用の統合ができ、Coherenceクラスタ上にリポジトリを簡単に実装できます。

Micronautフレームワークのさまざまなデータベースアクセスオプションをすべて網羅するのは、それ自体で記事のシリーズとなります。幸いなことに、このテーマに関するすばらしいガイドがあります。開始のヘルプについては、「Micronaut Data JDBCを使ったデータベースへのアクセス」または「Micronaut Data Hibernate/JPAを使ったデータベースへのアクセス」を確認してください。

私の個人的なお気に入りは、JDBC用のシンプルなデータマッパーであるMicronaut Data JDBCです。これは、コンパイル時のBeanイントロスペクションに基づいており、永続化レイヤーからのリフレクションが完全に排除されます。

Micronaut Data JDBCを含めるためにGradleあるいはMavenビルドを設定します。その後、データベーステーブル、ビュー、クエリ結果にマップするJava 17レコードを作成します。これはJPAとは異なります。JPAではJavaクラスとテーブルの間で1対1のマッピングを行い、関連付けを使ってスキーマを完全にモデル化することが推奨されています。この関連付けにより、遅延読み込みなどの概念が取り入れられています。その結果、パフォーマンスの問題が発生することがよくあります(悪名高いN+1問題など)。以下は、レコード定義の例です。

package demo;
 
import io.micronaut.core.annotation.Nullable;
import io.micronaut.data.annotation.GeneratedValue;
import io.micronaut.data.annotation.Id;
import io.micronaut.data.annotation.MappedEntity;
 
@MappedEntity
public record Person(
   @Id
   @GeneratedValue
   @Nullable Long id,
   String firstName,
   String lastName,
   int age
) {}

次に、インターフェイスでリポジトリロジックを定義できます。それにより、アプリケーションの構築に必要な一般的のロジックの大部分が実装されます。例えば次の通りです。

package demo;
 
import java.util.List;
import io.micronaut.data.jdbc.annotation.JdbcRepository;
import io.micronaut.data.model.query.builder.sql.Dialect;
import io.micronaut.data.repository.CrudRepository;
 
@JdbcRepository(dialect=Dialect.H2)
public interface PersonRepository extends CrudRepository<Person, Long> {
   Person findByAgeGreaterThan(int age);
 
   List<Person> findByLastNameStartsWith(String str);
}

上記の例では、CrudRepositoryスーパーインターフェイスを通して作成、読み取り、更新、削除の操作(CRUD)の完全なセットが提供されます。また、サポートされているクエリ式を使ってカスタムクエリを定義できます。

より高度なユースケースを必要とするカスタム要件がある場合は、カスタムクエリ、条件クエリを作成するか、JDBCロジックを直接作成して結果をバインドできます。Micronaut Data JDBCは単に実行できると共に、リフレクションと実行時に生成されるプロキシを完全に排除します。JPAのように状態とセッションの同期の概念はありません。これは、アプリケーションを超軽量に保ち、GraalVM Native Imageで優れたパフォーマンスを発揮するのに役立ちます。

さらに、すべてのリポジトリインターフェイスはコンパイル時にチェックされます。これにより、存在しないプロパティをクエリしたり、サポートされていない戻り型を使ったりするリポジトリメソッドを防ぎます。そして、Javaの型の安全性を維持しながら、このようなすばらしい動的機能を実現します。

ネイティブ実行ファイルのビルド

Micronautフレームワークは、GraalVMが一般利用可能になる前に初リリースされました。それでも、これら2つの優れたテクノロジー間で自然な相乗効果が生まれました。その主な理由は、GraalVMのネイティブイメージコンポーネントがMicronautアプリケーションをネイティブ実行ファイルに簡単に変換できるためです。

GraalVM Native Imageは、Javaでのリフレクション、ランタイムプロキシ、動的クラスロードを強力にサポートしています。ただし、開発者は、いつ、どこで、これらを使うかを宣言する設定をネイティブイメージに提供する必要があります。ただし、Micronautアプリケーションではフレームワークレベルでこれらの手法を使用しないため、Micronautフレームワークで、これらの使用を宣言する必要はありません。そのため、Ahead-of-Timeコンパイル(AOT)時のクローズドワールド分析がGraalVMネイティブイメージでは、はるかに容易になります。

もちろん、リフレクションに依存するサードパーティのライブラリを使う場合は、その使用を宣言する必要があります。ただし、使っているフレームワーク内の大部分でリフレクションフリーがないことは利用する上で非常に助かる点です。

Micronaut GradleプラグインとMicronaut Mavenプラグインでは、Oracle Labsによる優れたGraalVM Native Build Tools プロジェクトを活用して、ネイティブ実行ファイルのビルドが簡素化されています。したがって、Gradleを使ってネイティブ実行ファイルを作成するのは次のように簡単です。

./gradlew nativeCompile

Mavenでは次のとおりです。

./mvnw package -Dpackaging=native-image

どちらのコマンドでも、各ツールのビルドディレクトリ内で実行するプラットフォーム向けのネイティブ実行ファイルが生成されます。

ネイティブ実行ファイルを実行すると、ネイティブにすることの1番の大きなメリットがわかります。

./demo
 __  __ _                                  _
|  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| |  | | | (__| | | (_) | | | | (_| | |_| | |_
|_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
  Micronaut (v3.4.0)

[main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 23ms. Server Running: http://localhost:8080

起動時間はわずかミリ秒(上記の例では23ミリ秒)に短縮され、メモリ消費量は大幅に減少します。このように大幅に削減することで、メモリの使用が制限されている環境や、起動時間が重要な場合(サーバレスワークロードなど)にMicronautアプリケーションをデプロイできます。

Oracle Labsで開発されたMicronaut AOTプロジェクトで、大きく改善していくための、さらなる研究が進行してことを記しておきます。ネイティブ実行ファイルをビルドする前に、バイトコードに対して追加となる静的分析ステップを実行します。そして、デッドコードパスを最適化および排除し、実行時にYAMLパーサーが必要とならないようにYAMLをJavaに変換するなどのタスクを実行します。

クラウド向けのビルド

Micronautフレームワークは、ネイティブイメージ以外にも、次のようなさまざまなパッケージ形式とデプロイターゲットをサポートしています。

  • ./gradlew assembleまたは./mvnwパッケージを備えた従来の実行可能JAR。
  • ./gradlew dockerBuild or ./mvnw package -Dpackaging=dockerを使ったDockerイメージ
  • ./gradlew dockerBuildNativeまたは./mvnw package -Dpackaging=docker-nativeによって、GraalVMネイティブイメージから生成されるネイティブ実行ファイルを含むDockerイメージ
  • Micronautアプリケーションをサーバレスプラットフォームにデプロイするために、カスタムAWS Lambdaランタイムをビルドできる。
  • Kubernetesへのデプロイを簡素化するために、Kubernetesとの幅広い統合がある。

まとめると、Micronautフレームワークでは、クラウドネイティブJavaアプリケーションを構築するための優れた選択肢となる機能セットが提供されます。その機能は、分散構成サポートから統合サービス検出、さらにAWSGoogle CloudAzureOracle Cloudなどのクラウドプロバイダー向けに一般的な抽象化の実装を提供するモジュールまであります。この抽象化により、アプリケーションがクラウドプロバイダー間で移植可能であることが保証されます。

まとめ

Micronautフレームワークは、サーバサイドJavaの処理に新たな空気を吹き込みました。そのフレームワークでは、革新的なコンパイル時のアプローチと機能セットが提供されています。最新のCloud Native Javaアプリケーションを構築するためのすばらしい候補となります。

GraalVM Native Imageとの緊密な統合、そしてOracle LabsのGraalVMチームとの協力関係により、Micronaut AOTやMicronaut Serialization(Jackson Databindの代替手段でリフレクションがない)などのプロジェクトで重要な革新が継続的に生まれるを意味します。

活気に満ちたコミュニティがMicronautフレームワークの周りに出現してきています。そこで、開発者の生産性を向上させる多数のモジュールが実現されています。例えば、Micronaut Dataがあり、主な機能として、データベーステクノロジとの統合があります。

コミュニティからのフィードバックは、フレームワークの開発を推進し続けています。したがって、フィードバックがある場合は、Micronautコミュニティを介して新機能や改善点のアイデアを共有することを躊躇しないでください。

 

この記事は、記事シリーズ「Native Compilations Boosts Java」の一部です。サブスクライブすると、RSSを介して、このシリーズの新しい記事に関する通知を受け取ることができます。

Javaはエンタープライズアプリケーションの多くを占めています。しかし、クラウドでは、Javaは一部の競合に比べてコストが割高です。GraalVMを使ったネイティブコンパイルにより、クラウドにおけるJavaが安価になります。起動がはるかに速く、メモリの使用量が少ないアプリケーションを作ることができます。

そのため、ネイティブコンパイルによって、すべてのJavaユーザが多くの疑問を持つことになります。ネイティブJavaは開発をどのように変えるか。いつネイティブJavaに切り替えるべきか。いつすべきではないか。そして、ネイティブJavaにはどのフレームワークを使うべきか。このシリーズでは、これらの質問に答えます。

作者について

この記事に星をつける

おすすめ度
スタイル

BT