How to Use Recent MicroProfile and JDK Features to Scale Your Apps in the Cloud

このエントリは以下のエントリをベースにしています。
This entry is based on the following one, written by Brian Benz (Developer Advocate, Microsoft).
https://dzone.com/articles/how-to-use-recent-microprofile-and-jdk-features-to

Introduction

柔軟なクラウド基盤上で、ほぼ無限の個数の自律的で疎結合な、頻繁に更新されるマイクロサービスの管理は、開発者にとって新たな課題を生み出します。このエントリでは、継続的にネットワークやサービスのアップデートと組み合わせながら、クラウドアプリケーションのデプロイや拡張の信頼性をあげるための最近のJDKおよびMicroProfileの機能アップデートをご紹介します。また、文書化、認証、および疎結合アプリケーションの依存関係、リソース、および構成の管理を実現するためのヒントもご紹介します。

Adding Notable JDK Updates to Your Microservices

最新のJDKリリースには、マイクロサービスベースのアプリケーション構築のための新機能が含まれています。JDK 11が2018年9月に一般提供されました。これはJava 8以後で最初の長期サポート版 (Long Term Support) です。いつも通り、最新JDKの機能やスケジュールはJDK Enhancement Proposal (JEP) Processで管理されています。

JEP draft: JEP 2.0, draft 2
https://cr.openjdk.java.net/~mr/jep/jep-2.0-02.html

以下の説明では、各機能の完全な詳細への手軽なリファレンスとして、JEPリリース番号とリンクを含めています。

Launching Single-File Source-Code Programs and a Standard HTTP Client

単一ファイルのソースコードプログラム (JEP 330) の立ち上げ機能と新しいHTTPクライアント (JEP 321) は、マイクロサービスと非常に密接に連携しており、物事を単純でわかりやすくします。

JEP 330: Launch Single-File Source-Code Programs
http://openjdk.java.net/jeps/330
JEP 321: HTTP Client (Standard)
http://openjdk.java.net/jeps/321

単一ファイルのプログラムを起動する機能を使えば、開発者のコードをローカルですばやくテストすることができ、またコンテナベースの環境でコードを実行するために必要な命令を大幅に簡素化することができます。JEP 330のモチベーションのセクションの以下の分に着目してください。

Single-file programs — where the whole program fits in a single source file — are common in the early stages of learning Java, and when writing small utility programs. (単一ファイルのプログラム、つまりプログラム全体が1個のソースファイルに入っているものは、Javaの学習初期やちょっとしたユーティリティプログラムを作成する際によくあるものです)

もちろん、マイクロサービスを「ちょっとしたユーティリティプログラム」と表現することもできるでしょう。この文脈で、JDKイメージをロードするためのコンテナを作成することもできます。その後、ファイルをコンテナにロードするためのCOPYと、それを開始するためのCMDをDockerfile内に追加すればよいのです。

FROM adoptopenjdk/openjdk11:latest
COPY mymicroservice.java / mymicroservice.java
CMD ["java", "mymicroservice.java"]

これがテストをどのように単純化するかを想像してみてください。コンテナ内でコードをビルド/コンパイルして実行する代わりに、DockerfileのFROM行を変更するだけで、さまざまなJVMおよびOSバージョンで実行できてしまうのです。

次に、単一ファイルのマイクロサービスでは、おそらくHTTPを使用して、少なくともリクエストとレスポンスで他のマイクロサービスと会話する必要がありますが、これを非常に単純で読みやすい方法で実現するには、マイクロサービスの一部として新しい標準HTTPクライアント (JEP 321) を実装します。HttpClientオブジェクトは、非同期要求、HTTP/2、およびWebSocketsを使いリクエストを送信します。HttpRequestオブジェクトはリクエストメソッドとヘッダを含み、HttpResponseオブジェクトはターゲットからの情報を返します。このあたりは、Anthony Brunoによる、URLConectionオブジェクトと比較した素晴らしいサンプルが参考になるでしょう。

A quick look at Java 11’s HttpClient
https://dev.to/aussieguy/a-quick-look-at-java-11s-httpclient-1f79

Work Around the Removal of XML APIs When Working With MicroProfile and Spring Apps:

