そこはかとなく

見て聞いて触ったことの技術メモ

Helidon Getting Started

この記事について

この記事ではProject Helidonの簡単な紹介と動かすところまでをまとめます。

Project Helidonとは

Helidonはゆるキャラの名前ではありません。軽量なJavaオープンソース・マイクロサービス・フレームワークです。

Helidon

Java EEを使用してマイクロサービスを構築することもできますが、マイクロサービス構築のためにはフレームワークを一から設計したほうがよい、という考えから始まったプロジェクトです。マイクロサービスを作成するために開発者が必要とする基盤(構成、セキュリティ、Webサーバ)を提供してくれます。

Helidon SEとHelidon MPという 2つのバージョンから構成されます。

  • Helidon SE :モダンなリアクティブ・スタイルで開発されたシンプルで関数型、軽量なMicroframeworks(シンプルで小さな機能セット)
  • Helidon MP: Java EE/Jakarta EE開発者向けなEclipse Microprofile(やや重い)

他のJava向けのマイクロサービスフレームワークには以下があります。

f:id:scoto:20181216091134p:plain

もっとHelidonについて詳しく知りたい方はLogico様のブログをご覧ください。

orablogs-jp.blogspot.com

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日目です。