本稿では、近年の業界動向に対するLiberty Coreの強みを紹介し、その上でLiberty Coreを利用してJAX-RSおよびCDIを使って小規模なWebサービスを作成する方法を解説する。
1 業界に浸透しつつある「マイクロサービス」
近年、エンタープライズシステムやWebアプリケーションに関わる人々の間で「マイクロサービス」と呼ばれるアーキテクチャスタイルが話題にのぼるようになってきている。マイクロサービスとは、サービス全体がより小規模な独立したサービスの組み合わせによって構成されるようなアーキテクチャの設計スタイルを指す用語であり、Martin Fowler氏とJames Lewis氏が公開した「Microservices」という記事の中で詳しい定義が行われて注目を集めるようになった。
マイクロサービスでは、それぞれのサービスが単一の独立したアプリケーションとして完結していることが重要なポイントとなる。サービス同士の依存性を低く保つ一方で、各サービスはHTTPのようなオープンでシンプルな通信プロトコルによって緩く結合する。これによって、従来のモノリシックなシステムに比較して次のようなメリットを享受できるとされている。
- システムを構成する各サービスを独立して開発・デプロイすることができる
- 各サービスを独立してスケールすることができる
- モジュールの境界が明確なため、開発時のテストや、問題発生時の影響範囲の特定が容易
- 複数のチームでの開発や運用が行いやすい
システム全体をより小さなサブシステムの集合として構成する考え方自体は特に新しいものではなく、従来のSOA(Service-Oriented Architecture)などもその一種といえる。ただし、SOAの場合はサブシステムごとに個別に実装するというスタイルだったのに対して、マイクロサービスは機能単位にサービス化するという点で、その粒度や可搬性が異なっている。マイクロサービスとして提唱されるスタイルは、クラウドサービスに求められる要件との相性が良いことから、今後も必要性が高まってくるものと考えられる。
2 マイクロサービスとの相性もバッチリな「WAS Liberty Core」
実装の観点からマイクロサービスを考えた場合、独立性を保った小さなWebサービスを、いかに素早く開発し、市場に投入していけるかが重要なポイントとなる。そのためには軽量で手軽に使える開発およびテスト環境が必要だ。WAS Liberty Coreは、まさしくその「軽量で起動が速く、効率のよい開発を実現する」という目的のために生み出されたアプリケーションサーバーであり、マイクロサービスのようなアーキテクチャスタイルとも極めて相性が良い製品ということができる。
特に最新のLiberty CoreはJava EE 7に正式対応し、「JAX-RS 2.0」や「CDI 1.2(注1)」といった魅力的な機能がデフォルトで使えるようになっている。これらの機能は他のWebサービスと"緩く"連携する上で極めて重要な要素である。
Java EE 7リリース時のCDIのバージョンは1.1だったが、2014年4月にマイナーアップデートされて現在の最新版は1.2になっており、LibertyにもCDI 1.2の実装が同梱されている。
ここで、Liberty Coreについておさらいしておこう。Liberty CoreはWAS v8.5から追加されたLibertyプロファイルをベースとして構成されている。今年6月にリリースされたLibertyプロファイルの最新版では、従来の「Java EE 6 Web Profile」に加えて、「Java EE 7 Web Profile」および「Java EE 7 Full Profile」もサポートに加わった。つまりLibertyプロファイル自身は、Web Profileにとどまらない、Javaエンタープライズアプリケーション全域をカバーできる存在となっている。
Liberty Coreで利用可能な機能はLibertyプロファイル機能のサブセットであり、これらのうち「Java EE 6 Web Profile」および「Java EE 7 Web Profile」に準拠している。Liberty CoreとWASの他のエディションとのより具体的な機能面での違いについては、Liberty Coreのオンラインマニュアルのフィーチャー一覧を参照していただきたい。
さて、Webアプリケーションに関連したJava EE 7の新機能としては、次のようなものが挙げられる。
- JAX-RS 2.0(JSR 339: JAX-RS 2.0: The Java API for RESTful Web Services)
- CDI 1.1(JSR 346: Contexts and Dependency Injection for Java EE)
- JSON Processing(JSR 353: Java API for JSON Processing 1.0)
- WebSocket(JSR 356: Java API for WebSocket 1.0)
今回はこのうちのJAX-RSとCDI、JSON Processing(以下、JSON-P)の3つのAPIを活用して、JSONベースで他のサービスと連携可能な小さなWebサービスを構築してみる。なお、WebSocketを使用する方法については、『「WebSphere Application Server Liberty Core」で新たに正式サポートされたWebSocketを使ってみた』で詳しく解説している。