残念ながらJEP 320により、古いJava EEモジュールやCORBAモジュール、特にJAX-WS(XMLベースのWebサービス用のJava API)、およびJAXB(XMLバインディング用のJavaアーキテクチャ)の削除の一環として、他の機能の中でもとりわけXML構成ファイルの読み取りと管理でよく使われている便利なXML処理クラスが削除されています。

JEP 320: Remove the Java EE and CORBA Modules
http://openjdk.java.net/jeps/320
JSR 224: JavaTM API for XML-Based Web Services (JAX-WS) 2.0
https://jcp.org/en/jsr/detail?id=224
JSR 222: JavaTM Architecture for XML Binding (JAXB) 2.0
https://jcp.org/en/jsr/detail?id=222

もしやりたいなら、Javaの世界の現在のYAMLフェチを満足させるようにアプリケーションを構築したりリファクタリングすることはもちろん可能ですが、アプリケーションをそのままにして最新のJDKを使用したい場合は、JAX-WSと JAXBをMaven artifactとして入手できます。

ツールやAPIのMavenアーティファクトもあります。詳細はJEP 320のドキュメントをご覧ください。

Use Flight Recorder and Distributed Tracing to Collect and Analyze Telemetry in Your Microservices

2個のツールがクラウドでのデプロイメントの計画および管理に劇的に役立ちます。

Distributed Tracing (分散トレーシング) を使うと、マイクロサービス間の対話だけでなく、マイクロサービスのパフォーマンスの管理および追跡に役立ちます。分散トレースを使えば、すべてのデプロイメントが同じクラウドで動作していなくても、最小限のオーバーヘッドとオープンソースの可視化機能を使って、クラウドアプリケーションのボトルネックの管理や識別ができます。

OpenTracing.ioからの引用

OpenTracing is comprised of an API specification, frameworks, and libraries that have implemented the specification and documentation for the project. OpenTracing allows developers to add instrumentation to their application code using APIs that do not lock them into any one particular product or vendor. (OpenTracingは、プロジェクトの仕様とドキュメントを実装したAPI仕様、フレームワーク、およびライブラリで構成されています。OpenTracingを使えば、開発者は、特定の製品やベンダにロックされないAPIを使用してアプリケーションコードにインスツルメンテーションを追加することができます。)

The OpenTracing Project
https://opentracing.io/

Flight Recorder (JEP 328) は分析をさらに一歩進め、JVMに入って、実行中のコードのパフォーマンスのボトルネックとエラーを追跡します。

JEP 328のドキュメントからの引用

Flight Recorder records events originating from applications, the JVM, and the OS. Events are stored in a single file that can be attached to bug reports and examined by support engineers, allowing after-the-fact analysis of issues in the period leading up to a problem. Tools can use an API to extract information from recording files. (Flight Recorderは、アプリケーション、JVM、およびOSから発生したイベントを記録します。イベントは単一のファイルに保存され、バグレポートに添付してサポートエンジニアが調べることができるため、問題に至るまでの期間の課題を事後分析できます。ツールはAPIを使って記録ファイルから情報を抽出できます。)

Flight Recorderは開発とテスト時において、コードのパフォーマンスと信頼性の管理に適しています(訳注:もちろん事後の問題解析においてもです)し、分散トレースは、どこで分散マイクロサービスのどこでボトルネックが発生しているのかを確認するためにデプロイ済みのマイクロサービスに目を配り続けるのに適しています。

JEP 328: Flight Recorder
https://openjdk.java.net/jeps/328

Using MicroProfile to Manage Your Microservices

MicroProfileは、ほとんどのマイクロサービスが必要とするいくつかの基本コンポーネントでマイクロサービスを管理する優れた方法として急速に進化しています。これは、Java EE 8をベースとしたEclipseプロジェクトであり、主要なクラウドベンダー、IT組織、および個人からの参加を得ています。MicroProfileプロジェクト、コンポーネント、および参加者の詳細については、microprofile.ioを参照してください。

Eclipse MicroProfile
https://microprofile.io/
MicroProfile Starter
https://start.microprofile.io/

Manage MicroProfile Configurations at Build and Runtime

MicroProfileの優れた機能の1つに構成オプションがあります。MicroProfileの設定を外出しすることも、実行時にも設定できる、つまり、アプリケーションコードを変更せずに、アプリケーション環境に基づいてアプリケーションの動作を管理したり変更したりすることさえできます。

