Helidon Getting Started
この記事について
この記事ではProject Helidonの簡単な紹介と動かすところまでをまとめます。
Project Helidonとは
Helidonはゆるキャラの名前ではありません。軽量なJavaのオープンソース・マイクロサービス・フレームワークです。
Java EEを使用してマイクロサービスを構築することもできますが、マイクロサービス構築のためにはフレームワークを一から設計したほうがよい、という考えから始まったプロジェクトです。マイクロサービスを作成するために開発者が必要とする基盤(構成、セキュリティ、Webサーバ)を提供してくれます。
Helidon SEとHelidon MPという 2つのバージョンから構成されます。
- Helidon SE :モダンなリアクティブ・スタイルで開発されたシンプルで関数型、軽量なMicroframeworks(シンプルで小さな機能セット)
- Helidon MP: Java EE/Jakarta EE開発者向けなEclipse Microprofile(やや重い)
他のJava向けのマイクロサービスフレームワークには以下があります。
もっとHelidonについて詳しく知りたい方はLogico様のブログをご覧ください。
Helidon前提条件
HelidonにはJava 8(以上)とMavenが必要です。 今回はKubernetes上にコンテナをデプロイすることを想定してUbuntuにDockerとkubectlも配備しています。
バージョンの確認
java --version mvn --version docker --version kubectl version --short
JAVA_HOMEの設定
$ export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
Helidon SEを試してみる
イントロダクションに沿って、Helidon SEでRESTサービスを作成してみます。 https://helidon.io/docs/latest/#/getting-started/02_base-example
Projectの作成
以下のMavenコマンドを実行しJava projectを作成します。
$ mvn archetype:generate -DinteractiveMode=false \ -DarchetypeGroupId=io.helidon.archetypes \ -DarchetypeArtifactId=helidon-quickstart-se \ -DarchetypeVersion=0.10.5 \ -DgroupId=io.helidon.examples \ -DartifactId=quickstart-se \ -Dpackage=io.helidon.examples.quickstart.se
出力ログ
[INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building Maven Stub Project (No POM) 1 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> maven-archetype-plugin:3.0.1:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:3.0.1:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] --- maven-archetype-plugin:3.0.1:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Batch mode [INFO] Archetype repository not defined. Using the one from [io.helidon.archetypes:helidon-quickstart-se:0.10.5] found in catalog remote [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Archetype: helidon-quickstart-se:0.10.5 [INFO] ---------------------------------------------------------------------------- --- 略 ---- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 11.632 s [INFO] Finished at: 2018-12-16T01:15:39+00:00 [INFO] Final Memory: 15M/61M [INFO] ------------------------------------------------------------------------
完了です。 quickstart-se ディレクトリ以下に生成されたファイルを確認します。
:~/quickstart-se$ tree . ├── pom.xml ├── README.md └── src ├── main │ ├── docker │ │ └── Dockerfile │ ├── java │ │ └── io │ │ └── helidon │ │ └── examples │ │ └── quickstart │ │ └── se │ │ ├── GreetService.java │ │ ├── Main.java │ │ └── package-info.java │ ├── k8s │ │ └── app.yaml │ └── resources │ ├── application.yaml │ └── logging.properties └── test └── java └── io └── helidon └── examples └── quickstart └── se └── MainTest.java 18 directories, 10 files
なんと、DockerfileとKubernetesのマニフェストファイル(yaml)が同時に生成されています。 これはコンテナ界隈のお兄さんたちも大喜びですね。
Dockerfile
FROM openjdk:8-jre-alpine RUN mkdir /app COPY libs /app/libs COPY ${project.artifactId}.jar /app CMD ["java", "-jar", "/app/${project.artifactId}.jar"]
app.yml
kind: Service apiVersion: v1 metadata: name: ${project.artifactId} labels: app: ${project.artifactId} spec: type: NodePort selector: app: ${project.artifactId} ports: - port: 8080 targetPort: 8080 name: http --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: ${project.artifactId} spec: replicas: 1 template: metadata: labels: app: ${project.artifactId} version: v1 spec: containers: - name: ${project.artifactId} image: ${project.artifactId} imagePullPolicy: IfNotPresent ports: - containerPort: 8080 ---
パッケージを生成
以下のMavenコマンドでパッケージを生成します。
$ mvn package
出力ログ
[INFO] Scanning for projects... [INFO] [INFO] -----------------< io.helidon.examples:quickstart-se >------------------ [INFO] Building quickstart-se 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ quickstart-se --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] ---略--- [INFO] [INFO] --- maven-jar-plugin:2.5:jar (default-jar) @ quickstart-se --- [INFO] Building jar: /home/vagrant/quickstart-se/target/quickstart-se.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 17.838 s [INFO] Finished at: 2018-12-16T02:42:31Z [INFO] ------------------------------------------------------------------------
targetディレクトリにquickstart-se.jar
が生成されたことを確認します。
$ ls target/quickstart-se.jar target/quickstart-se.jar
アプリケーションを実行
$ java -jar target/quickstart-se.jar
出力ログ
[DEBUG] (main) Using Console logging 2018.12.16 02:48:36 INFO io.netty.util.internal.PlatformDependent Thread[main,5,main]: Your platform does not provide complete low-level API for accessing direct buffers reliably. Unless explicitly requested, heap buffer will always be preferred to avoid potential system instability. 2018.12.16 02:48:36 INFO io.helidon.webserver.netty.NettyWebServer Thread[nioEventLoopGroup-2-1,10,main]: Channel '@default' started: [id: 0x029b3dce, L:/0:0:0:0:0:0:0:0:8080] WEB server is up! http://localhost:8080
これで完了です!ブラウザやcurlでアクセスしてみます。
$curl -X GET http://localhost:8080/greet {"message":"Hello World!"} $curl -X GET http://localhost:8080/greet/Joe {"message":"Hello Joe!"} $curl -X PUT http://localhost:8080/greet/greeting/Hola {"greeting":"Hola"} $curl -X GET http://localhost:8080/greet/Jose {"message":"Hola Jose!"}
とても簡単にRESTサービスが作成できました。
今回はここまでにして、次回は生成されたDockerfile、yamlを使ってKubernetes上で起動してみたいと思います。
ご覧いただきありがとうございました。
ちなみに、Helidonはギリシア語でつばめ(swallow)を意味するのだそうです。 Wikipediaによると、細長い、合理化されたボディーと長い尖った羽根があり、素晴らしい操縦性と非常に効率的な飛行が可能な鳥だそうです。 雲(Cloud)の中を飛び回るのに最適ですね。
この記事はOracle Cloud その2 Advent Calendar 2018 - Adventar16日目です。