タグ「MicroProfile」が付けられているもの

[Presentation] How to use MicroProfile and ...

I made presentation at Oracle Code Tokyo (18th May 2017) and JJUG CCC 2017 Spring (20th May 2017) about introduction to MicroProfile. The slides are following;

Microservice Architecture is recently attending in Japan. But MicroProfile is known only few Japanese developers. Thus I mainly explained the basis of MicroProfile and Microservice Architecture. In addition to show a use case that replace Japanese End-user computing (it's often unreliable) by Microservice.

In Japan, almost server-side Java developers look at Spring Framework but ignore Java EE. (I don't understand why they hesitate Java EE so much...) If as many people as notice MicroProfile, I'm glad.

MicroProfile によるアプリケーション開発

この記事は Java EE Advent Calendar 2016 および Payara Advent Calendar 2016 の 18 日目です。昨日はうらがみさん (@backpaper0) の「Jersey OAuth 2クライアントで遊ぶ」(Java EE) およびかずひらさん (@kazuhira_r) 「Payara(Hazelcast)のLite Membersについて」(Payara) です。

1. MicroProfile とは?

MicroProfile は Java EE 技術をベースとしたマイクロサービス向けのプロファイルで、MicroProfile.io によって策定されています。

MicroProfile.ioIBMLondon Java CommunityRed HatTomitribePayara および SouJava といったベンダーおよびユーザーグループで構成されており、現在のところ Java Community Process とは独立して活動しています。MicroProfile は 2016 年 9 月に最初のバージョンがリリースされており、現時点でリリースされている実装には WildFly Swarm、Payara MicroProfile、WebSphere LibertyTomEE の 4 つがあります。

Payara MicroProfile は、利用可能な API が MicroProfile に限定されることを除いて Payara Micro と同じで、Hazelcast によるクラスタリングもサポートします (Hazelcast を同梱している関係で、MicroProfile 実装でありながら JCache も利用できたりします)。細かいところでは、JAX-RS の JAXB/JSON-B に差異がみられます。Payara Micro には EclipseLink (JPA 実装) が含まれるため、既定では EclipseLink MOXy が使用されます。ただし、JAX-RS の実装である Jersey には Jackson が含まれているため、MOXy が無効化された状態では Jackson が処理を代行します。Payara MicroProfile には EclipseLink が含まれないため、はじめから Jackson が使用されます。

MicroProfile は JAX-RS、CDI および JSON-P のわずか 3 つの仕様から成り立っています。このうち JAX-RS と JSON-P はサービス間の通信を主な目的としており、サービス本体を記述するために用意されているものは CDI だけです。例えば、JPA のような永続化のための仕様は MicroProfile には含まれていません。マイクロサービスでは、それぞれのサービスは外部インタフェースからデータストアまで一通り備えた、独立した存在です。そのため、データの永続化ひとつをとっても、サービスごとに最適な方法 (KVS、RDB、etc.) は異なります。他の機能についても同様のことが言えます。

マイクロサービスにおいては、各サービスの実装には標準・非標準を問わず最適な技術が選択されます。裏を返すと、目的を達成するためであればどのような技術を用いても良く、共通で使用されると考えられる JAX-RS、CDI、JSON-P のみを MicroProfile としてまとめています。MicroProfile に規定されていないものについては、サービスごとに最適な技術を任意に組み合わせるべきというのが基本的な考え方です。

2. MicroProfile によるアプリケーション開発

MicroProfile によるアプリケーション開発では、通常は複数のサービスを組み合わせてアプリケーションを構築することになります。サービスは既存のものもあれば、新たに開発するものもあるでしょう。

MicroProfile.io が提供しているデモに microprofile-conference というアプリケーションがあります。このデモ・アプリケーションはカンファレンスのスケジュール・セッション・スピーカーの管理とセッションへの投票受付を行うもので、4 つのサービスと UI を含む Web アプリケーションで構成されています。pom.xml を見ると、サービスごとに必要なモジュールを依存関係に含めていることがわかります (デモのため MicroProfile 本体だけで構築しているサービスもあります)。4 つのサービスがそれぞれ異なる MicroProfile 実装で提供されているのも興味深い点です。実をいうと、このアプリケーションは私の環境ではビルドできないのですが、ソースファイルを見るだけでも感覚はつかめることでしょう。

どのサービスも、JAX-RS でエンドポイントを提供しており、それを Web アプリケーションから呼び出す構成を採っています。サービス間の通信はなく、Web アプリケーションがサービスの取りまとめ役を果たしています。

各サービスは CRUD に相当する機能を提供しており、それぞれ独自の方法でデータストアの操作を行っています。このアプリケーションはデモのため永続化ストアは使用していませんが、実運用を想定したアプリケーションであれば永続化ストアを使用するサービスも出てくることでしょう。データストアはサービスごとに独立して管理しますが、その参照先は同一であっても構いません。例えば、1 つの RDBMS を複数のサービスが参照しても良いのです。ただし、RDBMS に対する操作 (JPA でいうところの PersistenceUnit) はサービスごとに異なります。
マイクロサービスでは、アプリケーション全体としてのトランザクション一貫性は保証せず、別の方法でそれを補います (そして、その方法はアプリケーションによって異なります)。二相コミットメントを使うことも不可能ではありませんが、それではマイクロサービスの大切な何かを失ってしまうような気がします。

3. まとめ

今回は MicroProfile.io が提供するデモ・アプリケーションを題材として、MicroProfile を利用したマイクロサービスの実装例を見てみました。MicroProfile で規定された仕様はわずか 3 つですが、マイクロサービスの視点からは標準化すべき仕様はその程度で問題なく、あとはサービスごとに必要な技術を標準・非標準を問わず必要なだけ利用すれば良いことになります。

本来であれば、MicroProfile を用いてサービスとアプリケーションを開発できれば良かったのですが、そこそこの大きさのデモ・アプリケーションが用意されたため、それを紹介させていただきました。


明日は、Java EE が多田さん (@suke_masa)、Payara がうらがみさん (@backpaper0) です。

Payara MicroProfile 1.0

今回は先月リリースされた Payara MicroProfile 1.0 についてご紹介します。Payara MicroProfile は Payara Server の MicroProfile 実装で、Payara Micro をベースに作られています。Payara MicroProfile については Director の Steve Millidge による紹介記事がありますので、併せてご覧ください。

1. MicroProfile とは?

MicroProfile は Java EE 技術をベースとしたマイクロサービス向けのプロファイルで、MicroProfile.io によって策定されています。

MicroProfile.io は IBMLondon Java CommunityRed HatTomitribePayara および SouJava といったベンダーおよびユーザーグループで構成されており、現在のところ Java Community Process とは独立して活動しています (Eclipse Foundation に提案しようという動きもあるようです)。

2016 年 9 月に最初のバージョンがリリースされ、現時点では WildFly Swarm と Payara MicroProfile がこれに対応しています。MicroProfile 1.0 に含まれる API は JAX-RS、CDI および JSON-P という最小セットになっていますが、今後必要な API を順次追加する見込みです。Web Profile が Java EE Full Platform の完全なサブセットであるのに対して、MicroProfile は (現時点ではサブセットになっていますが) 必ずしもサブセットにはこだわらない姿勢を見せています。

2. Payara MicroProfile とは?

Payara MicroProfile は Payara Micro をベースに開発された MicroProfile のランタイムです。サイズは 32.4 MB と Payara Micro よりもさらに小さくなっています。内包している API を除いて Payara Micro と同じコードを使用しているため、Payara Micro が持つ各種オプションをそのまま使用することができます。Hazelcast によるクラスタリングと JCache 実装もそのまま提供されます。

Payara Micro の導入に関しては、少し情報は古いですが (Uber JAR 非対応の頃)、以下のスライドを参照してください。

Payara Micro と Payara MicroProfile の API を比較してみましょう。

Payara Micro 4.1.1.163

  • Java EE 7 Web Profile (Servlet, JSTL, EL, JSP, WebSockets, JSF, JAX-RS, EJB lite, JTA, JPA, Bean Validation, CDI, Interceptors)
  • Concurrency
  • JBatch
  • JCache (by Hazelcast)

Payara MicroProfile 1.0

  • JAX-RS
  • CDI
  • JSON-P
  • JCache (by Hazelcast)

Payara MicroProfile 1.0 は MicroProfile 1.0 仕様には含まれない JCache を内包していますが、これは Hazelcast を搭載していることによります。

MicroProfile 1.0 には既にいくつかのサンプルが用意されています。これらは WildFly Swarm 向けに実装されたものですが、Payara MicroProfile や Apache TomEE (TomEE もサポートを提供する Tomitribe が MicroProfile 対応を表明しています) でも動作します。

補足: Payara Micro のバージョンは母体となった Payara Server のバージョンに沿っていますが、Payara MicroProfile のバージョンは MicroProfile 仕様のバージョンに合わせています。

3. Payara MicroProfile の pom.xml テンプレート

Payara MicroProfile を使用する際の pom.xml 記述は基本的に Payara Micro と同じです。現在の Payara Micro は Uber JAR に対応しているため、pom.xml にも Uber JAR 作成用の記述を用意しておくと便利です。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.5.0</version>
        <dependencies>
          <dependency>
            <groupId>fish.payara.extras</groupId>
            <artifactId>payara-microprofile</artifactId>
            <version>1.0</version>
          </dependency>
        </dependencies>
        <executions>
          <execution>
            <id>payara-uber-jar</id>
            <phase>package</phase>
            <goals>
              <goal>java</goal>
            </goals>
            <configuration>
              <mainClass>fish.payara.micro.PayaraMicro</mainClass>
              <arguments>
                <argument>--deploy</argument>
                <argument>${basedir}/target/${project.build.finalName}.war</argument>
                <argument>--outputUberJar</argument>
                <argument>${basedir}/target/${project.build.finalName}.jar</argument>
              </arguments>
              <includeProjectDependencies>false</includeProjectDependencies>
              <includePluginDependencies>true</includePluginDependencies>
              <executableDependency>
                <groupId>fish.payara.extras</groupId>
                <artifactId>payara-microprofile</artifactId>
              </executableDependency>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Payara MicroProfile の groupId は fish.payara.extras (Payara Micro と共通)、artifactId は payara-microprofile (Payara Micro の場合は payara-micro) となります。また、バージョンは 1.0 を指定します。

上記の pom.xml は Steve の記事にあるものと概ね同じです。exec-maven-plugin を使用して Uber JAR 作成を行っているところが肝になります。Maven の package フェーズで WAR ファイルが作成された後に Uber JAR が作成されます。

私は Eclipse を多用している関係で、Eclipse WTP プロジェクトを Maven プロジェクトに変換することが多くあります。私の場合は、プロジェクト形式の変換で生成された pom.xml に exec-maven-plugin の記述を追記して、Uber JAR 作成に対応させています。


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.exsample</groupId>
  <artifactId>hello</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
<!-- ここから追記 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.5.0</version> <dependencies> <dependency> <groupId>fish.payara.extras</groupId> <artifactId>payara-microprofile</artifactId> <version>1.0</version> </dependency> </dependencies> <executions> <execution> <id>payara-uber-jar</id> <phase>package</phase> <goals> <goal>java</goal> </goals> <configuration> <mainClass>fish.payara.micro.PayaraMicro</mainClass> <arguments> <argument>--deploy</argument> <argument>${basedir}/target/${project.build.finalName}.war</argument> <argument>--outputUberJar</argument> <argument>${basedir}/target/${project.build.finalName}.jar</argument> </arguments> <includeProjectDependencies>false</includeProjectDependencies> <includePluginDependencies>true</includePluginDependencies> <executableDependency> <groupId>fish.payara.extras</groupId> <artifactId>payara-microprofile</artifactId> </executableDependency> </configuration> </execution> </executions> </plugin>
<!-- ここまで追記 --> </plugins> </build> </project>

私自身、Payara MicroProfile を使い始めて間もないのですが、Payara Micro の使用経験があれば API の差を除いて戸惑うことはないと思います。もし JPA が必要ならば EclipseLink を依存関係に追加すれば良いですし、画面周りのフレームワークが必要ならば Ozark を加える方法もあります。

MicroProfile 1.0 API の品揃えの関係から、CDI に関して相応の知識が要求されるかもしれません。幸い、書籍「パーフェクト Java EE」にまとまった CDI の解説があるため、手元に用意しておくと役に立つかもしれません。

4. まとめ

MicroProfile は生まれたばかりの仕様です。これからどのように発展していくのかわかりませんが、立ち上がりの今だからこそ私達に貢献できる範囲が非常に広いとも言えるでしょう。Payara でもマイクロサービス (Payara Micro) と MicroProfile を積極的に推進していますので、これからの展開にご期待ください。併せて、Payara への貢献もよろしくお願いします。