Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Java EEでMicroserviceを実現するKumuluzEE #javaee #Qiita

トピック「アドベントカレンダー」について

この記事はJava EE Advent Calendar 2015 - Qiitaの1日目のエントリーです。
明日は@empressiaさんです。

今年のAdvent Calendar、ネタがないなぁ…と思っていた所、以下ツイートを拝見しました。

きっと寺田さんご自身はJava EEとMicrosoft Azureに関連するネタを書かれるだろうと(勝手に)思って、このKumuluzEEをネタとして利用させて頂きますm(_ _)m

KumuluzEEとは?

KumuluzEEはJava EEでマイクロサービスを実現するためのフレームワークです。

読み方は…なんですかね(^^;;

KumuluzEE
f:id:kikutaro777:20151130190207j:plain

毎年JavaOneで発表されるDuke's Choice Awardという名誉ある賞(KumuluzEEのサイトではJavaのオスカー賞的な表現してますね)を今年受賞したプロダクトで、Java ChampionのMatjaz Bさんが中心に進めているものです。

KumuluzEEとはなにか?をすごくざっくり言えば…

アプリケーションサーバによって一枚岩に提供されるJava EEの仕様群をバラして、自分が利用したい仕様のみを依存させることができるフレームワーク

といった感じでしょうか。つまり、使いたい仕様だけを取り込んだモジュールを作り、それ自身をマイクロサービスにできるものです。
以下のページにある図で、わかりやすくイメージが書かれています。

ee.kumuluz.com

思想的にはSpring BootやWildFly Swarmなどと同じなのかなと。既に似たようなプロダクトがある中、Duke's Choice Awardに選ばれた1つの理由として挙げられていたのは、コミュニティベースに作られたフレームワークという点でした。Java EEのアプリケーションサーバを提供しているベンダではない、という。確かに、WildFly SwarmならRedHatさん、Payara MicroならPayaraさんといった所が力を入れています。

KumuluzEEの使い方に関する詳細はあとで書きますが、例えば簡単にJAX-RSのコードを書いて

@Path("/rest")
public class RestResource {
    @GET
    @Produces(value = MediaType.APPLICATION_JSON)
    public Response getResources() {

        Map<String, String> json = new HashMap<>();
        json.put("nogizaka46", "mai shiraishi");

        return Response.ok(json).build();
    }
}

ビルドして、以下コマンドで実行します。KumuluzEEではフレームワーク側でMain関数を持ってるので、自分でMain含んだクラス定義も不要になっています。

java -cp target\classes;target\dependency\* com.kumuluz.ee.EeApplication

実行するとjettyが起動して

2015-12-01 16:26:59.197:INFO:oejs.Server:main: Started @1335ms
12 01, 2015 4:26:59 午後 com.kumuluz.ee.jetty.JettyServletServer startServer
情報: Jetty started
12 01, 2015 4:26:59 午後 com.kumuluz.ee.EeApplication initialize
情報: KumuluzEE started successfully

URLにアクセスすると

f:id:kikutaro777:20151201162842j:plain

こんな感じに非常にお手軽です。ここではJAX-RSを例にしましたが、以下

  • Servlet 3.1 (Jetty)
  • JSP 2.3 (RI JSP)
  • EL 3.0 (RI UEL)
  • CDI 1.2 (RI Weld)
  • JPA 2.1 (RI EclipseLink, Hibernate)
  • JAX-RS 2.0 (RI Jersey, RESTEasy)
  • JAX-WS 2.2 (RI Metro)
  • JSF 2.2 (RI Mojarra)
  • Bean Validation 1.1 (RI Hibernate validator)
  • JSON-P 1.0 (RI JSONP)

に対応しているとのことです。なお、コードなどは以下に。

github.com

Microservice

今年、勉強会やカンファレンスなどへ行くたびに「Microservice」という単語を耳にしていた気がします。

(Java系での)狭義な言い方では、java -jar XxxxService.jarみたいに起動できるもの、という説明から、SOAなど歴史的な背景を含めたアーキテクチャ論まで、幅広く話があったかと。

自分がMicroserviceという単語を聞いたのは多分、昨年Spring Bootを知った辺りです。Spring Bootに関してはこんな感想も。

自分はJava EEを選びながらも、やっぱりあちこちで評判なSpring Bootはホント気になります(^^;;;

  • Spring Boot

Spring Bootに興味ある方は以下書籍からですかね!

Java EEにおけるMircoserviceのプロダクトとしては

  • WildFly Swarm

WildFly Swarm · WildFly

  • Payara Micro

Introducing Payara Micro

などが出てきています。あとTomEE Shadesなんてのがあるん…ですかね?ちょっと調べられませんでしたが。

KumuluzEEの設定

私はNetBeansで試したので、一応メモ書き程度に手順を書いておきます。

ここでは、冒頭に例で示したJAX-RSを動かすコードを作る手順を示しますが、ServletやJPAでは依存性の定義を変えるくらいで、手順はほぼ同じだと思います。

「ファイル」->「新規プロジェクト」を選択

f:id:kikutaro777:20151201183801j:plain

カテゴリ「Maven」で「Javaアプリケーション」を選択

f:id:kikutaro777:20151201183901j:plain

プロジェクト名などは適当に

f:id:kikutaro777:20151201183915j:plain

pom.xmlにタグを追加

依存性で定義するライブラリのバージョンが一式合っていないと駄目らしいので、プロパティに以下追加が推奨されてます。

f:id:kikutaro777:20151201184103j:plain

<kumuluzee.version>1.0.0</kumuluzee.version>
pom.xmlに依存性を定義

JAX-RSを動かすため、依存性は以下を追加します。

<dependencies>
    <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-core</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
    <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-servlet-jetty</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
    <dependency>
        <groupId>com.kumuluz.ee</groupId>
        <artifactId>kumuluzee-jax-rs</artifactId>
        <version>${kumuluzee.version}</version>
    </dependency>
</dependencies>

また、コマンドから実行するとき用に、以下pluginを追加します。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
JAX-RSのコードを追加

デフォルトで作成されたパッケージに以下コードを追加します。

RestResource.java

package advent.kumuluzsample;

import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/rest")
public class RestResource {
    @GET
    @Produces(value = MediaType.APPLICATION_JSON)
    public Response getResources() {

        Map<String, String> json = new HashMap<>();
        json.put("nogizaka46", "mai shiraishi");

        return Response.ok(json).build();
    }
}

RestApplication.java

package advent.kumuluzsample;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/")
public class RestApplication extends Application {
}

f:id:kikutaro777:20151201185809j:plain

プロジェクトファイルとしてはこれで準備は終わりなのですが、resources/webappフォルダを用意しないと実行時に以下エラーがでてしまうので作ります。

Exception in thread "main" java.lang.IllegalStateException: No 'webapp' director
y found in the projects resources folder. Please add it to your resources even i
f it will be empty so that the servlet server can bind to it. If you have added
it and still see this error please make sure you have at least one file/class in
your projects as some IDEs don't build the project if its empty
at com.kumuluz.ee.EeApplication.checkRequirements(EeApplication.java:75)

at com.kumuluz.ee.EeApplication.initialize(EeApplication.java:48)
at com.kumuluz.ee.EeApplication.(EeApplication.java:27)
at com.kumuluz.ee.EeApplication.main(EeApplication.java:39)

空のフォルダだけでも、とあるのですが、自分の手元では何かファイルがないとコピーしてくれなかったので、とりあえず適当にhtmlだけ置いてました。
f:id:kikutaro777:20151201185816j:plain

で、あとはコマンドで実行できます。

java -cp target\classes;target\dependency\* com.kumuluz.ee.EeApplication

NetBeansで普通に実行すると…Mainクラスがないと

f:id:kikutaro777:20151201190347j:plain

実際には依存性に入っているkumuluzee-core-1.0.0.jarのEeApplicationクラスがMainメソッドをもっています。
NetBeansでこれをキックってできないんだろうか…

f:id:kikutaro777:20151201190423j:plain

ということで、1日目は以上です。明日は@empressiaさんよろしくおねがいします!

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村