JJUGで取り上げられがちだったmicronautについて簡単なチュートリアル
micronautについて
モジュール式で簡単にテスト可能なマイクロサービスおよびサーバーレスアプリケーションを構築するための、JVMベースの最新のフルスタックフレームワーク。
ホームページの和訳ですが、非常にわかりやすく説明されてますね。
SpringBootをよりマイクロサービス、サーバーレスに重きを置いた感じですかね。
AWSLambdaなんかにのせられる?らしい
事前準備
その前にSDKMANをインストールする
-> % curl -s "https://get.sdkman.io" | bash
そしてmicronautインストール
-> % sdk install micronaut
mnコマンドが使えるようになったら成功です
-> % mn -V
| Micronaut Version: 1.2.6
| JVM Version: 1.8.0_202
プロジェクト作成
micronautはGraalVMをサポートするオプションがあるので指定したうえでcreate-appする
-> % mn create-app micronaut-graal --features graal-native-image
# mn create-app プロジェクト名 --features graal-native-image
こんな感じのプロジェクトができたかと思います
Build.gradleを編集します
plugins {
id "com.github.johnrengelman.shadow" version "5.0.0"
id "application"
id "net.ltgt.apt-eclipse" version "0.21"
}
version "0.1"
group "micronaut.graal"
repositories {
mavenCentral()
maven { url "https://jcenter.bintray.com" }
}
configurations {
// for dependencies that are needed for development only
developmentOnly
}
dependencies {
annotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
annotationProcessor "io.micronaut:micronaut-graal"
annotationProcessor "io.micronaut:micronaut-inject-java"
annotationProcessor "io.micronaut:micronaut-validation"
compileOnly "com.oracle.substratevm:svm"
implementation platform("io.micronaut:micronaut-bom:$micronautVersion")
implementation "io.micronaut:micronaut-http-client"
implementation "io.micronaut:micronaut-inject"
implementation "io.micronaut:micronaut-validation"
implementation "io.micronaut:micronaut-runtime"
implementation "io.micronaut:micronaut-http-server-netty"
runtimeOnly "ch.qos.logback:logback-classic:1.2.3"
testAnnotationProcessor platform("io.micronaut:micronaut-bom:$micronautVersion")
testAnnotationProcessor "io.micronaut:micronaut-inject-java"
testImplementation platform("io.micronaut:micronaut-bom:$micronautVersion")
testImplementation "org.junit.jupiter:junit-jupiter-api"
testImplementation "io.micronaut.test:micronaut-test-junit5"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
}
test.classpath += configurations.developmentOnly
mainClassName = "micronaut.graal.Application"
// use JUnit 5 platform
test {
useJUnitPlatform()
}
shadowJar {
mergeServiceFiles()
}
run.classpath += configurations.developmentOnly
run.jvmArgs('-noverify', '-XX:TieredStopAtLevel=1', '-Dcom.sun.management.jmxremote')
tasks.withType(JavaCompile){
options.encoding = "UTF-8"
options.compilerArgs.add('-parameters')
}
次にControllerを作成します
package micronaut.graal.controller;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
@Controller("/hello")
public class SampleController {
@Get(produces = MediaType.TEXT_PLAIN)
public String get() {
return "Hello!";
}
}
native-image.propertiesが作成されていなかった場合には作成する
Args = -H:IncludeResources=logback.xml|application.yml\
-H:Name=example\
-H:Class=micronaut.graal.Application
まずは普通に起動してみる
-> % ./gradlew run
Starting a Gradle Daemon (subsequent builds will be faster)
> Task :run
17:09:12.835 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 1151ms. Server Running: http://localhost:8080
<=========----> 75% EXECUTING [19s]
> :run
1151msかかっていますね。SpringBootなどと比べるとこれだけでも結構早いかも
native-image吐き出し
次にnative-imageを吐き出してみます
-> % ./docker-build.sh
かなり時間かかります。(僕は20分以上かかりました)
続いてnative-imageを実行してみます
-> % docker run -p 8080:8080 micronaut-graal
08:15:04.502 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 18ms. Server Running: http://95681aa99ad2:8080
***18ms!!!!!***比べ物にならないくらいはやくなりましたね。
実際に叩けるか試すと
-> % curl http://localhost:8080/hello
Hello!
Intellijではまりかけるポイント
GraalVMとは関係ないがMicronautアプリケーションをintellij上で動作させる上ではまりかけたポイント
main()を発火させても動かなかった。下記図のように起動オプションを設定すれば動いた