1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

micronaut入門 with GraalVM

Posted at

JJUGで取り上げられがちだったmicronautについて簡単なチュートリアル

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

image.png

こんな感じのプロジェクトができたかと思います
Build.gradleを編集します

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を作成します

SampleController.java
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が作成されていなかった場合には作成する

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

image.png

1151msかかっていますね。SpringBootなどと比べるとこれだけでも結構早いかも

native-image吐き出し

次にnative-imageを吐き出してみます

-> % ./docker-build.sh

image.png

かなり時間かかります。(僕は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

image.png

***18ms!!!!!***比べ物にならないくらいはやくなりましたね。

実際に叩けるか試すと

-> % curl http://localhost:8080/hello
Hello!

Intellijではまりかけるポイント

GraalVMとは関係ないがMicronautアプリケーションをintellij上で動作させる上ではまりかけたポイント

main()を発火させても動かなかった。下記図のように起動オプションを設定すれば動いた

image.png
image.png

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?