MicronautFrameworkの概要
1. マイクロノートとは
Micronaut は、軽量のモジュラーアプリケーションを構築するためのJVMベースのフレームワークです。 Grailsを作成したのと同じ会社であるOCIによって開発されたMicronautは、マイクロサービスの作成を迅速かつ簡単にするために設計された最新のフレームワークです。
Micronautには、Springなどの既存のフレームワークに類似した機能がいくつか含まれていますが、それを際立たせるいくつかの新機能もあります。 また、Java、Groovy、およびKotlinをサポートしているため、アプリケーションを作成するためのさまざまな方法を提供します。
2. 主な特徴
Micronautの最もエキサイティングな機能の1つは、コンパイル時の依存性注入メカニズムです。 ほとんどのフレームワークは、リフレクションとプロキシを使用して、実行時に依存性注入を実行します。 ただし、Micronautは、コンパイル時に依存性注入データを構築します。その結果、アプリケーションの起動が速くなり、メモリフットプリントが小さくなります。
もう1つの機能は、クライアントとサーバーの両方でのリアクティブプログラミングのファーストクラスサポートです。RxJavaとProjectReactorの両方がサポートされているため、特定のリアクティブ実装の選択は開発者に任されています。
Micronautには、クラウドネイティブアプリケーションを開発するための優れたフレームワークとなるいくつかの機能もあります。 EurekaやConsulなどの複数のサービス検出ツールをサポートし、ZipkinやJaegerなどのさまざまな分散トレースシステムとも連携します。
また、AWSラムダ関数の作成もサポートしているため、サーバーレスアプリケーションを簡単に作成できます。
3. 入門
開始する最も簡単な方法は、SDKMANを使用することです。
> sdk install micronaut 1.0.0.RC2
これにより、Micronautアプリケーションの構築、テスト、および展開に必要なすべてのバイナリファイルがインストールされます。 また、新しいプロジェクトを簡単に開始できるMicronautCLIツールも提供します。
バイナリアーティファクトは、SonatypeおよびGitHubでも利用できます。
次のセクションでは、フレームワークのいくつかの機能を見ていきます。
4. 依存性注入
前述のように、Micronautはコンパイル時に依存性注入を処理します。これは、ほとんどのIoCコンテナーとは異なります。
ただし、それでもはJSR-330アノテーションを完全にサポートしているため、Beanの操作は他のIoCフレームワークと同様です。
Beanをコードに自動配線するには、 @Inject:を使用します
@Inject
private EmployeeService service;
@Inject アノテーションは、 @Autowired と同じように機能し、フィールド、メソッド、コンストラクター、およびパラメーターで使用できます。
デフォルトでは、すべてのBeanがプロトタイプとしてスコープされます。 を使用してシングルトンBeanをすばやく作成できます
@Primary
@Singleton
public class BlueCar implements Car {}
@Requires アノテーションは、Beanがオプションの場合、または特定の条件が満たされた場合にのみ自動配線を実行するために使用できます。
この点で、Spring Boot @Conditionalアノテーションのように動作します。
@Singleton
@Requires(beans = DataSource.class)
@Requires(property = "enabled")
@Requires(missingBeans = EmployeeService)
@Requires(sdk = Sdk.JAVA, value = "1.8")
public class JdbcEmployeeService implements EmployeeService {}
5. HTTPサーバーの構築
次に、単純なHTTPサーバーアプリケーションの作成を見てみましょう。 まず、SDKMANを使用してプロジェクトを作成します。
> mn create-app hello-world-server -build maven
これにより、 hello-world-serverという名前のディレクトリにMavenを使用して新しいJavaプロジェクトが作成されます。このディレクトリ内に、メインアプリケーションのソースコード、Maven POMファイル、およびその他のサポートファイルがあります。プロジェクト。
非常に単純なデフォルトのアプリケーション:
public class ServerApplication {
public static void main(String[] args) {
Micronaut.run(ServerApplication.class);
}
}
5.1. HTTPのブロック
このアプリケーションだけでは、あまり効果がありません。 2つのエンドポイントを持つコントローラーを追加しましょう。 どちらも挨拶を返しますが、一方は GET HTTP動詞を使用し、もう一方は POST:を使用します。
@Controller("/greet")
public class GreetController {
@Inject
private GreetingService greetingService;
@Get("/{name}")
public String greet(String name) {
return greetingService.getGreeting() + name;
}
@Post(value = "/{name}", consumes = MediaType.TEXT_PLAIN)
public String setGreeting(@Body String name) {
return greetingService.getGreeting() + name;
}
}
5.2. リアクティブIO
デフォルトでは、Micronautは従来のブロッキングI/Oを使用してこれらのエンドポイントを実装します。 ただし、リターンタイプをリアクティブな非ブロッキングタイプに変更するだけで、ノンブロッキングエンドポイントをすばやく実装できます。
たとえば、RxJavaでは、Observableを使用できます。 同様に、Reactorを使用する場合、MonoまたはFluxデータ型を返すことができます。
@Get("/{name}")
public Mono<String> greet(String name) {
return Mono.just(greetingService.getGreeting() + name);
}
ブロッキングエンドポイントと非ブロッキングエンドポイントの両方で、NettyはHTTPリクエストの処理に使用される基盤となるサーバーです。
通常、リクエストは起動時に作成されるメインI / Oスレッドプールで処理され、ブロックされます。
ただし、非ブロッキングデータ型がコントローラーエンドポイントから返される場合、MicronautはNettyイベントループスレッドを使用して、リクエスト全体を非ブロッキングにします。
6. HTTPクライアントの構築
次に、作成したエンドポイントを使用するクライアントを作成しましょう。 Micronautは、HTTPクライアントを作成する2つの方法を提供します。
- 宣言型HTTPクライアント
- プログラマティックHTTPクライアント
6.1. 宣言型HTTPクライアント
作成する最初の最も迅速な方法は、宣言型アプローチを使用することです。
@Client("/greet")
public interface GreetingClient {
@Get("/{name}")
String greet(String name);
}
サービスを呼び出すためのコードを実装していないことに注意してください。 代わりに、Micronautは、提供されたメソッドのシグネチャとアノテーションからサービスを呼び出す方法を理解しています。
このクライアントをテストするために、組み込みサーバーAPIを使用してサーバーの組み込みインスタンスを実行するJUnitテストを作成できます。
public class GreetingClientTest {
private EmbeddedServer server;
private GreetingClient client;
@Before
public void setup() {
server = ApplicationContext.run(EmbeddedServer.class);
client = server.getApplicationContext().getBean(GreetingClient.class);
}
@After
public void cleanup() {
server.stop();
}
@Test
public void testGreeting() {
assertEquals(client.greet("Mike"), "Hello Mike");
}
}
6.2. プログラマティックHTTPクライアント
また、動作と実装をより細かく制御する必要がある場合は、より従来型のクライアントを作成するオプションもあります。
@Singleton
public class ConcreteGreetingClient {
private RxHttpClient httpClient;
public ConcreteGreetingClient(@Client("/") RxHttpClient httpClient) {
this.httpClient = httpClient;
}
public String greet(String name) {
HttpRequest<String> req = HttpRequest.GET("/greet/" + name);
return httpClient.retrieve(req).blockingFirst();
}
public Single<String> greetAsync(String name) {
HttpRequest<String> req = HttpRequest.GET("/async/greet/" + name);
return httpClient.retrieve(req).first("An error as occurred");
}
}
デフォルトのHTTPクライアントはRxJavaを使用するため、ブロッキング呼び出しまたは非ブロッキング呼び出しを簡単に処理できます。
7. MicronautCLI
サンプルプロジェクトの作成にMicronautCLIツールを使用したときに、上記の動作をすでに確認しました。
この例では、スタンドアロンアプリケーションを作成しましたが、他にもいくつかの機能があります。
7.1. フェデレーションプロジェクト
Micronautでは、フェデレーションは同じディレクトリの下にあるスタンドアロンアプリケーションのグループです。フェデレーションを使用することで、フェデレーションを簡単に一緒に管理し、同じデフォルトと設定を確実に取得できます。
CLIツールを使用してフェデレーションを生成する場合、create-appコマンドと同じ引数をすべて取ります。 トップレベルのプロジェクト構造が作成され、各スタンドアロンアプリはそこからサブディレクトリに作成されます。
7.2. 特徴
スタンドアロンアプリケーションまたはフェデレーションを作成するときに、アプリに必要な機能を決定できます。 これにより、最小限の依存関係のセットがプロジェクトに含まれるようになります。
-features引数を使用して機能を指定し、機能名のコンマ区切りリストを提供します。
次のコマンドを実行すると、使用可能な機能のリストを見つけることができます。
> mn profile-info service
Provided Features:
--------------------
* annotation-api - Adds Java annotation API
* config-consul - Adds support for Distributed Configuration with Consul
* discovery-consul - Adds support for Service Discovery with Consul
* discovery-eureka - Adds support for Service Discovery with Eureka
* groovy - Creates a Groovy application
[...] More features available
7.3. 既存のプロジェクト
CLIツールを使用して既存のプロジェクトを変更することもできます。Bean、クライアント、コントローラーなどを作成できるようにします。 既存のプロジェクト内からmnコマンドを実行すると、新しいコマンドセットが使用可能になります。
> mn help
| Command Name Command Description
-----------------------------------------------
create-bean Creates a singleton bean
create-client Creates a client interface
create-controller Creates a controller and associated test
create-job Creates a job with scheduled method
8. 結論
このMicronautの簡単な紹介では、ブロッキングと非ブロッキングの両方のHTTPサーバーとクライアントを簡単に構築できることを確認しました。 また、CLIのいくつかの機能についても説明しました。
しかし、これはそれが提供する機能のほんの少しの味です。 サーバーレス機能、サービスディスカバリ、分散トレース、監視とメトリック、分散構成なども完全にサポートされています。
また、その機能の多くはGrailsやSpringなどの既存のフレームワークから派生していますが、それ自体を際立たせるのに役立つ独自の機能もたくさんあります。
いつものように、上記のサンプルコードはGitHubリポジトリにあります。