Eclipse MicroProfile Config – what is it?
https://www.eclipse.org/community/eclipse_newsletter/2017/september/article3.php

pom.xmlファイルを使い、構成の指定や転送することも、実行時に指定したりオーバーライドすることもできます。システムプロパティをまず評価して、その後環境変数を評価し、続いてpom.xmlやクラスパスのproject-defaults.xmlファイルを評価します。これにより、柔軟な実行環境を実現するだけでなく、変数ENVとシステムプロパティを使って異なる構成オプションのテストも簡単です。

たとえば、分散トレーシングはMicroProfileアプリケーションに組み込まれている重要なコンポーネントの1つです。 OpenTracingの実装および視覚化ツールであるjaegerをアプリケーションに含めるには、pom.xmlに以下の依存関係を追加するだけです。

Jaeger
https://www.jaegertracing.io/

<dependency>
     <groupId>io.thorntail</groupId>
     <artifactId>jaeger</artifactId>
</dependency>

続いて、サービスの名前を変更したい場合には、project-defaults.ymlファイルに以下のように名前を追加すればOKです。

swarm.jaeger.-jaeger-example

環境変数を使って名前を指定することもできます。

export -jaeger-example

java -jar JARファイルの形でMicroProfileアプリケーションを実行している場合、コマンドラインのパラメータで指定することもできます。

java -jar -jaeger-example

いくつかのアプリケーション・プラットフォームが各デプロイメント用の環境変数をサポートしています。以下はRed Hat OpenShift Originにおける、本番環境にデプロイ済みのコンテナ用に設定されたjaegerの環境変数の例です。

OKD – The Origin Community Distribution of Kubernetes that powers Red Hat OpenShift.
https://www.okd.io/

これにより疎結合サービスを使ったアプリケーションのビルド、テスト、および複数のクラウド環境にデプロイする際に大幅な柔軟性をもたらします。

Build Fault Tolerance and Health Checks Into Your Microservices Without Code!

コードの管理とテストのためにここまでに説明してきた機能があっても、本番環境ではまだ問題が発生する可能性があります。これらのまれなケース向けに、コンテナ環境でアプリをシャットダウンして再デプロイする簡単な方法があります。また、同様の機能を使用して、大規模にアプリケーションの負荷を監視し、ユーザーのニーズに基づいて利用可能なコンテナの数を調整できるようにしたい、と考えてらっしゃるかもしれません。

ヘルスチェックを使って、別のマイクロサービスまたはプロセスを使って特定のマイクロサービスが正常であるかどうかを確認できます。フォールトトレランスは、マイクロサービスが複数のプロセスやマイクロサービスからなるより大きなインフラストラクチャ内で失敗した場合に何が発生するか、そして事前に定義したルールに基づいてどのような自動アクションを実行するべきかを管理するための手法です。

ここでMicroProfileにとってよい知らせは、フォールトトレランスとヘルスチェックがコードを全くいじらずにアプリケーションに組み込むことができる点です。

例えば、MicroProfileアプリケーションでヘルスチェックを有効にするには、以下のセグメントをアプリケーションのpom.xmlファイルのconfigurationセクションに追加するだけでよいのです。

<config>
    <thorntail-v2-health-check>
    <path>/health</path>
    </thorntail-v2-health-check>
</config>

フォールトトレランスとヘルスチェックが有効になると、監視対象になり、あらかじめ決められたイベントに対する自動レスポンスは別のコードから起動されます。そのコードはCDIを使って RetryPolicy、Fallback、BulkHead、CircuitBreaker を適用します。

詳細はHealth Checkプロジェクトのページ

MicroProfile Health
https://microprofile.io/project/eclipse/microprofile-health

そして、Fault Toleranceプロジェクトのページをご覧ください。

microprofile fault tolerance
https://microprofile.io/project/eclipse/microprofile-fault-tolerance

Conclusion

マイクロサービスの開発が楽になる新しいJDKとMicroProfileの機能に関するこの概説、いかがでしたでしょうか。JEPプロセスとEclipse MicroProfileプロジェクトに注ぎ込まれたすべてのコミュニティの取り組みを見られるという、本当に素晴らしい、楽しい時代です。ほとんどの成果は、クラウドベースのマイクロサービスの管理にイノベーションをもたらします。もしご質問があれば、Twitterで @bbenz をフォローいただいた上で、ご連絡ください。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中