このエントリは以下のエントリをベースにしています。
This entry is based on the following one written by Niklas Heidloff (Developer Advocate, IBM).
https://microprofile.io/2019/04/24/end-to-end-example-app-running-microprofile-on-kubernetes-and-istio/
具体的なMicroProfileの機能を説明するよいサンプルがたくさんありますが、これらはIstioの機能を説明する上でもよいサンプルです。特にBookInfoアプリケーションはその好例でしょう。MicroProfileとIstioを活用する包括的なアプリケーションが見当たらなかったので、今回同僚のHerald Uebeleと共に作成しました。このサンプルはオープンソースとして公開しています。この中にはJava開発者がクラウドネイティブのパターンを学んだりマイクロサービスを始めたりするにあたり、数多くの有用な情報が含まれています。
Cloud Native Starter for Java EE based Microservices on Kubernetes and Istio
https://github.com/nheidloff/cloud-native-starter
Kubernetes, Istio and Java
クラウドネイティブアプリケーションを構築する際に開発者はトラフィックルーティング、レジリエンシ(回復性、Resiliency)、分散監視(Distributed Monitoring)、サービスの発見(Service Discovery)などへの対処方法を見つけ出すのは困難ですが、幸いにしてこうした新たな課題のほとんどはコンテナオーケストレーション基盤のKubernetesとサービスメッシュのIstioがよろしくやってくれます。この機能は一般的に、実装した言語に関係なく、アプリケーションに変更を入れる必要もなく、マイクロサービスに対して効果があります。
Kubernetes
https://kubernetes.io/
Istio
https://istio.io/
しかしながら、いくつかの機能はオーケストレーションプラットフォームやサービスメッシュで解決できません。そのかわりにマイクロサービスのビジネスロジックで取り扱う必要があります。具体的には、アプリケーション固有のフェールオーバー機能やメトリック、きめ細かい認可といったものが該当します。
Jaav開発者はEclipse MicroProfileを使ってこの機能を実装できます。MicroProfileはマイクロサービスベースのアーキテクチャを構築するためのJava EE (Enterprise Edition) の拡張で、KubernetesとIstioの機能を補完します。
Eclipse MicroProfile
https://microprofile.io/
KubernetesやIstioが扱えないアプリケーション固有のロジックに加え、通常マイクロサービスを開発する際に必要な便利な機能も提供しています。具体的には、REST APIの呼び出し機構、REST APIの実装機能をドキュメント込みで提供しています。
Design Principles
サンプルアプリケーションは以下の設計原則に従います。
できる限りプラットフォームを活用する(アプリケーション固有のロジックのためにフレームワークを使う)
KubernetesとIstioをトラフィック管理のような機能のために活用することの利点は、これらの機能が言語非依存なところにあります。クラウドネイティブアプリケーションは、多くの場合polyglotである可能性があります。Polyglotゆえに開発者は最善の言語を特定のタスクのために選択できます。可能な場合はいつでも、サンプルアプリケーションはKubernetesとIstioのプラットフォーム機能を利用します。
アプリケーション固有のロジックについては、サンプルアプリケーションでは種々のMicroProfileの機能を使っています。IstioとMicroProfileを組み合わせて利用する方法は以下のエントリをご覧ください。
MicroProfile, the microservice programming model made for Istio
https://www.eclipse.org/community/eclipse_newsletter/2018/september/MicroProfile_istio.php
アプリケーションのコアサービスのためにのみオープンソースコンポーネントを使う
できるだけ多くの開発者に届くよう、サンプルアプリケーションではアプリケーションのコアサービスに対してのみオープンソースプロジェクトを使用しています。具体的には、JavaスタックはAdoptOpenJDKのOpenJ9やOpenJDK、OpenLiberty、MicroProfileを使っています。KubernetesやIstioは明らかにオープンソースプロジェクトです。オープンソースとして利用できないアプリケーションコンポーネントはオプションで交換可能にしています。
AdoptOpenJDK
https://adoptopenjdk.net/
OpenJ9
https://www.eclipse.org/openj9/
OpenLiberty
https://openliberty.io/
最初の体験(Experience)はできるだけ簡単にする
様々なクラウドネイティブの機能について、利用可能なサンプルやスニペット、記事やチュートリアルがたくさんあり、多くは非常に素晴らしいものですが、こうした機能を一つのアプリケーション内で使うと問題がありました。これらのサンプルは時として異なるJavaスタック、異なるバージョンを使っていたり、記事が古くなっていたりしていました。
このサンプルアプリケーションではいくつかの機能を一緒に動作させています。詳細は後述します。非常に簡単にデプロイするスクリプトもあります。これらは1サービスあたり基本的に1個のスクリプトで、Cloud Foundryアプリケーションにおける ‘cf push’ に類似しています。
異なる環境でアプリケーションが動作するようにする
オンプレミス、ハイブリッドクラウドもしくはパブリッククラウドで動作するため、幸いにしてこれはKubernetesの一つの主要な利点です。リポジトリにはMinikubeやIBM Cloud Kubernetes Serviceといったマネージドサービスにアプリケーションをデプロイする方法がございます(訳注:もちろん他社クラウドでも動作します)。
IBM Cloud Kubernetes Service
https://www.ibm.com/cloud/container-service
Functionality of the Sample Application
このプロジェクトでは以下の機能を紹介しています。
Demos
https://github.com/nheidloff/cloud-native-starter#demos
- Dockerizing Java MicroProfile services
- Traffic management
- Authentication and authorization
- Resiliency
- REST APIs implementations including documentation
- REST API invocations
- Monitoring and metrics
- Distributed logging and monitoring
以下のスライドでこのアプリケーションの機能の概要を紹介しています。
How to develop your first cloud-native Applications with Java
https://github.com/nheidloff/cloud-native-starter/blob/master/documentation/FirstCloudNativeApplicationsJava.pdf
下図はサービスとコンポーネントの関係を示したものです。

WebアプリケーションはBFF (Backend for Frontend) サービスのAPIを呼び出して著者と作品を表示します。

Call to Action
クラウドネイティブアプリケーションをよく知りたい場合には、サンプルアプリケーションのコードを入手して手順に従いローカルのMinikube環境を作成し、マイクロサービスをデプロイしてください。すでにKubernetesクラスタをお持ちであれば、セットアップに30分もかからないでしょう。
GitHub Repository
https://github.com/nheidloff/cloud-native-starter
Setup
https://github.com/nheidloff/cloud-native-starter#setup
Istioプラグインが付いているIBM Cloud Kubernetes Serviceというマネージドサービスでもこのアプリケーションを実行できます。IBMではIBM Cloud Liteアカウントを用意しており、これを使うと無料かつクレジットカードも不要で、時間制限なくお使いいただけます。Kubernetesサービスを使うには、Haraldもしくは当方にプロモーションコードを問い合わせてください。その上で、手順に従いIBM Cloudにサービスをデプロイしてください。
いつものように、フィードバックをお寄せください。このサンプルアプリケーションのことや、改善点をお知らせください。Twitter(@nheidloff)のダイレクトメッセージをオープンにしてありますので、そちらにどうぞ。