LoginSignup
5
6

More than 3 years have passed since last update.

Micronaut 2.x 入門

Last updated at Posted at 2020-09-01

先日、Micronaut フレームワークの採用を促進するために Micronaut 財団を設立すると発表されました🎉

これにより、どんどんMicronautが流行っていくと思われます!

最近サーバレスファンクションやコンテナサービスによるオートスケールで運用することが多くなってきたことから、コールドスタートが問題視されるJVM言語は利用が難しいのでは?という声も聞こえてきます..。

ですが、Micronautを始めとするJVM系のフレームワークがネイティブビルドに対応していくことでJVM言語が採用しやすくなりそうです。

そもそもMicronautって何?

Micronaut公式から引用

A modern, JVM-based, full-stack framework for building modular, easily testable microservice and serverless applications.

モジュール式でテストが容易なマイクロサービスやサーバーレスアプリケーションを構築するための、モダンなJVMベースのフルスタックフレームワークです。

  • Java, Groovy, Kotlinで記述可能
  • GraalVMというアプリケーションをネイティブマシンコードに変換してくれる仕組みを使い、コールドスタートであるJVM言語を数十ミリ秒で起動可能
  • デフォルトで AWS LambdaGCP Cloud Functions などのFunctions as a Service(FaaS)に対応
  • CLIにより簡単にMicronautプロジェクトの構築が可能
    • FaaSプロジェクトの作成も簡単!

Version

最近version: 2.0がリリースされました🎉
まだリリースされてから2年ほどしか立っていない新しいフレームワークです。

試してみる

環境

  • macOS Catalina 10.15.4
  • メモリ16GB

SDKMANのインストール

JVMの開発環境を作成するためのツールであるSDKMANを使ってJavaの環境を作っていきましょう。
SDKMAN公式 の Installationに沿って進めていきます。

# SDKMANを取得
$ curl -s "https://get.sdkman.io" | bash
# ターミナルに読み込ませる
$ source "$HOME/.sdkman/bin/sdkman-init.sh"
# SDKMANがインストールされていることを確認
$ sdk version
SDKMAN 5.8.2+493

続いてJDKのインストールを行なっていきます。
Micronaut Ver2.0でJava14に対応したのでせっかくなので14を入れていきましょう。

# インストールできるJDKの一覧
$ sdk list java
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 14.0.2.j9    | adpt    |            | 14.0.2.j9-adpt
               |     | 14.0.2.hs    | adpt    |            | 14.0.2.hs-adpt
               |     | 13.0.2.j9    | adpt    |            | 13.0.2.j9-adpt
               |     | 13.0.2.hs    | adpt    |            | 13.0.2.hs-adpt
               |     | 12.0.2.j9    | adpt    |            | 12.0.2.j9-adpt
               |     | 12.0.2.hs    | adpt    |            | 12.0.2.hs-adpt
               |     | 11.0.8.j9    | adpt    |            | 11.0.8.j9-adpt
               |     | 11.0.8.hs    | adpt    |            | 11.0.8.hs-adpt

# java14をインストール そのままデフォルトに設定
$ sdk install java 14.0.2.hs-adpt

# javaがインストールされていることを確認
$ java --version
openjdk 14.0.2 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 14.0.2+12)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14.0.2+12, mixed mode, sharing)

Micronautのインストール

先ほどインストールしたSDKMANを使ってインストールしていきます。

$ sdk install micronaut
Installing: micronaut 2.0.1
Done installing!
Do you want micronaut 2.0.1 to be set as default? (Y/n): Y
Setting micronaut 2.0.1 as default.

インストールできたかCLIを使って確認しましょう。

$ mn -V
Micronaut Version: 2.0.1

アプリケーションの作成

まずは作業用ディレクトリを作成し移動します。

$ mkdir introduction && cd introduction

CLIを使ってアプリケーションを作成していきましょう。
mnコマンドで対話式に進めていきます。
helpオプションで使い方が確認できます。

$ mn

mn> --help
Usage: mn [-hvVx] [COMMAND]
Micronaut CLI command line interface for generating projects and services.
Application generation commands are:

*  create-app NAME
*  create-cli-app NAME
*  create-function-app NAME
*  create-grpc-app NAME
*  create-messaging-app NAME

Options:
  -h, --help         Show this help message and exit.
  -v, --verbose      Create verbose output.
  -V, --version      Print version information and exit.
  -x, --stacktrace   Show full stack trace when exceptions occur.

Commands:
  create-app            Creates an application
  create-cli-app        Creates a CLI application
  create-function-app   Creates a Cloud Function
  create-grpc-app       Creates a gRPC application
  create-messaging-app  Creates a messaging application

今回は通常のアプリケーションを構築したいので create-appを使っていきましょう。
最近kotlinにハマっているのでkotlinを指定します。(--langを未指定の場合はJavaが選択されます)

mn> create-app introduction-app --lang=kotlin
| Application created at introduction-app

対話モードを抜けましょう

mn> exit

アプリが作成されているか確認しましょう

$ tree introduction-app/
introduction-app/
├── Dockerfile
├── README.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── micronaut-cli.yml
├── settings.gradle
└── src
    ├── main
    │   ├── kotlin
    │   │   └── introduction
    │   │       └── app
    │   │           └── Application.kt
    │   └── resources
    │       ├── application.yml
    │       └── logback.xml
    └── test
        └── kotlin
            └── introduction
                └── app
                    └── IntroductionAppTest.kt
12 directories, 14 files

作成されていますね!デフォルトでDockerfileが生成されるのが面白いですね。
作成したプロジェクトはIntelliJ IDEAなどで開きましょう。

APIを作ってみよう

今回はサンプルなので、introduction.app直下にcontrollerを配置しましょう。

src
├── main
│   ├── kotlin
│   │   └── introduction
│   │       └── app
│   │           ├── Application.kt
│   │           └── HelloController.kt
HelloController.kt
package introduction.app

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.http.annotation.PathVariable

@Controller("api/v1")
class HelloController {

    @Get("/hello")
    fun helloWorld(): String {
        return "hello world!"
    }

    @Get("/hello/{name}")
    fun helloName(@PathVariable name: String): String {
        return "hello $name!"
    }
}

そのまま実行してもいいですが、せっかくなのでビルドしてJarファイル経由で実行してみましょう。

# 作成したプロジェクトに移動
$ cd introduction-app

# ビルド
$ ./gradlew assemble

# 生成したjarファイルを実行
$ java -jar ./build/libs/introduction-app-0.1-all.jar
05:43:15.853 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 948ms. Server Running: http://localhost:8080

curlでAPIを叩こう

# helloWorld()をコール
$ curl http://localhost:8080/api/v1/hello
hello world!

# helloName()をコール
$ curl http://localhost:8080/api/v1/hello/micronaut
hello micronaut!

意図した通りに返却されました!

まとめ

簡単に導入から実行まで確認できました!
記述方法もSpring Bootに似ているためわかりやすいです。
今回生成したjarファイルを、プロジェクト作成時に作られたDockerfileを元に Amazon ECS(Amazon Elastic Container Service)で動かすことも出来ます。

次回はAWS Lambdaの上で動かし、気になる起動時間を見ていきたいと思います。

参考文献

この記事は以下の情報を参考にして執筆しました。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6