このエントリは以下のエントリをベースにしています。
This entry is based on the following one, written by Dmitry Kornilov (Eclipse EE4J PMC member, Jakarta EE contributor, JCP star spec lead, Helidon Project lead, Oracle).
https://dmitrykornilov.net/2019/08/08/helidon-brings-microprofile-2-2-support/
https://medium.com/oracledevs/helidon-brings-microprofile-2-2-support-93d85bb4223e
Helidon 1.2.0では、MicroProfile 2.2をサポートし、さらにバグ修正やパフォーマンス上の問題を改善しています。
Helidon 1.2.0 (Release Notes)
https://github.com/oracle/helidon/releases/tag/1.2.0
Eclipse MicroProfile 2.2 is Now Available
https://microprofile.io/2019/02/12/eclipse-microprofile-2-2-is-now-available/
MicroProfile
Project Helidonの主目的の一つは最新のMicroProfile APIのサポートを提供することにあります。HelidonのMicroProfile実装はHelidon MPと呼ばれ、Helidon SEと呼ばれるリアクティブ、ノンブロッキングフレームワークと並んでHelidonの中核を形成しています。
下図はサポートしているMicroProfileとJava EEのAPIのリストです。
1.2.0では、JPA (Persistence) と JTA (Transaction) という2個のJava EE APIのサポートを追加しました。現時点ではEarly accessのため、実装や構成は今後変更の可能性があります。
以下はHelidon 1.2.0で追加された新しいAPIの利用例です。
MicroProfile REST Client sample
RESTクライアントインターフェースを登録します(これはJAX-RSリソースが実装するものと同一であってもかまいません)。URIは構成を使ってオーバーライドできる点にご注意ください。
@RegisterRestClient(baseUri = "http://localhost:8081/greet") public interface GreetResource { @GET @Produces(MediaType.APPLICATION_JSON) JsonObject getDefaultMessage(); @Path("/{name}") @GET @Produces(MediaType.APPLICATION_JSON) JsonObject getMessage(@PathParam("name") String name); }
(異なるマイクロサービスのJAX-RSリソースなど)利用するクラスでRESTクライアントを宣言します
@Inject @RestClient private GreetResource greetService;
あとはフィールドを使ってリモートサービス(この例ではリモートサービスへのリクエストをプロキシしています)を呼び出すだけです。
@GET @Produces(MediaType.APPLICATION_JSON) public JsonObject getDefaultMessage() { return greetService.getDefaultMessage(); }
Health Check 2.0 sample
Health Check 2.0 にはReadinessとLivenessという2種類のチェック機構があります(以前は1種類だけでした)。
- Readiness — サービスが起動し利用可能であることを確認するためにクライアントが利用(例えばk8s readiness check)
- Liveness — サービスが稼働しており実行中であることを確認するためにクライアントが利用(例えば k8s liveness check)
application scopedのbeanに適切な注釈(@Readiness もしくは @Liveness)をつけてヘルスチェックを作成します。
import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.eclipse.microprofile.health.HealthCheck; import org.eclipse.microprofile.health.HealthCheckResponse; import org.eclipse.microprofile.health.Liveness; @Liveness @ApplicationScoped public class GreetHealthcheck implements HealthCheck { private GreetingProvider provider; @Inject public GreetHealthcheck(GreetingProvider provider) this.provider = provider; } @Override public HealthCheckResponse call() { String message = provider.getMessage(); return HealthCheckResponse.named("greeting") .state("Hello".equals(message)) .withData("greeting", message) .build(); } }
Open Tracing Sample
MicroProfileのOpen Tracing では、CDI beansのトレースを追加する目的で @Tracedという1個のアノテーションを追加しています。
Tracing of JAX-RS リソースのトレースは自動化されています( @Tracedで無効化できます)。以下はHealth checkのサンプルで使ったbeanの例で、getMessageメソッドをトレースしています。
@ApplicationScoped public class GreetingProvider { private final AtomicReference<String> message = new AtomicReference<>(); /** * Create a new greeting provider, reading the message * from configuration. * * @param message greeting to use */ @Inject public GreetingProvider( @ConfigProperty(name = "app.greeting") String message) { this.message.set(message); } @Traced(operationName = "GreetingProvider.getMessage") String getMessage() { return message.get(); } ... }
Other Enhancements
MicroProfile 2.2に加え、Helidon 1.2.0にはいくつかの機能強化が含まれています。
- Helidon MP と SEでHTTP Access Logをサポート
- Oracle Universal Connection Pool のサポート(Early access)
これを使って、Oracle UCP JDBCドライバをHelidon MPアプリケーションのDataSourceとして構成、注入できる。
More to Come
MicroProfile 2.2 のサポートにより、Helidonは他の主要なMicroProfile実装に追いついてきました。現在HelidonのMicroProfile 3.0対応に向けて作業を進めており、すでに最初の一歩を踏み出しています。これがタイトルの2.2の後に+をつけている理由です。すでにHealth Check 2.0をサポートしています(今後後方互換のある形でサポートする予定です)。残るはMetrics 2.0とREST Client 1.3で、来月リリースできるように鋭意取り組んでいます。