** 1マイクロノートとは


Micronaut

は、軽量のモジュール式アプリケーションを構築するためのJVMベースのフレームワークです。 Grailsを作成したのと同じ会社であるOCIによって開発された

Micronautは、マイクロサービスの作成を迅速かつ容易にするために設計された最新のフレームワークです

Micronautには、Springのような既存のフレームワークに似た機能がいくつか含まれていますが、それを際立たせる新機能もいくつかあります。

また、Java、Groovy、およびKotlinのサポートにより、アプリケーションを作成するためのさまざまな方法が提供されます。


2主な特徴

Micronautの最もエキサイティングな機能の1つは、コンパイル時の依存性注入メカニズムです。ほとんどのフレームワークはリフレクションとプロキシを使用して実行時に依存性注入を実行します。しかし、Micronautはコンパイル時に依存性注入データを作成します。

  • もう1つの機能は、クライアントとサーバーの両方に対するリアクティブプログラミングのファーストクラスサポートです** 特定のリアクティブ実装の選択は、RxJavaとProject Reactorの両方がサポートされるため、開発者に任されています。

Micronautには、クラウドネイティブアプリケーションを開発するための優れたフレームワークとなるいくつかの機能もあります。 EurekaやConsulなどの複数のサービス検出ツールをサポートし、ZipkinやJaegerなどのさまざまな分散トレースシステムと連携します。

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


3入門

始めるための最も簡単な方法はhttps://sdkman.io/install[SDKMAN]を使うことです:

> sdk install micronaut 1.0.0.RC2

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

バイナリアーティファクトはhttps://oss.sonatype.org/content/groups/public/io/micronaut/[Sonatype]およびhttps://github.com/micronaut-projects/micronaut-core/releases[GitHubでも入手できます。]。

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


4依存性注入

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

しかし、それはまだ

JSR-330アノテーション

を完全にサポートしているので** 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

これにより、Mavenを使用して__hello-world-serverというディレクトリに新しい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. Micronaut CLI

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

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


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のような既存のフレームワークから派生していますが、それはそれ自身が際立っているのを助けるたくさんのユニークな機能も持っています。

いつものように、上のサンプルコードはhttps://github.com/eugenp/tutorials/tree/master/micronaut[GitHubrepo]にあります。