15. マイクロサービスアプリケーションの互換性ガイド

本章ではMicroProfile仕様の非互換に関する情報を説明します。

MicroProfile仕様はバージョンアップの際に非互換を発生させることがあり、 これによりWebOTXをバージョンアップすると既存のMicroProfileアプリケーションの 動作が変わる、あるいは動作しなくなる等の影響が生じる場合があります。

このため、MicroProfileに準拠したアプリケーションを開発もしくは移行する場合は、 本章に記載されている互換性情報で影響の有無を確認してください。

15.1. MicroProfile 4.1互換性情報

MicroProfile仕様を4.1にアップデートした場合の互換性情報を説明します。 この互換性情報は、WebOTX V11.1にアップデートする際に該当します。

15.1.1. MicroProfile Config 2.0

暗黙のコンバーターの優先順位を変更
MP-Config 1.3での優先順位 実装条件 MP-Config 2.0での優先順位
1 ターゲット型Tにpublic static T of(String)メソッドがある 1
2 ターゲット型Tにpublic static T valueOf(String)メソッドがある 2
3 ターゲット型TにStringパラメーターを持つpublicコンストラクタがある 4
4 ターゲット型Tにpublic static T parse(CharSequence)メソッドがある 3
ConfigSource#getPropertyNames()はデフォルトのメソッドではなくなりました

org.eclipse.microprofile.config.spi.ConfigSourceを拡張実装したアプリケーションでは、ConfigSource実装クラスに以下のメソッド実装が必須になりました。

Set<String> getPropertyNames()
プロパティ式が展開されるようになりました

「${プロパティ名}」のフォーマットでプロパティ値が展開されるようになりました。 他にもフォーマットには以下が使用可能です。

・${expression:value}: expressionの値が見つからない場合は、valueで指定したデフォルト値とします。
・${my.prop${compose}}: 内部式を値に解決後に外部式を解決します。
・${my.prop}${my.prop}: 複数の式。

そのため以下の様にプロパティの値によっては旧バージョンとプロパティの値が変わる場合があります。

server.url=http://${server.host}/
server.host=localhost

MP-Config 1.4まで: server.urlの値は「http://${server.host}/」
MP-Config 2.0から: server.urlの値は「http://localhost/」

これまでと同じプロパティ値を取得するには以下のいずれかの方法があります。

空の値は有効ではなくなりました
設定値 戻り値タイプ メソッド 取得結果(旧仕様) 取得結果(新仕様)
"" String getValue "" throws NoSuchElementException
"" String getOptionalValue Optional.of("") Optional.empty()

そのため設定値を空にしている場合は値を明記してください。

15.1.2. MicroProfile Fault Tolerance 3.0

Fault Toleranceインターセプタの優先度変更

Fault Toleranceインターセプタのデフォルト優先度が「LIBRARY_AFTER+1」から「PLATFORM_AFTER+10」に変更となります。
これにより、旧バージョン環境においてユーザがFault Tolerance以外のインターセプタを実装している場合は、インターセプタの実行順番が変わる可能性があります。
対応する場合は、当該インターセプタの優先度か、Fault Toleranceインターセプタの優先度設定「mp.fault.tolerance.interceptor.priority」を変更してください。
設定項目については、[ リファレンス > 設定 > マイクロサービスアプリケーション > MicroProfile Fault Tolerance ] を参照してください。

Metrics名の変更

MicroProfile Metricsとの連携変更により、メトリクススコープが「application」から「base」に変更、またタグ機能(メトリクスを細かく識別する情報)を追加しました。
これにより、旧バージョン環境においてユーザがメトリクス情報を参照している場合は参照先を見直す必要があります。
対応する場合は、Fault Toleranceメトリクス情報を参考に、参照先を見直してください。

mpft.syncCircuitBreakerの削除

SmallRye独自設定「mpft.syncCircuitBreaker」(CircuitBreakerアノテーションの使用可否)の削除により、falseを設定していた場合でもCircuitBreakerアノテーションが使用不可となりません。
設定をfalse(使用しない)としていた場合は、アノテーション使用可否設定「CircuitBreaker/enabled=false」(CircuitBreakerアノテーションの無効化)で代用してください。
設定項目については、[ リファレンス > 設定 > マイクロサービスアプリケーション > MicroProfile Fault Tolerance ] を参照してください。

15.1.3. MicroProfile Heal 3.1

Healthアノテーションの廃止

ユーザーがアプリケーションに作成・配置するヘルスチェック応答を生成するクラスに使用していた@Healthアノテーション(org.eclipse.microprofile.health.Health)が廃止され、@Liveness(org.eclipse.microprofile.health.Liveness)、@Readiness(org.eclipse.microprofile.health.Readiness)、@Startup(org.eclipse.microprofile.health.Startup)アノテーションが追加されました。(@Healthアノテーションを定義したクラスは機能しません)
WebOTX V10.4までに使用していたクラスは新たに追加された@Liveness(アプリケーション準備状態)、@Readiness(アプリケーション実行状態)、@Startup(アプリケーション起動状態)アノテーションに 置き換える必要がります。MicroProfile Health のサンプルコードを参考にしてください。

レスポンスのjsonフォーマットの変更

