Micronaut Frameworkの紹介

Micronaut Frameworkの紹介

1. マイクロノートとは

Micronautは、軽量のモジュラーアプリケーションを構築するためのJVMベースのフレームワークです。 Grailsを作成したのと同じ会社であるOCI、Micronaut is the latest framework designed to make creating microservices quick and easyによって開発されました。

Micronautには、Springのような既存のフレームワークに類似した機能がいくつか含まれていますが、それを際立たせるいくつかの新しい機能もあります。 また、Java、Groovy、Kotlinのサポートにより、さまざまな方法でアプリケーションを作成できます。

2. 主な特徴

Micronautの最もエキサイティングな機能の1つは、コンパイル時の依存性注入メカニズムです。 ほとんどのフレームワークは、リフレクションとプロキシを使用して、実行時に依存性注入を実行します。 Micronaut, however, builds its dependency injection data at compile time.その結果、アプリケーションの起動が速くなり、メモリフットプリントが小さくなります。

Another feature is its first class support for reactive programming, for both clients and servers. RxJavaとProject Reactorの両方がサポートされているため、特定のリアクティブ実装の選択は開発者に任されています。

Micronautには、クラウドネイティブアプリケーションを開発するための優れたフレームワークとなるいくつかの機能もあります。 It supports multiple service discovery tools such as Eureka and Consul, and also works with different distributed tracing systems such as Zipkin and Jaeger.

また、AWSラムダ関数の作成をサポートするため、サーバーレスアプリケーションを簡単に作成できます。

3. 入門

開始する最も簡単な方法は、SDKMANを使用することです。

> sdk install micronaut 1.0.0.RC2

これにより、Micronautアプリケーションの構築、テスト、およびデプロイに必要なすべてのバイナリファイルがインストールされます。 また、新しいプロジェクトを簡単に開始できるMicronaut CLIツールも提供します。

バイナリアーティファクトは、SonatypeおよびGitHubでも使用できます。

次のセクションでは、フレームワークのいくつかの機能について説明します。

4. 依存性注入

前述のように、Micronautはコンパイル時に依存性注入を処理しますが、これはほとんどのIoCコンテナとは異なります。

ただし、それでもfully supports JSR-330 annotationsであるため、Beanの操作は他のIoCフレームワークと同様です。

Beanをコードに自動配線するには、@Inject:を使用します

@Inject
private EmployeeService service;

@Injectアノテーションは、@Autowiredと同じように機能し、フィールド、メソッド、コンストラクター、およびパラメーターで使用できます。

デフォルトでは、すべてのBeanはプロトタイプとしてスコープされます。 @Singleton. を使用してシングルトンBeanをすばやく作成できます。複数のクラスが同じBeanインターフェースを実装している場合、@Primaryを使用してそれらの競合を解消できます。

@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を使用してこれらのエンドポイントを実装します。 ただし、we can quickly implement non-blocking endpoints by merely changing the return type to any reactive non-blocking type

たとえば、RxJavaではObservableを使用できます。 同様に、Reactorを使用する場合、MonoまたはFluxデータ型を返すことができます。

@Get("/{name}")
public Mono greet(String name) {
    return Mono.just(greetingService.getGreeting() + name);
}

ブロッキングエンドポイントと非ブロッキングエンドポイントの両方で、NettyはHTTPリクエストの処理に使用される基礎となるサーバーです。

通常、要求は起動時に作成されるメインI / Oスレッドプールで処理され、ブロックされます。

ただし、コントローラーエンドポイントから非ブロックデータ型が返されると、MicronautはNettyイベントループスレッドを使用して、要求全体を非ブロックにします。

6. HTTPクライアントの構築

次に、作成したエンドポイントを使用するクライアントを作成しましょう。 Micronautは、HTTPクライアントを作成する2つの方法を提供します。

  • 宣言的なHTTPクライアント

  • プログラムによるHTTPクライアント

6.1 Declarative HTTP Client

最初の最も簡単な作成方法は、宣言的アプローチを使用することです。

@Client("/greet")
public interface GreetingClient {
    @Get("/{name}")
    String greet(String name);
}

we don’t implement any code to call our serviceに注目してください。 代わりに、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 req = HttpRequest.GET("/greet/" + name);
      return httpClient.retrieve(req).blockingFirst();
   }

   public Single greetAsync(String name) {
      HttpRequest req = HttpRequest.GET("/async/greet/" + name);
      return httpClient.retrieve(req).first("An error as occurred");
   }
}

デフォルトのHTTPクライアントはRxJavaを使用しているため、ブロック呼び出しまたは非ブロック呼び出しを簡単に処理できます。

7. マイクロノートCLI

Micronaut CLIツールを使用してサンプルプロジェクトを作成したとき、上記の動作をすでに確認しました。

このケースでは、スタンドアロンアプリケーションを作成しましたが、他にもいくつかの機能があります。

7.1. フェデレーションプロジェクト

In Micronaut, a federation is just a group of standalone applications that live under the same directory.フェデレーションを使用することで、それらを簡単にまとめて管理し、同じデフォルトと設定を確実に取得できます。

CLIツールを使用してフェデレーションを生成する場合、create-appコマンドと同じ引数をすべて取ります。 最上位のプロジェクト構造を作成し、そこからサブディレクトリに各スタンドアロンアプリを作成します。

7.2. 特徴

When creating a standalone application or federation, we can decide which features our app needs。 これにより、最小限の依存関係セットがプロジェクトに含まれるようになります。

-features argumentを使用して機能を指定し、機能名のコンマ区切りリストを指定します。

次のコマンドを実行すると、使用可能な機能のリストを見つけることができます。

> 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. 既存のプロジェクト

We can also use the CLI tool to modify existing projects. 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サーバーと非ブロッキングHTTPサーバーおよびクライアントの両方を簡単に構築できることを確認しました。 また、CLIのいくつかの機能を調査しました。

しかし、これは提供する機能のほんの一部です。 サーバーレス機能、サービス検出、分散トレース、監視とメトリック、分散構成なども完全にサポートされています。

また、その機能の多くはGrailsやSpringなどの既存のフレームワークから派生したものですが、独自の機能を際立たせる独自の機能も数多く備えています。

いつものように、上記のサンプルコードはGitHub repoにあります。