Contenu connexe Similaire à 【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ! (20) 【改訂版あり】クラウド・ネイティブ時代に最適なJavaベースのマイクロサービス・フレームワーク ~ Helidonの実力を見極めろ!1. Senior Director
Oracle Corporation Japan
February 14th, 2020
Tadahisa Kotegawa
Developers Summit 2020 - 14-C-5 #devsumiC
クラウド・ネイティブ時代に最適なJavaベースの
マイクロサービス・フレームワーク
~ Helidonの実力を見極めろ!
4. Copyright © 2020, Oracle and/or its affiliates |4
2020年2月3日 Oracle Cloud 大阪リージョン開設(サービス開始)を発表
IaaS/PaaS/SaaS全てのサービスを国内2つのリージョンで提供
テクノロジと
価格
データ・
プラット
フォーム
クラウド・セ
キュティ
テクノロジと
価格
データ・
プラット
フォーム
クラウド・
セキュティ
Oracle Cloud Infrastructure
Gen 2 Cloud
Oracle Cloud Infrastructure
Gen 2 Cloud
5. 5
アプリケーションの開発・運用を支援するマネージド・サービス
Oracle Cloud Native Services
Monitoring EventsStreaming
Observability + Messaging
API Gateway
Container
Engine for
Kubernetes
Resource
Manager
Cloud
Infrastructure
Registry
Functions
Notifications
Application Development + Operations
Logging
(Coming Soon)
OCIが提供する性能、セキュリ
ティ、高可用性を兼ね備えたマ
ネージドKubernetesサービス
(CNCF認証)
コンテナイメージを格納する高
可用性なプライベート・コンテ
ナ・レジストリ
インフラリソース運用の自動
化を可能にするIaCプラット
フォーム(オープンソース
Terraformベース)
REST APIの作成、運用、保護、
監視が可能なフルマネージドな
APIゲートウェイサービス
実行時課金のフルマネージドな
サーバーレス実行環境 (オープン
ソースDocker/Fn Projectベース)
OCI上の様々なリソースのメト
リクスを監視、ダッシュボード
で閲覧、通知
ホスト、アプリケーションのロ
グ管理・検索・分析を行うプ
ラットフォーム (オープンソー
スFluentdベース)
大量の宛先に通知可能なメッ
セージ通知プラットフォーム
大量のデータストリームを処理
するフルマネージドな分散メッ
セージングサービス (Kafka互
換プラグインの提供)
OCI上のリソースの状態変化を
捉えOracle Functionsを始めと
するサービス間の連携を実現
9. 9
オープン・ソース (github.com/oracle/helidon)
• 2019/02/15 に1.0.0をリリース
マイクロサービスを開発するためのJavaライブラリの集合体
JVM上の単体アプリケーションとして動作
従来からの一般的なツール・基盤で開発&デプロイ可能
• Java SE, Maven/Gradle, Docker, Kubernetes, etc.
Helidon とは?
※ Helidonは ギリシア語でつばめ(swallow)を意味します
Docker Image
Kubernetes
Helidon jars
OS base image
Library jars
App classes
Pod Pod Pod
Replica Set
Java SE runtime
10. Helidon SE と MP
• マイクロ・フレームワーク
• 超軽量フットプリント
• 関数型
• Reactive Web Server
• GraalVM native image
• MicroProfile 3.2
• 軽量フットプリント
• 宣言型
• Java EEサブセット +
マイクロサービス関連機能
• GraalVM JIT compiler
Helidon MP
Helidon SE
CDI Extensions
フットプリント重視
機能性重視
互換性(MicroProfile準拠)重視
10
11. 11
HelidonはOpen Sourceのプロジェクト
• Apache 2.0 License
Open Sourceとしてのサポートを提供中
• Web Site with guides and tutorials: https://helidon.io
• StackOverflow: https://stackoverflow.com/tags/helidon
• Public Slack channel: https://helidon.slack.com
• GitHub issues tracker: https://github.com/oracle/helidon/issues
Oracleによる商用サポートについて
• WebLogic Serverライセンス保有のお客様にHelidonのサポートを提供中
• Helidon単独のサポートを提供予定
Helidonのサポートについて
14. 14
1ステートメントで起動できるREST APIサーバー
Helidon SE – 関数スタイルのシンプルなRESTサーバー開発
public static void main(String[] args) throws Exception {
WebServer webServer = WebServer
.create(Routing.builder().any((req, res) -> res.send("It works!")).build())
.start()
.toCompletableFuture()
.get(10, TimeUnit.SECONDS);
}
どのPath/Methodでも
”It works!”を返す
サーバーの起動待ち
(エラー時Exception)
15. 15
GraalVM native image
高速起動・高速スケールが求められるユースケース(マイクロサービス、FaaS)に適する
• ランタイムの起動時間、及びプログラム実行初期のパフォーマンスの劇的な向上
• メモリフットプリントの削減
Helidon SE は GraalVM native image の作成をサポート
• Maven profileによるビルド - Helidon SE Quickstart を参照
- Local build (for the OS installed locally)
- Docker build (for Linux)
Helidon SE – GraalVM native image
export GRAALVM_HOME=<GraalVMのパス>
mvn package -Pnative-image
docker build -t helidon-quickstart-se-native -f Dockerfile.native .
+
16. Oracle主導で開発されるOSS
GraalVM:多言語の単一かつ高速なランタイムエンジン
GraalVMによる3つのイノベーション
• Javaアプリを安定・高速実行
- Javaで書かれた新たなJITコンパイラ
• JavaアプリのNative Image化
- 事前にマシン語にコンパイル(Ahead-of-Time Compilation)
- 起動時間の極小化とメモリフットプリントの削減
• 複数プログラミング言語を実行可能なランタイム
- Java, JavaScript, Ruby, Rust, C, C++…
- 単一プログラム内で、複数言語を絡めた記述が可能
Community Edition(GPLv2)とEnterprise Edition
• EEは最適化されたパフォーマンスとサポートを提供
• EEはOracleCloud Infrastructureで無償利用可能
HotSpot
JVMCI (JITコンパイラをJavaで実装するためのインターフェース)
Graal
GraalVM
Javaアプリ Truffle
SulongJS Ruby R
C C++
HotSpot
Compiler I/F
C2 (for Server)
Javaアプリ
Native
image
SubstrateVM
Javaアプリ
(マシン語)
シングルバイナリ
16
19. 19
Helidonは1.4で対応済
Eclipse MicroProfile 3.2 (Nov. 1st, 2019)
MicroProfile Config 1.3
MicroProfile Fault Tolerance 2.0
MicroProfile Health 2.1
MicroProfile JWT Authentication 1.1
MicroProfile Metrics 2.2
MicroProfile OpenAPI 1.1
MicroProfile OpenTracing 1.3
MicroProfile Rest Client 1.3
CDI 2.0
Common Annotations 1.3
JAX-RS 2.1
JSON-B 1.0
JSON-P 1.1
Java EE 8 由来MicroProfile 固有
20. Helidon MP Components
MP Config Metrics
Health
Check
Fault
Tolerance
JWT Auth
JAX-RS CDI JSON-P / B
Open API
Open
Tracing
REST Client
SE SE
SE
JPA
gRPC
JTA
SE
+
20
MicroProfile =
21. 21
アノテーション を使ってPOJO(=普通のJavaクラス)をRESTサービスに
MicroProfileで実装するREST API
@ApplicationScoped @Path("/echo")
public class EchoResource{
@Inject @ConfigProperty(name = “echo.reply", defaultValue = "Hi!")
private String reply;
@POST @Produces(MediaType.APPLICATION_JSON)
public Response handleRequest(Message message, @Context UriInfo uriInfo) {
JsonObject json = Json.createObjectBuilder()
.add("url", uriInfo.getRequestUri().toASCIIString())
.add("text", message.text)
.add(“reply", reply)
.build();
return Response.ok(json.toString()).build();
}
}
CDI
JSON-BJSON-P
JAX-RS
JAX-RS
CDI
JAX-RS
JAX-RS
MicroProfile Config
22. 22
MicroProfile Config 1.3
MicroProfile Fault Tolerance 2.0
MicroProfile Health 2.1
MicroProfile JWT Authentication 1.1
MicroProfile Metrics 2.2
MicroProfile OpenAPI 1.1
MicroProfile OpenTracing 1.3
MicroProfile Rest Client 1.3
MicroProfile 注目仕様のポイント解説
CDI 2.0
Common Annotations 1.3
JAX-RS 2.1
JSON-B 1.0
JSON-P 1.1
HelidonKubernetes
Grafana
Prometheus
Jaeger
Health
Metrics
OpenTracing
23. 23
Kubernetesなどノードの状態を検査するプロセスに対してヘルスチェック情報を提供する
MicroProfile Health
@Liveness
@Readiness
public class MyCheck implements HealthCheck {
@Override
public HealthCheckResponse call() {
return HealthCheckResponse
.named(“myhealth")
.withData("process", process)
.state(true)
.build();
}
}
Annotation Path Function
@Liveness /health/live Liveness
@Readiness /health/ready Readiness
{
"outcome": "UP",
"status": "UP",
"checks": [
{
"name": "myhealth",
"state": "UP",
"status": "UP",
"data": {
"process": "1@4f45aa39618d"
}
}
]
}
HealthCheckインターフェースを実装したクラスに
@Liveness and/or @Readiness
アノテーションをつける
Output: 200 OK
24. 24
Kubernetesのヘルスチェック機能と連携
• LivenessProbe
- ヘルスチェック失敗時、Podが再作成される
• ReadinessProbe
- ヘルスチェック失敗時、Serviceからのルーティングの
対象から外される(Podの再作成はされない)
MicroProfile Health (cont.)
apiVersion: v1
kind: Pod
metadata:
name: helidon-demo-mp
spec:
containers:
- name: api-helidon-container
image: helidon-demo-mp:latest
imagePullPolicy: Always
ports:
- containerPort: 8080
livenessProbe:
httpGet:
port: 8080
path: /health/live
failureThreshold: 3
periodSeconds: 10
Service
Pod
(OK)
Pod
(NG) /health/liveが失敗すると
Podは再作成される
/health/readyが失敗すると
ルーティングから外される
25. 25
Metrics = システムの健全性を測定するために使用される指標
Polyglot環境に適したモニタリングを可能にする
• JMX(Java Management Extensions)標準はJVMを前提にしているので不向き
ヘルスチェックとは異なる目的
• 長期的なトレンドの把握
• キャパシティ・プラニング、潜在的問題の早期把握
• スケジューリング・システムと連動したスケーリング
OpenMetrics
• CNCF(Cloud Native Computing Foundation)のサンドボックス・プロジェクト
• メトリック・データを公開するための仕様を策定
MicroProfile Metrics
# TYPE base_cpu_availableProcessors gauge
# HELP base_cpu_availableProcessors Displays the number of processors available
base_cpu_availableProcessors 2
26. 26
Metricsの利用例 – Prometheus & Grafana を使った監視
PrometheusGrafana Helidon
/metrics
https://grafana.com/ https://prometheus.io/
メトリクスの監視・集計メトリクスの可視化
27. 27
MicroProfile Metrics – アプリケーション独自メトリクスの取得
@ApplicationScoped @Path("/mymetrics")
public class MetricsResource{
@Inject @Metric(name="total")
Counter total;
private synchronized void countup(){
total.inc();
}
@Metered
@GET @Path("/blue")
public void blue(){ countup(); }
@Metered
@GET @Path("/green")
public void green(){ countup(); }
}
30. Demo : OpenTracing - JaegerによるSpanのトラッキング (1)
Oracle Container Engine for Kubernetes (OKE)
(pod) Helidon-demo-mp-0NordPort
(pod) Helidon-demo-mp-1
(pod) Helidon-demo-mp-2
(pod) Helidon-demo-mp-3
(pod) jaeger
Service
Service
Service
Service
ServiceNordPort
Browser
Port: 30080
(RESTAPI)
Port: 30086
(Jaeger UI)
トレース情報
30
mp-1
mp-2
mp-3
mp-1
mp-0
mp-0request
Jaeger UI
https://www.jaegertracing.io/
OSSの分散トレーシングシステム
31. Demo : OpenTracing - JaegerによるSpanのトラッキング (2)
31
JAX-RS Method
request
JPA Database
response
自動的に定義
されるSpan
明示的に定義
したSpan
JAX-RSリクエスト処理メソッドのSpan
JPAデータベース処理のSpan
33. 33
• JWT Provider
• HTTP Basic Authentication
• HTTP Digest Authentication
• Header Assertion
• HTTP Signatures
• ABAC Authorization
• Google Login Authentication Provider
• OIDC (Open ID Connect) Authentication Provider
• IDCS Role Mapping Provider
様々な認証・認可スキームに対応
Helidonが提供するSecurity Providers
Identity
Provider
Helidon
Open ID
Connect
認証シーケンス
Browser
OIDC (Open ID Connect) Authentication Provider
を使ったユーザー認証
user
scope
* IDCS = Oracle Identity Cloud Service
34. 34
CDI extensions
• HikariCP data sources
• Oracle UCP data sources
• Jedis clients
• OCI Object Storage clients
• Java Transaction API (JTA) objects
Java Persistence API (JPA)のサポート
• JDBC Driver (DataSource) +
JTA Extension +
Hikari Connection Pool Extension +
EclipseLink JPA Extension
データの永続化/キャッシュが必要な場合に便利な機能
CDI extension = CDIのライフサイクルイベントを受け取って独自の実装を追加するための仕様
JPA = Javaオブジェクトをデータベースに永続化するための仕様
JTA (Java Transaction API) = トランザクションを管理するための仕様
Helidon MP
JDBC Driver
Java Transaction API
EclipseLink (JPA)
EntityApp
Hikari Connection Pool
application.yaml
persistence.xml
Helidon MPによるJPA/JTAサポート
35. 35
gRPCのサーバー&クライアント実装を簡単に開発できる
SE、MP両エディションでサポート
• SE – リアクティブ・スタイル
• MP – POJO + アノテーション
• 従来からのProtobufサービス/スタブも利用可能
ペイロード・タイプは Protocol Buffers と Java Serialization をサポート
Security, Metrics, Health Check機能を提供
もちろんRESTサービスと共存(サーバー・ポートは別)
※現在はExperimentalのステータス
gRPC のサポート
gRPCとは?
• CNCF(Cloud Native Computing Foundation)のインキュベーション・プロジェクト
• マイクロサービス間で効率的な通信を実現するためのしくみ
@RpcService(name = "helloworld.Greeter")
@ApplicationScoped
public class GreeterService{
@Unary(name = "SayHello")
public HelloReply sayHello(HelloRequest req) {
return HelloReply
.newBuilder()
.setMessage("Hello " + req.getName())
.build();
}
} Helidon MPのコーディング例
protocでコンパイルした
メッセージオブジェクト
36. 36
HTTP/2を利用したRPC(Remote Procedure Call)フレームワーク
• バイナリ・フレーム、双方向ストリーミング
データ・シリアライゼーションにProtocol Buffersを使用*
• (Jsonに比較して)転送データ量の削減
IDL(Interface Definition Language)によるスキーマ定義
• Polyglot環境におけるインターオペラビリティ向上
gRPC の仕組み
出典: What is gRPC?
https://www.grpc.io/docs/guides/
*gRPCでは他のシリアライゼーション方式も利用可能
→ HelidonはProtocol BuffersとJava Serializationをサポート
IDL
言語依存
コード
.proto
protoc
コンパイラ
C/C++, C#, Dart, Go, Java, Node.js,
Objective-C, PHP(Beta), Python, Ruby
37. 37
Demo : Helidonで作るフロントエンド・アプリケーション
* Oracle JET = Oracle JavaScript Extension Toolkit
Open ID
Connect
REST / gRPC
Static Contents
ブラウザ
Oracle Identity Cloud Service (IDCS)
IDCSの提供するログイン画面
user
scope
Envoy
gRPC
Proxy
REST
(port: 8081)
Helidon
OIDC
Provider
JPA/JTA
Extension
Autonomous
Transaction
Processing
JDBC
gRPC Server
Demo Server App
gRPC
(port: 50051)
gRPC-Web
Oracle JET
Single Page App
39. 39
2020年2月5日に最初のマイルストーン・ビルド 2.0.0-M1 をリリース!
Roadmap - Helidon 2.0
Open Operating Systems
Cloud Native Environment
Java Microservices
Public Cloud Private Cloud
Hybrid Application and Environment
Management
Java 11 (Java 8サポートの終了)
Helidon MP GraalVM native image のサポート
HTTP Multipart / Reactive HTTP Client / Websocket
Helidon DB Client
MicroProfile Reactive Streams Operators
MicroProfile Reactive Messaging
• Kafkaコネクタの提供
コマンド・ライン・インターフェース
ライブ・リローディング
Verrazzanoのサポート
40. 40
Rancherによるマルチ・クラスタ管理
アプリケーション・ライフサイクル管理
• Model - アプリケーションを記述
• Binding – Modelを環境にバインド
統合化された監視と管理
• モニタリング、ロギング
• ダッシュボード、アラート
分散トレーシング
• Kiali, Jaeger, Istio
CI/CD - GitLab, Jenkins等の利用
組み込みのセキュリティ機能
Roadmap - Verrazzano
Production ClusterDevelopment & Test Cluster
Open Operating Systems
Public Cloud Private Cloud Hybrid Cloud
43. 43
Getting Started (公式ドキュメント とりあえず動かしてみる)
• https://helidon.io/docs/latest/#/guides/01_overview
Helidon MPのMicroProfile対応+拡張機能を一通り網羅したデモ
• https://github.com/oracle-japan/ochacafe-microprofile-demo
MicroProfile の詳細解説 (OCHaCafeのMicroProfileセッション資料)
• http://tiny.cc/ochacafe-mp-slide
Oracle Cloud Hangout Cafe (通称OCHaCafe – Cloud Native な勉強会、是非お越しを!)
• https://ochacafe.connpass.com
Helidonについてさらに詳しく知りたい・触りたい方は…
Notes de l'éditeur オラクルクラウドを使ったソリューションの提案や展開を担当
デファクトスタンダードなクラウド技術に焦点をあてた勉強会「おちゃかふぇ」やってます
Connpassのページ覗いて下さい、資料やtwitterのまとめのリンクがありますので、雰囲気わかってもらえると思います
次回は 2/28 OCHaCafe Premium :クラウド・アプリケーションのパフォーマンス
$300の無料トライアルあります、Always Freeといって一生ただで使えるサービスもあります。
cloud.oracle.comからどうぞ 本日のアジェンダ
セッションのアブストはMicroProfile押しで書いていたんですが、HelidonのMicroProfile対応の部分はHelidonの一部分でしかないので、本日はもうすこしHelidonの全体感をつかんでいただくように説明していきたいと思います。
まず最初に皆さんと認識のベースを合わせるために、マイクロサービス構築の構築に求められるフレームワーク側の要件ってどういうものなのかというお話をさせていただきます。
セッションのアブストはMicroProfile押しで書いていたんですが、そもそもHelidonって何よってところと、HelidonにはSEとMPの二つのエディションがあるので、その違いを最初にお話しをしてから、MPの方に話を進めていきたいと思います。
さらに、Helidonが備えているMicroProfile以外の機能についてお話をしたのち、最後のまとめをお話します。 まず、Helidoの具体的な話に入る前に、 マイクロサービスに対する認識にはかなり個人差があると思いますので、まずは少なくともこのセッションの時間で皆さんと共有する「マイクロサービスってこんなもの」 という認識合わせをして、そこから「マイクロサービスを構築するために使われる開発フレームワークの要件」みたいなものを考えていきたいと思います。
そこで引っ張り出してきたのが、古典といってもいいでしょう、James Lewis/Martin Fowler による「microservices」というWebの記事です。そこには「The microservice architectural style」ということで、マイクロサービスに特徴的なアーキテクチャの要素が列挙されています。
。。。
という風に、マイクロサービスとして一般的に語られている特徴が端的にまとまっているのではないでしょうか?
で、これをひも解くと、次のような要件がマイクロサービス・フレームに求められるはずです。
。。。
はい、ではここからHelidonがこうした要件を果たして満たしているのかどうかをみていきましょう。 オープンソース、一周年
Javaライブラリの集合体
アプリケーションをHelidonのライブラリと一緒にビルドして、デプロイするスタイル
出来上がるものはJava SE VMで動作するアプリケーションと思っていい
Maven/Gradleのような一般的なビルドツールを使える
普通のJava SEアプリと同様、そのままOS上に動かしてもいいし、Dockerイメージにもできるし、Kubernetesに載せることもできる
Helidonには SEとMPという ふたつのエディションがあります。
ざっくりいうと、SEの方が超軽量、最近トレンドのリアクティブなフレームワークをベースにしています。
また、後述しますが、GraalVMを使ってネイティブ・イメージを作成できます。
MPは、SEをベースにして、Eclipse MicroProfileという規格に準拠したフレームワークの機能を提供します。
機能的にもSEよりリッチですし、これまでJava EEで開発をしてきた方には取り組みやすいフレームワークと言えます。 ライセンス
Apache 2.0
コミュニティ・サポート
Slack、StackOverflow、GitHub Issues
商用サポート
Helidonは最初に Reactive Web Server、Config、Security の 3つの機能の提供から始まりました。
ベースとなるサーバー機能は、Java Non-blocking IOをベースにしたNettyというフレームワークの上に、Reactive Streams APIを使ったシンプルな関数型のルーティングモデルを構築しています。これによって
・少ないスレッドで多くのコネクションをハンドルすることができたり
・メモリー管理やコンテキスト・スイッチ等のオーバーヘッドを少なくしたり でき、
マイクロサービス・フレームワークに期待される要件を叶えています。
--
をベースにしています。
ちなみに他の多くのマイクロサービス系フレームワークも同様にNettyを採用していると思います。
このノンブロッキングIOをベースにしたリアクティブなアーキテクチャによって、
少ないスレッドで多くのコネクションをハンドルすることができたり
メモリー管理やコンテキスト・スイッチ等のオーバーヘッドを少なくしたり でき、
マイクロサービス・フレームワークに期待される要件を叶えています。
---
Java NIO API
ノン・ブロッキングI/O
少ないスレッドで多くのコネクションをハンドル
メモリー管理やコンテキスト・スイッチ等のオーバーヘッドを著しく削減
I/Oが無い場合、スレッドは他のタスクを実行可能
Netty
ローレベルなAPIであるJava NIOを汎用的に利用可能にしたフレームワーク
非同期&イベント・ドリブン
Flow = Reactive Streams
ノン・ブロッキングなバックプレッシャー(流量)制御で非同期ストリーム処理をおこなうための標準仕様 実際のサーバーのコーディングは、このような感じです。
非常にシンプルに関数型のコーディングスタイルで書くことができます
ご覧いただいているコードは、若干無理しているところもある感じですが、
(public static void main)の中の1ステートメントでWebサーバーの実装と
起動ができるくらいのシンプルさです。 Helidon SEの一つの特長は、GraalVMのネイティブイメージを作成できる点です。
(次ページに移って、もどる)
なぜ、GraalVMのnative imageがそんなに注目されるのか その背景にはマイクロサービス特有の要件があるから。
すなわち K8s上で速やかにかつ多くのインスタンスをスケールアウトしたり、FaaSでも 同じく 急速なトラフィック増加に対応したスケールアウトやコールドスタート時の時間短縮が求められるケースなどです。
なので、起動時間の短縮や、メモリー使用量の削減が重要な要件となります
スライド右側にHelidon HotSpot mode(JITコンパイラモード)とnative imageの比較があります 起動時間が劇的に短縮されていたり、メモリーのフットプリントが大きく減っているのがご覧いただけると思います
--
(まとめ)このようにHelidon SEはGraalVMと組み合わせることによって、特にマイクロサービスに特徴的なユースケースにおいて、大きなメリットを生み出します GraalVMにはいろいろな側面があって一言で特徴を言い表すのがむつかしいのですが、分かりやすい機能としては
1. 新しいJavaで書かれたJITコンパイラを提供している
2. AOTコンパイレーションという技術を使って、事前にマシン語にコンパイルしたネイティブイメージを作成できる
GraalVMはオープンソースのCEと優れたパフォーマンスを提供する有償サポート版のEEがある
EEはオラクルクラウドをご利用いただくお客様には無償で利用いただけます
--
GraalVMはnative imageを作るほかにもいろいろな機能を提供しています
通常のJava SEからGraalVMに置き換えていただくと、GraalVMの提供する新しいJITコンパイラが威力を発揮して、おおよそ10~15%程度のパフォーマンス向上が見込まれるという結果がでています
https://llvm.org/devmtg/2016-01/slides/Sulong.pdf
Helidon MP
今週、ちょうど ご存じの方はご存じとおもいますが、
MicroProfile準拠(compatible)とは何なんのかというかなり本質的な点に関して熱い議論がtwitter上でやられていまして、ここでは深入りしませんが、ここで申し上げておきたいのは、HelidonはMicroProfile完全準拠です。 (MicroProfile …)をざっくり説明
もともとの始まりは、Java EEをマイクロサービス・アーキテクチャのために最適化させた軽量版仕様
Java EEにはFull Profile, Web Profileという言葉があるが、それと同じ文脈だったと思います。
ビジネスロジックを実装してRESTサービスとして公開するための主要機能に加えて
1)CNCFで標準化されているような標準のJava実装のためのAPI
2)マイクロサービスのデザインパターンやベストプラクティスを共通化して実装するためのAPI
これらをフレームワークとしてまとめたもの
開発者はビジネスロジックに集中できる
ベンダ独自仕様に縛られるようなロックインを回避できる
--
Java EE/Jakarta EEと何が違うかというと、生態系が違うという感じ
MPは、小さなサービスがたくさんあって、しかもいろいろな実行系・言語の混在状態であるような環境の中で動作することが前提になっている MicroProfileの1.0が2016年にリリースされたころはまさに右側にあるJavaEEの一部( CDI、JAX-RS、JSON-P)を切り出しただけの仕様だったが
年月を経るにつれ、左側にあるマイクロサービス標準に準拠した仕様が増えてきて、現在はバージョン3.2
Java EE由来の仕様は、主にビジネスロジックをRESTサービスとして提供するために必要なコアの機能を提供
一方、左側のMP固有の仕様は、
マイクロサービスに関連するオープン仕様(Open XX) や
マイクロサービス構築の際に用いられるデザインパターンやベストプラクティスの類を規定としたもの が
中心となっている
で、Helidon MPの中身がどうなっているか
MicroProfileに準拠した仕様はもちろん
MicroProfileには含まれていないが、アプリケーション開発にとって重要なJava EEの機能の一部(JPA/JTA データ永続化にかかわる仕様)を取り入れ
さらに、gRPCのような今後メジャーとなっていくであろう標準への対応を先取りして提供している
Helidonの各種機能は、個々モジュールとしてライブラリ化されているので、ビルド時に必要なライブラリだけ依存関係に入れてビルドすればよい。
REST APIのロジックを実装する部分の話
Java EEから必要十分な仕様を持ってきていて、わかりやすく非常に強力な開発フレームワークになっている。
Java EEにJAX-RSというRESTアプリケーションを開発するための仕様があるが、これは普通のJavaのクラス(プロパティとメソッドをもったクラス)にアノテーションをつけるだけで、RESTサービス化することができる。
さらに、RESTはJsonフォーマットのデータをやりとりするが、そのあたりもJSON-Bという機能を使って、Javaオブジェクトにバインディングされるので、Jsonデータを直接扱う必要はない(あつかってもいいけど – JSON-P) 注目仕様として3つ上げました
なぜ、この3つかかというと、全て外部のエージェント/サービスと連携してシステムのリジリエンシーやオブザーバビリティの向上に寄与する類のもので、まさにマイクロサービス的だといえるからです。 次はHealth Check機能です。
単純にそのサーバーが生きているかどうか、準備OKかどうかをyes/noの二択で答える機能です。
デフォルトの状態だとHelidonは
Liveness – cpu使用率、ヒープ空き容量、デッドロックの有無
Readiness – 特になし、つねにUP
HealthCheckインターフェースの実装クラスにLivenessもしくはReadinessのアノテーションをつけます、簡単。
Stateをtrueで返すかfalseで返すかで、状態をコントロールします この機能を実際にどう使うかということですが、様々な監視モジュールやエージェントがこのパスのRESTをたたいてヘルスチェックを行うことができる
KuberenetesにはLivenessProbeとReadinessProbeというのがあって、この仕組みをばっちり使うことができる
200 OK
503 Service Unavailable
システムの健全性を測定するための情報を取得するための仕様
ヘルスチェックとは異なる目的…
取得する情報は3つのスコープがあり
-MPが必ず実装しないといけないbaseスコープ
-MPベンダーが任意に実装するvendoerスコープ
-アプリケーションが自ら定義するapplicationスコープ
だいたいのものは、baseとvendorでかなりカバーできていると思う。さらに、Helidonであれば、CircuitBreakerの設定を行うと自動的にapplicationスコープのmetricsをエクスポーズしたりしあす。
Java EEではJMXという標準仕様があって、かっちりしたエコシステムが出来上がっていると思うが、
残念ながらJava EE/SEの世界に閉じたもので、マイクロサービスが前提としているPolyglotな世界で、NonJavaのアプリケーションとの共存は難しい、…
ということで、マイクロサービス環境でJavaに閉じない共通的な監視情報提供を行うためのMetricsの仕様を定義している
HelidonからエクスポーズされるMetricsは、Prometheus/Grafanaのようなツールを使って可視化することができます
/work/Prometheus/promd.sh
/work/Grafana/start.sh
Prometheus: http://base.oci.kotegawa.com:9090
Grafana: http://base.oci.kotegawa.com:3000
mvn exec:java アプリケーション独自のメトリクスを取得する方法について
いろいろやり方はあるが、一番簡単なのは、
Methodにアノテーションをつけると、自動的にそのメソッドのMetricsを取得することができる
Metrics専用のオブジェクトをインジェクトして、プログラム的にオブジェクトを更新する
このサンプルでは,,, @Metered をつけると、メソッドが呼ばれるたびにメーターがカウントされる
totalというCounterオブジェクトがIngectされているが、blue()/Green()が呼ばれるたびにインクリメントされるようになっているので、この例ではtatalはblue()とGreen()のメソッドが呼ばれた合計値を表していることになる。
右のグラフは、そのメトリクスをGrafanaで可視化したもの 分散トレーシング: 分散されたシステムで処理されるリクエストを追跡(トレーシング)するためのもの
マイクロサービスのような複数のサービスで構成されるシステム(分散システム)では、1つのリクエストが複数のサービスをまたいで処理されることにより、リクエスト全体の処理の流れを把握する(トレーサビリティ)ことが難しくなります。
トレーサビリティが低下することによって障害やリクエストのレイテンシーが悪化した際に、どのサービスに問題があるのかを見つけることも難しくなります。
このような問題をサービスの依存関係やサービス単位のレイテンシーを可視化することによって解決の手助けをするシステムを分散トレーシングシステムといいます。
OpenTracing: …
MicroProfile OpenTracingはOpenTracing準拠の分散トレーシングのためのAPIを提供しますが、その大きな特徴はJAX-RSで実装したRESTサービスは何もしなくてももれなくトレーシング機能がついてくるということです。すなわち…
理解を助けるための補足ですが、OpenTracingではトレースの単位をスパンで定義します。コール・ツリーの形で観ていくとスパンからスパンへの呼び出しの関係が左側のように表現でき、時系列で表現すると右のように階層型に重なっていくように表現できる では、ここでOpenTracingが実際どのように動いて、可視化できるのか、デモをお見せしたいと思います
Oracle Cloudで提供しているmanaged k8s環境であるOracle Container Engine for Kubernetes (OKE)の
Kubernetesクラスタの上に、Helidonのポッドを4個デプロイして相互にRESTサービスを呼び合うようなリクエストを送ってみたいと思います。同時にJaegerのポッドをデプロイして、4つのHelidonのトレース情報がこのJaegerに集まるようにします。
これで、実際にJaegerでどう見えるかを確認してみましょう。
---
ここでのポイントは、
プログラムは一切にトレーシングについては、コーディングをしていない
HelidonがHTTPのレベル、セキュリティのレベル、メソッドのレベルでトレーシング情報を自動で出している
JAX-RSアプリケーションは追加的なコードを必要としないので、Helidonのデモでも、まったく何もしなくてもメソッドレベルのspanが表示されていたが、さらにコーディングで独自のスパンを定義することが可能
ここでは、JPAでデータベースをアクセスするSpanを定義している、JPAのコールの前後でスパンの開始・終了をコーディングしておけば、このスライドでみえるように、JPAの実行時間や付随する情報をトレースすることが可能
ということで、MicroProfileに関するお話はここまでにして、
これからはHelidonが提供している拡張機能について説明していきます。
SEもMPもMicroProfileに必要な最低限の機能は提供していますが、現実世界で実用的なエンタープライズレベルのアプリケーションを作ろうと思った場合、セキュリティ機能やトランザクション機能のようなサポートが必要になります。
Helidonがこのあたりを、どうサポートしているのか、見ていきましょう。 まず、セキュリティの部分ですが、Helidonは認証、認可に関するいろいろな機能をプロバイダという形で提供しています。
- HTTP系の各種認証機能
- MPにも規定がある、JWTを使った認可機能
- 外部のIdPと連携する方式としては、Google Login用の認証プロバイダやOpen ID Connect標準を使った認証プロバイダ
- さらには、Oracle Identity Cloud ServiceのグループとRoleをマッピングする機能を提供しています
ABAC – attribute based access control マイクロサービスとトランザクションに関しては多くの議論がある分野だと思いますが、
マイクロサービス間はともかく、単一のマイクロサービス内で行われる単一データソースに対するローカルトランザクションのニーズは相変わらず高いと思いますし、特にデータベースに対するデータ操作やコミットの制御、さらにコネクションのプーリングによるパフォーマンスの向上などは、必須の機能と思いますし、MicroProfileの規定にない部分でもある。
Helidon MPは、JPA/JTAというJava EE/Jakarta EE標準のAPIをサポートします
コネクションプールとして、Hikari CPとOracle UCPが使えます
その他、
キャッシュサーバーの機能を提供するRedis用のクライアントや、Oracle CloudのObject Storage用のクライアントを提供しています
---
実用に耐えるアプリケーションを書くとき、データをどこかに永続化したり、キャッシュしたりすることが必ず必要になる。
マイクロサービスは結果整合性や補償トランザクションという考え方が一般的ですが、これは一般的には複数のマイクロサービス間でおこなわれるトランザクションについての議論だと考えています。
拡張機能の最後は、gRPCに関してです
gRPCはご存じの方もいらっしゃると思いますが、
CNCF(Cloud Native Computing Foundation)のインキュベーション・プロジェクトのひとつで、
マイクロサービス間で効率的な通信を実現するためのしくみです。
(いったん次のページに行って、戻ってくる)
gRPCは現在はExperimentalという位置づけですが、SEでもMPでもサポートしています。
特徴としては、SEとMPでRESTサーバーのコーディングスタイルが違ったように、gRPCも各々の特徴を活かしたコーディングスタイルになっています。SEはリアクティブ・スタイル、MPはJAX-RSのgRPC版といってもいいようなアノテーションを使ったシンプルなコーディング・スタイルになっています。
Helidonオリジナルのプログラミングモデルの他にも、従来からあるProtocでコンパイルして生成したJavaのスタブや抽象クラスを使って作成されたサービス実装などは、変更することなくHelidonのgRPCサーバーに統合することができます
もう一つ、特徴的なのは、扱うことのできるペイロードのタイプです。一般的にはprotocol buffersという伝送効率が高く特定の言語に依存しないデータフォーマットを使うのですが、Helidonはそれに加えてJavaシリアライゼーションフォーマットも使えます。もっともJavaシリアライゼーションの形式はJava同志の通信でしか利用できませんので、どちらかというとプロトタイピング用途(つまり、さくっと何か試したいときにIDLコンパイラとか使わずにさくっと実装したいような場合)と思っていただいた方がよいと思います。
さらに、Helidonを使ったときの特典といえるものとして、Security, Metrics, Health といった付加機能をRESTと同様gRPCについても使えるようになっています。
なぜgRPCへの期待が高まっているか
まず第一にベースとなるプロトコルがHttp2であること
http/1.1と違って、バイナリフレームを利用し、双方向ストリーミングも対応できます。
gRPCにもストリーミング形式のメッセージの送受信が規定されいる
第二に、データ形式にProtocol Buffersを使っていること
送信データをProtocol Buffersでシリアライズしてバイナリに変換させるため、送信データ量が少なくなり高速になります。
このProtocol Buffersで送受信されるメッセージのスキーマは
IDLというスキーマ定義言語で記述されます
このIDLスキーマをprotocコンパイラを使って、使用する言語用にコンパイルすると、その言語での実装に必要なメッセージデータの定義や送受信に必要なスタブなどが生成され、これを使ってプログラミングしてきます
シリアライズで高速化
送信データをProtocol Buffersでシリアライズしてバイナリに変換させるため、送信データ量が少なくなり高速になります。
HTTP/2で高速化
gRPCを使えば、プログラマは意識することなくHTTP/2を利用できます。これまでの主流であったHTTP1.1(REST-API)とHTTP/2の比較は下記資料で詳細かつ分かりやすくまとめられています。
では、拡張機能を使ったデモをご覧いただきましょう。
Helidonはバックエンドのマイクロサービスを実装するためのフレームワークという前提でお話をしてきましたが、普通にSpringBootやTomcat/MVCで作ったアプリレベルのものも普通につくれちゃいますよという意味もこめたデモをお見せします。
UIはReactでもVueでなんでもいいですが、今回はOrale JET Javascript Extension Kit を使ってSingle Page Applicationを作ってみました。JETは弊社のクラウドサービスの大多数のUIで使われてます。HelidonはフロントにスタティックコンテンツとAPIを提供するだけ。
で、お見せするのは、
最初に、Oracle Identity Cloud ServiceをIdPにしたOpen Connect IDベースのSSO、OAuth認証といったほうがわかりやすいかもしれません
次に、フロントのREST CallからJPA/STA extentionを経由してAutonomous Transaction Processing データベース。自律型データベースと呼ばれています。CPUのコア数とストレージのサイズだけ指定したら、数分後にインスタンスが立ち上がって、あとはチューニングも要らないオートスケールもしてくれるOracle DBのサービスです。
で、3つめはgRPCなんですが、gRPCのGetting Startedに出てくるHello Worldサービスを、今回はブラウザから直接gRPCでcallしまおうということで、gRPC-WebというgRPCのJavascript実装を使って、ブラウザとHelidonの間をgRPCで接続しています。gRPC-Webも他の言語と同様、protoファイルをprotocでコンパイルすると、Javascriptのソースが生成されます。
HelidonのフロントにEnvoy proxyを置いて、通常のRESTサービス用のポートとgRPC用のポートに振り分けを行っています。このデモはもちろん全てOracle Cloudで動いています。
Javaでアプリケーションを書く場合、JSFに代表されるサーバーサイドでMVCをまわすイメージが強いと思いますが、そもそもHelidonはサーブレットすら提供していない。
HelidonはSPAのためのJavascript/スタイルシートを含むスタティック・コンテンツとAPIを提供することが仕事
で、このデモ、何ができるかというと、超シンプルで
左側、国際電話の国コードのデモ – JPA/JTAでデータベースアクセスをコーディング、JPAの下にはコネクションプールも実装されている
右側、gRPC Quick Startで出てくる簡単な文字列の送受信、(無理やりgRPCのメッセージ送受信を見せたいために)gRPC-WebというJavascript実装を使って、ブラウザと
手順)
プライベートブラウジング
ログインシーケンスの解説
ネットワークモニタを開く
REST
gRPC
ついでに/openapi /metrics /health も見せよう
Helidon MPでもGraalVMのnative imageの作成ができるようになります
CDIの参照実装であるWeldをカスタマイズしたものを使っていて、native imageを作成できますけどCDI compatibleです。native imageをビルドする際に標準的なCDIのアプローチを使ってCDIの依存性を解決しています。
Helidon DB Client – ノンブロッキング、リアクティブなDBアクセス、Java SEでリアクティブ処理を行うためのFlow API(Publisher/Subscriber)を使った実装、JDBCとMongoDBをサポート
Reactive Streams Operators /Reactive Messaging などのリアクティブ処理を実現するMicroProfileのオプショナル仕様のサポートと、さらにKafka Connectorの提供
CLIを使ってプロジェクトライブラリの依存関係の管理やデプロイターゲット毎(Docker imageやnative image)のビルド作業を効率化してくれる
Verrazzano という聞きなれない言葉がでてきました – Oracleがこれからリリースする新しいソリューションの名前です。
---
CDI Extentionの実装方法について一つ注意点があります。CDIの起動シーケンスがnative imageのビルド時と実行時に分かれるため、ビルド時に接続する先のシステムの接続を確認したりするようなことはできません。
One of these restrictions is how a CDI extension behaves - the CDI startup sequence is separated - everything until deployBeans happens at build time, everything else (validateBeans, endInitialization) at runtime of the image.
Verrazzanoは、Helidonと並行して進められているOSSプロジェクトです。
マイクロサービスのライフサイクルを考えた場合、様々な切り口(CI/CD、耐障害性、可観測性やロギング)での考慮点があり、またその各々に適したソリューションが存在する。現在、非常にたくさんのオープンソースベースのソリューションがあって、それを組み合わせて一つのシステム体系にしていくのはエンドユーザーの責任となっているが、これを実現・維持していくのは実際かなりしんどい。
Verrazzanoは、上記のような最新のテクノロジートレンドを取り入れ、オンプレミスやマルチクラウド環境を横通しして包括的なアプリケーションの開発からデプロイ・監視までのライフサイクル管理を実現するソリューションを提供する。
RancherによるKubernetesのマルチクラスタ管理
yamlを使ったアプリケーションと周辺サービスの宣言的定義
Prometes,Grafanaでの監視、Elastic stackを使ったログ管理
KeycloakでID&アクセス管理
冒頭、マイクロサービス・フレームワークの要件についてお話をしましたが、このセッションを通じて、Helidonがクラウドネイティブ時代にふさわしいマイクロサービス・フレームワークであると皆さんに感じていただけたら幸いです。