レスポンスで返却するjsonフォーマットの構成がWebOTX V10.4から変更されており、それに伴いレスポンス内容の解釈を変更する必要があります。
全体の状態を示す"outcome"と、各"data"の"state"が、"status"に変更になりました。

{
    "outcome":"UP",
    "checks": [
        { "name":"SampleHealth", "state": "UP", "data": { "dataName":"dataValue" } }
    ]
}
{
    "status": "UP",
    "checks": [ 
        { "name": "SampleHealth", "status": "UP", "data": { "dataName": "dataValue" } }
    ]
}

変更部分(全体の状態を"outcome"と各"data"の"state"だった部分)を強調表示しています。

15.1.4. MicroProfile Metrics 3.0

@InterceptorBindingアノテーションの削除

メトリクスを注釈する際に、そのメトリクスをCDIのinterceptor binding typeとして宣言した場合に指定しました。 以前から意味をなさないアノテーションでしたが、もしコードに記述しているユーザーがいれば削除する必要があります。

MetricIDの導入

これまで、名前のみで管理していたメトリクスを「名前」と「タグ名」のセットで管理するようになりました。

V10.4以前) "threadpool.size": 16
V11.1以降) "threadpool.size;pool=Default_Executor": 16
タグのkey名に正規表現を適用

key名がつぎの正規表現に一致するよう制限されます。Key名を設定する際に注意してください。

[a-zA-Z_][a-zA-Z0-9_]*
MP_METRICS_TAGSで指定するvalueの扱い変更

MicroProfile Configよりmp.metrics.tagsを介してタグ値を定義できます。タグ値の中に等号=やカンマ,が含まれていると、バックスラッシュでエスケープする必要があります。

エスケープ前)export MP_METRICS_TAGS=app=shop,tier=integration=y,y
エスケープ後)export MP_METRICS_TAGS=app=shop,tier=integration\=y\,y
OPTIONSによるメタデータ出力形式の変更

OPTIONSメソッドでメタデータを出力した時のタグの出力形式が変更になりました。OPTIONSメソッドを利用する時に注意してください。

V10.4以前の出力例) 
  "gc.time": {
        "name": "gc.time",
        "tags": "name=PSScavenge","name=PSMarkSweep"
      },

V11.1以降の出力例) 
  "gc.time": {
        "name": "gc.time",
        "tags": [
          [
            "name=PSScavenge"
          ],
          [
            "name=PSMarkSweep"
          ]
        ]
      },
メトリクス名の変更

一部の累積カウンターの名前が、最後にtotalを付与する形に変更しています。

V10.4以前)
  "gc.PS MarkSweep.count" "gc.PS Scavenge.count"
  "classloader.totalLoadedClass.count"
  "classloader.totalUnloadedClass.count"

V11.1以降)
  "gc.total;name=PSMarkSweep” "gc.total;name=PSScavenge"
  "classloader.loadedClasses.total"
  "classloader.unloadedClasses.total"
メトリクスのタイプ変更

一部のカウンターは、タイプがカウンター(Counter)からゲージ(Gauge)に変更されました。

・thread.count
・thread.daemon.count
・classloader.currentLoadedClass.count
・thread.max.count
Prometheus形式からOpenMetrics形式への変更

従来Prometheus(プロメテウス)と呼ばれていた出力形式が、OpenMetricsという形式に変更しています。合わせて、メトリクス名の区切りが :(コロン)ではなく _(アンダースコア) に変更となります。

V10.4以前)
  base:cpu_available_processors

V11.1以降)
  base_cpu_availableProcessors
全てのメトリクスが再利用可能

再利用とは、アノテーションを利用して同じメトリクスを複数登録する事を指します。従来は、アノテーションの属性として明示的に指定(reusable = true)する必要がありましたが、これからは全てが再利用可能となります。またreusable指定は廃止されています。

@Metricアノテーションをメソッドに付与してもメトリクス登録されない

@Metricアノテーションをメソッドに付与してもメトリクスとして登録されなくなります。@Counted等他のアノテーションを使うか、MetricRegistryクラスを使うなど、代替手段に切り替えてください。

MetricRegistryがインタフェースに変更

org.eclipse.microprofile.metrics.MetricRegistryが抽象クラスからインタフェースへ変更となりました。MetricRegistryクラスを利用していたアプリケーションは修正の必要があります。

Timer#update()引数の変更

org.eclipse.microprofile.metrics.Timer#update()メソッド引数が変更となりました。

V10.4以前)
  update(long duration, TimeUnit unit)

V11.1以降)
  update(Duration duration)

15.1.5. MicroProfile Rest Client 2.0

@Consumes、@Producesアノテーションのデフォルト値

@Consumes、@ProducesアノテーションでMIMEタイプが指定されない場合、デフォルト値として"application/json"が使用されます。

Rest Clientアプリケーションのクローズ処理

V10.4で動作していたRest ClientアプリケーションをV11.1に配備した場合、配備解除やドメイン停止時に次のメッセージが出力されます。

INFO     MICROPROFILE - OTX31070045: Closing a class org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient43Engine instance for you. Please close clients yourself

Rest ClientアプリケーションにClose処理を追加することで、メッセージ出力を抑止することができます。詳細については、[MicroProfile Rest Client > 提供機能 > MicroProfile Rest Clientのライフサイクル]をご覧ください。