SlideShare a Scribd company logo
1 of 78
Eclipse MicroProfile と Helidon MP
OCHaCafe Season 2 - #4
Cloud Native時代のモダンJavaの世界
Senior Director
Oracle Corporation Japan
December 19th, 2019
Tadahisa Kotegawa
2
The following is intended to outline our general product direction. It is intended for information purposes
only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code,
or functionality, and should not be relied upon in making purchasing decisions. The development, release,
timing, and pricing of any features or functionality described for Oracle’s products may change and
remains at the sole discretion of Oracle Corporation.
Statements in this presentation relating to Oracle’s future plans, expectations, beliefs, intentions and
prospects are “forward-looking statements” and are subject to material risks and uncertainties. A detailed
discussion of these factors and other risks that affect our business is contained in Oracle’s Securities and
Exchange Commission (SEC) filings, including our most recent reports on Form 10-K and Form 10-Q
under the heading “Risk Factors.” These filings are available on the SEC’s website or on Oracle’s website
at http://www.oracle.com/investor. All information in this presentation is current as of September 2019 and
Oracle undertakes no duty to update any statement in light of new information or future events.
Safe harbor statement
3
古手川 忠久
日本オラクル株式会社 クラウドソリューション推進本部
(英語名: Cloud Pursuit)
自己紹介
OCHa Cafeの紹介記事です!
https://codezine.jp/article/detail/11762
CodeZine: 「クラウドネイティブ時代の技術
が学べる「OCHaCafe」とは?~注目の多言
語対応ランタイムGraalVMの勉強会に潜入」
@tkotegaw
tkote
oracle-japan
4
5
4
3
2
1
まとめ
Helidon MP が提供する MicroProfile 以外の機能
MicroProfile 詳説
MicroProfile の概要と Helidon MP
Program agenda
5
https://github.com/oracle-japan/ochacafe-microprofile-demo
本日のデモのソースはこちら
1. JDKをセットアップ
2. Gitをセットアップ
3. Mavenをセットアップ
4. あとは、以下のコマンドをたたけば動きます
git clone https://github.com/oracle-japan/ochacafe-microprofile-demo.git
cd ochacafe-microprofile-demo
mvn compile exec:java
6
ところで、Javaって難しい言語ですか?
ググってみた…
(苦笑…)
「Javaは他のメジャーなプログラミング言語と比較して複雑です」
「『下手なプログラミング』を行うと目も当てられないような状態になります」
「JavaとC言語は個人ビジネスには向いていません」
「Java言語を扱う企業にブラック企業が多いと言われ...」
7
MicroProfile の概要 と Helidon MP
8
The MicroProfile is a baseline platform definition that optimizes
Enterprise Java for a microservices architecture and delivers
application portability across multiple MicroProfile runtimes.
(訳)
MicroProfileはエンタープライズJavaをマイクロサービス・アーキテクチャの
ために最適化させたベースラインとなるプラットフォーム定義で、複数の
MicroProfileランタイム間のポータビリティを提供するものです。
What is the MicroProfile?
https://microprofile.io/faq/ より抜粋
9
PolyglotなMicroservices環境のなかで協調して動く(= Microservices各種標準に
準拠する、 Microservicesのデザインパターンを実装する)Javaアプリケーショ
ンの開発に必要な機能を、フレームワークとして規定したもの。
開発者はビジネスロジックの実装に集中でき、効率的な開発ができる。
基盤となる実装は、MicroProfileプロバイダの品質維持・向上を期待できる。
MicroProfile: 自分なりの言葉で表現すると…
OpenMetrics
OpenTracing
OpenAPI Circuit
Breaker
Bulk Head
Health
Check
10
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
Eclipse MicroProfile 3.2 (Nov. 1st, 2019)
CDI 2.0
Common Annotations 1.3
JAX-RS 2.1
JSON-B 1.0
JSON-P 1.1
Java EE 8 由来MicroProfile 固有
11
OSS プロジェクト
Microservicesを開発するためのJavaライブラリの集合体
単体のJVMとして動作。アプリケーションサーバー不要
従来からの一般的なツールで開発できる(Java SE, Maven, Docker, Kubernetes, etc.)
2つのプログラミングモデル
• Helidon MP: 宣言的な記法、Java EE開発者フレンドリー
• Helidon SE: 関数型の記法
Eclipse MicroProfile実装(MP)
Oracle Cloudとのインテグレーション(将来的に実装される予定)
Project Helidon
※ Helidonは ギリシア語でつばめ(swallow)を意味します
Helidon は1.4.0(Nov. 22nd, 2019)でMicroProfile 3.2に対応!
12
Helidonのポジショニング
Full Stack
MicroProfile based
Microframeworks
Helidon MP
Helidon SE
13
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のサポートについて
Hybrid Application and Environment Management
Copyright © 2019 Oracle and/or its affiliates.
Hybrid Applications in Hybrid Environments
Oracle Enterprise Java Vision – AppDev Platform
Open Operating Systems
Cloud Native Environment
Java Microservices Polyglot microservicesTraditional Applications
Public Cloud Private Cloud Hybrid Cloud
Operators
15
色々ご意見あると思いますが…
Helidon (MicroProfile) と WebLogic Server (Java EE) の使い分け
Web Front
Proxy Server
Browser
Database
WebLogic Server
servlet
MVC
JDBC
WLS
JTA
JMS
global transaction
management
Web Front
Proxy Server
API GW
Browser
Mobile App
IoT
DatabaseHelidon
JAX-RS
SPA/MVVC
JDBC
Microservices
REST
Client
JAX-RS
Java EE
MicroProfile
WLS
ajax
etc.
Static
contents
EJB
global transaction
management
Outer Systems
(often XA resources)
16
とりあえず Quickstart MPから
https://helidon.io/docs/latest/#/guides/03_quickstart-mp
書いてある通りにMavenプロジェクトを作って動かしていけば、以下のようなことができる
• サンプルコードのコンパイル/パッケージングと実行
• Dockerイメージの作成 (Dockerの動作環境が必要)
• Kubernetesクラスタへのデプロイ (Kubernetesクラスタとkubectlツールが必要)
一通り感覚をつかんだら、MicroProfile関連のHelidonドキュメントに目を通す
https://helidon.io/docs/latest/#/microprofile/01_introduction
GitHubも覗いてみる – https://github.com/oracle/helidon
• examplesディレクトリに各種コードあり
helidon.io
Helidon MP の始め方
17
MicroProfile 詳説
18
REST APIのインターフェースとロジック実装のための基本部分
CDI, Common Annotations, JAX-RS, JSON-B, JSON-P
@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
JAX-RS –The Java API for RESTful Web Services
RESTfulを実装するAPIセット
Plain Old Java Object(POJO)をアノテーションによって修飾
歴史
• Oracleがスペックリード
• 2008年: JAX-RS 1.0 (JSR 311) リリース - Java EE 6 (JSR 316)
• 2013年: JAX-RS 2.0 (JSR 339) リリース - Java EE 7 (JSR 342)
• 2018年: JAX-RS 2.1 (JSR 370) リリース - Java EE 8 (JSR 366)
JAX-RS実装
• Jersey (リファレンス実装), RESTEasy, Apache CXF, etc.
19
20
(超ざっくり言うと)
コンポーネント間の依存性注入(DI)とそのスコープ(ライフサイクル)を管理する
依存性注入(DI)
• (超ざっくり言うと)ダイナミックなオブジェクト参照を可能にすること
Contexts and Dependency Injection (CDI)
@Inject @ConfigProperty(name = “echo.reply", defaultValue = "Hi!")
private String reply;
ソースにはreply(参照型の変数)を初期化している箇所は無い
CDIコンテナが実行(デプロイ)時にいい感じにオブジェクトを差し込んでくれる
21
Java API for JSON Processing (JSON-P)
• オブジェクト・モデルAPI
- メモリー内でJSONデータを示すツリーを作成
• ストリーミング・モデルAPI
- 要素を読み取るイベント・ベースのパーサーを使用
Java API for JSON Binding (JSON-B)
• JavaオブジェクトとJSONの相互変換(バインディング)を行う
JavaのJSON処理標準
22
アプリケーションの定義情報を設定・取得するためのMP全般にわたる統一的仕様
設定情報(複数指定可能)
• システム・プロパティ (優先順位=400)
• 環境変数 (優先順位=300)
• /META-INF/microprofile-config.properties (優先順位=100, config_ordinalで変更可)
• ConfigSourceインターフェースの実装クラス(優先順位=任意)
• ConfigSourceProviderインターフェースの実装クラス(優先順位=任意)
MicroProfile Config
com.acme.myproject.someserver.url = http://some.server/some/endpoint
com.acme.myproject.someserver.port = 9085
com.acme.myproject.someserver.active = true
com.acme.other.stuff.name = Karl
com.acme.myproject.notify.onerror=karl@mycompany,sue@mcompany
some.library.own.config=some value
基本コレ
microprofile-config.propertiesを上書きできる
23
MicroProfile Config – 使用例
@ApplicationScoped
public class InjectedConfigUsageSample {
@Inject
private Config config;
@Inject @ConfigProperty(name="myprj.some.url")
private String someUrl;
@Inject @ConfigProperty(name="myprj.some.port")
private Optional<Integer> somePort;
@Inject @ConfigProperty(name="myprj.some.dynamic.timeout", defaultValue="100")
private javax.inject.Provider<Long> timeout;
@Inject @ConfigProperty(name="myPets") private String[] myArrayPets;
@Inject @ConfigProperty(name="myPets") private List<String> myListPets;
@Inject @ConfigProperty(name="myPets") private Set<String> mySetPets;
}
myPets=dog,cat,dog,cat
{“dog”, “cat”, “dog,cat”}
24
文字列からターゲットのクラス型への変換
MicroProfile Config – Converter
種類 説明
Built-in • boolean and Boolean : “true”, “1”, “YES”, “Y” “ON” の場合 true (case insensitive)
• int and Integer
• long and Long
• float and Float
• double and Double
• Class: Class.forName で生成されるクラス
Custom Converterインターフェースの実装クラス
Array Built-in/Custom Converterの配列への変換: デリミタ=, エスケープ=
Automatic クラスTのオブジェクトが以下のいずれかの方法で生成できる場合
T.of(String)
T.valueOf(String)
new T(String)
T.parse(CharSequence)
25
REST APIロジック作成 基本部分全部入り - JAX-RS, CDI, Config, JSON-P, JSON-B
/echo
Demo
26
耐障害性の高いMicroservicesシステム構築のための仕様
メソッドやクラスにアノテーションを付与して、障害発生時の振る舞いを設定する
• 実装の仕組みは CDI Interceptor と同じ
MicroProfile Fault Tolerance
アノテーション 機能
Timeout メソッド実行が指定の時間に達した場合、例外(TimeoutException)を発生させる
Retry メソッド実行の例外発生時、一定時間/回数処理を繰り返す
Fallback メソッド実行の例外発生時、代替メソッドを呼び出す
CircuitBreaker 例外発生が繰り返されるメソッドの実行を一時的に止めて、メソッドの処理を行う
前に例外(CircuitBreakerOpenException)を発生させる
Bulkhead メソッドの同時実行数や(非同期実行の際の)待機キューの長さが指定の数を超え
た場合、例外(BulkheadException)を発生させる
Asynchronous メソッド実行を非同期(別スレッド)で行う
27
メソッド or クラス にannotationを指定
Timeout発生時、TimeoutException をthrowする
@Fallback, @CircuitBreaker, @Asynchronous, @Bulkhead, @Retryと併せて利用可能
MicroProfile Fault Tolerance – @Timeout
@Timeout(400) // timeout is 400ms
public Connection serviceA() {
Connection conn = null;
counterForInvokingServiceA++;
conn = connectionService();
return conn;
}
parameter 説明 デフォルト
Value タイムアウト時間 1000
unit タイムアウト時間の単位
(java.time.temporal.ChronoUnit)
MILLIS
28
メソッド or クラス に
annotationを指定
@Fallback, @CircuitBreaker,
@Asynchronous, @Bulkhead, @Timeout
と併せて利用可能
MicroProfile Fault Tolerance – @Retry
/**
* jitterの変動値は-400ms~400msなので、リトライ間隔は0-800ms
* 最低でも4回リトライするが、10回を超えてリトライはしない
*/
@Retry(delay = 400, maxDuration= 3200, jitter= 400, maxRetries = 10)
public Connection serviceA() {
return connectionService();
}
parameter 説明 デフォルト
maxRetries 最大リトライ回数 3
delay リトライ間隔 0
delayUnit 間隔時間の単位(java.time.temporal.ChronoUnit) MILLIS
maxDuration 最大遅延時間 180000
durationUnit 遅延時間の単位 MILLIS
jitter リトライ変動値 200
jitterDelayUnit 変動時間の単位 MILLIS
retryOn リトライを実施する例外クラス Exception.class
abortOn リトライを中止する例外クラス
29
エラー時の代替処理指定方法1: FallbackHandlerクラスを指定する
MicroProfile Fault Tolerance – @Fallback
@Retry(maxRetries = 1)
@Fallback(StringFallbackHandler.class)
public String serviceA() {
counterForInvokingServiceA++;
return nameService();
}
public interface FallbackHandler<T>{
T handle(ExecutionContext context);
}
FallbackHandler インターフェース
Public class StringFallbackHandler
implements FallbackHandler {
public String handle (ExecutionContext context) {
…
}
}
返り値の型は同じにする
java.lang.reflect.Method getMethod​()
java.lang.Object[] getParameters​()
呼び出されたメソッドとパラメータを取得可能
30
エラー時の代替処理指定方法2: 代替メソッドを指定する
• Annotateされたクラスからメソッドとして呼び出せること
• 同じ型のパラメータ、返り値であること
MicroProfile Fault Tolerance – @Fallback (cont.)
@Retry(maxRetries = 2)
@Fallback(fallbackMethod = "fallbackForServiceB")
public String serviceB() {
counterForInvokingServiceB++;
return nameService();
}
private String fallbackForServiceB() {
return "myFallback";
}
31
継続的な障害に対し、速やかにエラーを返すことによりレイテンシの増加や余分なリ
ソース消費を回避する
3つの状態 “Closed” “Open” “Half-Open”
MicroProfile Fault Tolerance – @CircuitBreaker
Closed
Open
Half-
Open
requestVolumeThreshold
& failureRatio
delay
successThreshold
<< fails >>
正常な状態
異常な状態 不安定な状態
32
@Fallback, @Retry,
@Asynchronous, @Bulkhead,
@Timeout
と併せて利用可能
MicroProfile Fault Tolerance – @CircuitBreaker (cont.)
parameter 説明 デフォルト
failOn 指定された例外を失敗とみなす(複数可) Throwable.cla
ss
delay サーキットがOpenからHalf-Openに移る時間 5000
delayUnit 間隔時間の単位
(java.time.temporal.ChronoUnit)
MILLIS
requestVolumeThreshold ローリング・ウィンドウとなる連続した
リクエスト数 >= 1
20
failureRatio サーキットをOpenにする失敗率 0 < x < 1 0.5
successThreshold サーキットがCloseに移るための閾値 >= 1 1
/**
* ローリング・ウィンドウとなる連続した4回の呼び出しのうち3回(4xfailureRatio=0.75)が失敗した場合
* サーキットはOpenとなる。サーキットは1,000msecの間Openの状態を保ったのちHalf-Openに遷移し、
* 以降10連続呼び出しが成功した場合にClosedとなる。そうでない場合は再びOpenに戻る。
*/
@CircuitBreaker(successThreshold = 10, requestVolumeThreshold = 4,
failureRatio = 0.75, delay = 1000)
public Connection serviceA() { … }
33
特定のサービスに発生した障害の影響がカスケード的に全体に波及するのを防ぐ
セマフォ・スタイルとスレッドプール・スタイル
MicroProfile Fault Tolerance – @Bulkhead
// 最大5同時リクエストを許可
@Bulkhead(5)
public Connection serviceA() {
Connection conn = null;
counterForInvokingServiceA++;
conn = connectionService();
return conn;
}
// 最大5同時&待機キューに最大8リクエストを許可
@Asynchronous
@Bulkhead(value = 5, waitingTaskQueue = 8)
public Future<Connection> serviceA() {
Connection conn = null;
counterForInvokingServiceA++;
conn = connectionService();
return CompletableFuture
.completedFuture(conn);
}
セマフォ・スタイル スレッドプール・スタイル
34
リクエストの処理を別スレッドで行う
Future もしくは CompletionStage を返す (java.util.concurrent パッケージ)
• 処理が完了するまで未完了のステータス – 両者で振る舞いが異なる
• 耐障害性を考えると Future よりも CompletionStage が好ましい
MicroProfile Fault Tolerance – @Asynchronous
@Asynchronous @Retry
public Future<Connection> serviceA() {
CompletableFuture<U> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException("Failure"));
return future;
}
@Asynchronous @Retry
public CompletionStage<Connection> serviceA() {
CompletableFuture<U> future = new CompletableFuture<>();
future.completeExceptionally(new RuntimeException("Failure"));
return future;
}
Retryは
トリガーされる
Retryは
トリガーされない
35
Configでパラメーターのオーバーライトや無効化が可能
* Configだけで新規にFault Tolerance を設定できる訳ではないので注意
• classname/methodname/annotation/parameter (メソッドレベル)
• classname/annotation/parameter (クラスレベル)
• annotation/parameter (システムレベル)
• classname/methodname/annotation/enabled=false (有効/無効)
• classname/annotation/enabled=false (有効/無効)
• annotation/enabled=false (有効/無効)
MicroProfile Fault Tolerance – Configによる制御
com.acme.test.MyClient/serviceA/Retry/maxDuration=3000
com.acme.test.MyClient/Retry/maxRetries=100
Retry/maxRetries=30
com.acme.test.MyClient/methodA/CircuitBreaker/enabled=false
com.acme.test.MyClient/CircuitBreaker/enabled=true
CircuitBreaker/enabled=false
36
Istioのようなサービスメッシュに任せる?
• サイドカー・パターン
• 言語非依存、実装と設定を完全分離
• コントロールプレーンから環境全体をコントロール可能
• Fault Toleranceの他にも様々な機能を提供する
• 稼働プロセスが2倍、故障可能ポイントも2倍?、導入にはそれなりの気合が必要そう…
MicroProfile Fault Toleranceは?
• MicroProfile 縛りだが、Java VMが稼働する環境であればどこでも使える
• 中央集権的なコントロールプレーンは無い(良く言えば不要)、個々に設定必要
• Annotationを使うことによってソース内でビジネスロジックの実装からフォルトトレラン
スの設定を分離している
• Config(環境変数、-Dオプション)を使ってデプロイ時点で設定の制御も可能
Fault Tolerance はどこで実現すべきか?
Service A Service B
Envoy Envoy
Istio control plane
pod pod
37
Bulkhead & Circuit Breaker - Circuit Breakerの状態遷移を確認する
/ft
Demo
38
Kubernetesなどノードの状態を検査するプロセスに対してヘルスチェック情報を提供する
MicroProfile Health
@Liveness
@Readiness
public class MyCheck implements HealthCheck {
public HealthCheckResponse call() {
...
}
}
Annotation Path Function
@Liveness /health/live Liveness
@Readiness /health/ready Readiness
@Health /health (Deprecated) Liveness + Readiness
@ApplicationScoped
class MyChecks {
@Produces @Liveness
HealthCheck check1() { … }
@Produces @Readiness
HealthCheck check2() { … }
}
CDIを使ってmethodを分けるパターン
39
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
40
Health Check と Kubernetes Liveness Probe の組み合わせ
/health
Demo
41
RESTfulの認証スタイルに沿ったAPIの必要性
• ステートレス - セキュリティの状態はCookie等を使用せずリクエスト毎に送られる
• 軽量で相互運用性のあるトークンを使って認証情報をサービス間で伝搬する
MP JWT Authentication
• JSON Web Tokensのインターフェス - org.eclipse.microprofile.jwt.JsonWebToken
• Java EE/MicroProfile APIとのマッピング、インテグレーション
JSON Web Tokens(JWT) https://tools.ietf.org/html/rfc7519
MicroProfile JWT Authentication
GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer mF_9.B5f-4.1JqM
HTTPのAuthorizationヘッダに ”Bearer <JWT>” を設定して
認証情報をサーバーに渡すよくあるパターン
42
(参考) Json Web Token
[ヘッダ]
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb3UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS8pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
[ペイロード(クレームセット)] [シグナチャ]
{
"typ": "JWT",
"alg": "RS256",
"kid": "abc-1234567890"
}
{
"iss": "https://server.example.com",
"aud": ["s6BhdRkqt3"],
"exp": 1311281970,
"iat": 1311280970,
"sub": "24400320",
"upn": "jdoe@server.example.com",
"groups: ["red-group", "green-group", "admin-group"],
"roles": ["auditor", "administrator"],
"jti": "a-123",
"auth_time": 1311280969,
"preferred_username": "jdoe",
"acr": "phr",
"nbf": 1311288970
}
ヘッダとペイロードを
署名したもの
イメージ
43
org.eclipse.microprofile.jwt パッケージ
• JsonWebToken インターフェース
• java.security.Principal の拡張インターフェース
• getXXX(), getClaim(String claimName)
• Claims 列挙型
• 個々のクレームの説明とJava型を保持する
JAX-RSでの認証方式の指定(web.xmlのlogin-config相当のもの)
MicroProfile JWT Authentication - API
import org.eclipse.microprofile.annotation.LoginConfig;
@LoginConfig(authMethod = "MP-JWT", realmName = "TCK-MP-JWT")
@ApplicationPath("/")
public class TCKApplication extends Application {
・・・
}
44
CDI Injection
MicroProfile JWT Authentication - API (Cont.)
@Path("/endp")
@DenyAll
@RequestScoped
public class RolesEndpoint {
@Inject
private JsonWebToken callerPrincipal;
...
@RequestScoped
public class MyEndpoint {
@Inject
@Claim(standard=Claims.iat)
private Long issuedAt;
...
JsonWebTokenを
インジェクト
Claimの個々の値
をインジェクト
45
JAX-RS APIとのインテグレーション #1
MicroProfile JWT Authentication - API (Cont.)
@Provider @Auth
public class BasicAuthFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext context) throws IOException {
SecurityContext securityContext = context.getSecurityContext();
JsonWebToken jwt = (JsonWebToken)securityContext.getUserPrincipal()
if(!securityContext.isUserInRole("admin")){
... JsonWebToken
オブジェクトを返す
46
JAX-RS APIとのインテグレーション #2
• @DenyAll – どのセキュリティロールもアクセス不可
• @RolesAllowed – 指定したロールのみアクセス可能
• @PermitAll – 全てのロールがアクセス可能
MicroProfile JWT Authentication - API (Cont.)
@Path(value="/addresses") @PermitAll
public class AddressBookResource {
@GET @Produces(value="text/plain")
public String getList() { ... }
@PUT @RolesAllowed(“Administrator”)
public void updateList(String books) { ... }
}
どのセキュリティ
ロールでもアクセス可能
“Administrator”ロール
のみアクセス可能
JWTの”groups”クレーム
とのマッピングを行う
このクラスのデフォルト
アクセスレベルを指定
47
Helidonの提供するSecurity Providerを試す
/security
Demo
48
• 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
49
Oracle Integration Cloud Serviceと連携してユーザー認証&認可を行う
Demo 1 - OIDC (Open ID Connect) Authentication Provider
+ IDCS Role Mapping Provider
こちらも参考にして下さい!
https://www.slideshare.net/oracle4engineer/ochacafe5
IDCS
Helidon
Open ID
Connect
Sequence
/security/idcs/login
Cookie
Browser
scope
user
group
50
@RolesAllowed を使ってエンドポイント毎の認可を設定する
Demo 2 - HTTP Basic Authentication
Browser
Endpoint Roles allowed Permitted Users
/security/basic/public <anonymous> <everyone>
/security/basic/guest <logged-in users> John, Mary, Ken
/security/basic/user user John, Mary
/security/basic/admin admin John,
Helidon
application.yaml
GitHubのソースは
こちらの設定です
51
Metrics = システムの健全性を測定するために使用される指標
既存JMX(Java Management Extensions)標準はJVMを前提
- Polyglot環境では不向き
Polyglot環境に適したモニタリングを可能にする
ヘルスチェックとは異なる目的
• 長期的なトレンドの把握
• キャパシティ・プラニング、潜在的問題の早期把握
• スケジューリング・システムと連動したスケーリング
MicroProfile Metrics
52
以下の3種類のスコープが存在
RESTエンドポイント
MicroProfile Metrics
スコープ 説明
base 全てのMicroProfile実装で提供しなければいけないメトリクス
vendor ベンダ独自のメトリクス (optional)
application アプリケーション独自のメトリクス (optional)
Endpoint Request Type Supported Format Description
/metrics GET JSON, OpenMetrics 全ての登録されているメトリクスを返す
/metrics/<scope> GET JSON, OpenMetrics 当該スコープに登録されているメトリクスを返す
/metrics/<scope>/<metric_name> GET JSON, OpenMetrics 当該スコープ・名前に一致するメトリクスを返す
/metrics OPTIONS JSON 全ての登録されているメトリクスのメタデータを返す
/metrics/<scope> OPTIONS JSON 当該スコープに登録されているメトリクスのメタデータを返す
/metrics/<scope>/<metric_name> OPTIONS JSON 当該スコープ・名前に一致するメトリクスのメタデータを返す
HTTP request のAccept: ヘッダで切り替え
53
メタデータ
メトリック・タイプ (詳細は、org.eclipse.microprofile.metrics パッケージのJava Doc参照)
MicroProfile Metrics
メタデータ 説明
name メトリックの名前
unit メトリックの単位
type メトリックのタイプ (下表参照)
description (optional) メトリックの説明
displayName (optional) メトリックの表示名
reusable (optional) 同じMetric IDの下で複数回メトリックを登録できるか
タイプ 説明 例
counter 単調に増加していく数値 受信リクエスト数の合計
concurrent gauge 漸進的に増減する数値 メソッド呼び出しの並列度
gauge サンプルされた数値 CPU温度 / ディスク使用量
meter 平均スループット、1/5/15分の指数加重移動平均スループット
histogram 数値の分布
timer 継続時間の集計値、継続時間の統計、スループットの統計
54
Helidonの例(/metrics)
MicroProfile Metrics – OpenMetrics Text Format
# TYPE base_cpu_availableProcessors gauge
# HELP base_cpu_availableProcessors Displays the number of processors available to the Java virtual machine...
base_cpu_availableProcessors 2
# TYPE vendor_requests_count_total counter
# HELP vendor_requests_count_total Each request (regardless of HTTP method) will increase this counter
vendor_requests_count_total 12
# TYPE vendor_requests_meter_total counter
# HELP vendor_requests_meter_total Each request will mark the meter to see overall throughput
vendor_requests_meter_total 12
# TYPE vendor_requests_meter_rate_per_second gauge
vendor_requests_meter_rate_per_second 0.05411739326125853
# TYPE vendor_requests_meter_one_min_rate_per_second gauge
vendor_requests_meter_one_min_rate_per_second 0.12177241397420359
# TYPE vendor_requests_meter_five_min_rate_per_second gauge
vendor_requests_meter_five_min_rate_per_second 0.21843631434845615
# TYPE vendor_requests_meter_fifteen_min_rate_per_second gauge
vendor_requests_meter_fifteen_min_rate_per_second 0.32275102524669447
Meterを表す
55
application スコープのメトリックを登録・公開することが可能
2種類の方法
• Annotationを使う方法
• プログラマティカル&動的に作成する方法
Annotationを使う方法 – いろいろな方法あり
MicroProfile Metrics – Application Metrics
Annotation Constructor Field Method Parameter Type(Class) 説明
@Counted O O O
@ConcurrentGauge O O O
@Gauge O
@Metered O O O
@Timed O O O
@Metric O O O Fieldで使用できるのはMeter, Timer, Counter,
Histogram
Gaugeが使用できるのはProducer method
か field
56
MicroProfile Metrics – Example: Annotation
package oracle.demo.metrics;
@ApplicationScoped @Path("/mpmetrics")
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(); }
}
57
MicroProfile Metrics – Example: Metrics
# TYPE application_oracle_demo_metrics_MetricsResource_blue_total counter
# HELP application_oracle_demo_metrics_MetricsResource_blue_total
application_oracle_demo_metrics_MetricsResource_blue_total 10
# TYPE application_oracle_demo_metrics_MetricsResource_blue_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_blue_rate_per_second 0.0948144020926388
# TYPE application_oracle_demo_metrics_MetricsResource_blue_one_min_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_blue_one_min_rate_per_second 0.11031275087245901
# TYPE application_oracle_demo_metrics_MetricsResource_blue_five_min_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_blue_five_min_rate_per_second 0.030672989003081328
# TYPE application_oracle_demo_metrics_MetricsResource_blue_fifteen_min_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_blue_fifteen_min_rate_per_second 0.010806905605177459
# TYPE application_oracle_demo_metrics_MetricsResource_green_total counter
# HELP application_oracle_demo_metrics_MetricsResource_green_total
application_oracle_demo_metrics_MetricsResource_green_total 9
# TYPE application_oracle_demo_metrics_MetricsResource_green_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_green_rate_per_second 0.08533204569172652
# TYPE application_oracle_demo_metrics_MetricsResource_green_one_min_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_green_one_min_rate_per_second 0.1265310936101765
# TYPE application_oracle_demo_metrics_MetricsResource_green_five_min_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_green_five_min_rate_per_second 0.028990958652981156
# TYPE application_oracle_demo_metrics_MetricsResource_green_fifteen_min_rate_per_second gauge
application_oracle_demo_metrics_MetricsResource_green_fifteen_min_rate_per_second 0.009886502441084419
# TYPE application_oracle_demo_metrics_MetricsResource_total counter
# HELP application_oracle_demo_metrics_MetricsResource_total
application_oracle_demo_metrics_MetricsResource_total 19
パッケージ名 クラス名 メトリック名
メソッド名がメトリック名になる
58
Application Scope Metrics – コーディングから Prometheus - Grafanaによるビジュアライズまで
/mpmetrics
Demo
59
Demo – Helidon & Prometheus & Grafana
PrometheusGrafana Helidon
/metrics
/mpmetrics/blue
/mpmetrics/green
application scope の
メトリクスをテスト
https://grafana.com/ https://prometheus.io/
メトリクスの監視・集計メトリクスの可視化
60
OpenAPI = RESTfulなAPIを記述するメタモデルの標準仕様
JAX-RS + MP OpenAPI Annotationで OpenAPI v3ドキュメントを生成
• org.eclipse.microprofile.openapi.annotations パッケージ
MicroProfile OpenAPI
@GET
@Path("/findByStatus")
@Operation(summary = "Finds Pets by status",
description = "Multiple status values can be provided with comma separated strings")
public Response findPetsByStatus(...) { ... }
/pet/findByStatus:
get:
summary: Finds Pets by status
description: Multiple status values can be provided with comma separated strings
operationId: findPetsByStatus
Java Source
OpenAPI Spec
61
JAX-RS + MicroProfile OpenAPI Annotation
さらに、Configを使ってドキュメント生成を制御できる
APIを使ってOpenAPIのmodel treeを生成することも可能
MicroProfile OpenAPI – ドキュメント生成の仕組み
こちらも参考にしてください!
https://www.slideshare.net/oracle4engineer/ochacafe6-apiここにアクセスすれば何もしなくても
とりあえずのAPIの構成は出てくる
62
/openapi を眺めてみる (OCHaCafe APIの回のおさらい)
/country
Demo
63
分散トレーシングのためのAPIを提供
既存の分散トレーシング・システムと統合し、マイクロサービス環境の一部として機能
OpenTracing (opentracing.io) を前提
JAX-RSアプリケーションは追加的なコードを必要としない
• SpanContextは受信したリクエストから自動的に取り出される
• Spanはリクエストを受信時に自動的にスタートし、リクエスト処理時に終了する
• リクエスト送信時、自動的にSpanContextを挿入する/ Spanを開始し、完了後終了する
- Client: (1) javax.ws.rs.client.Client(設定処理要) と (2) MicroProfile Rest Client (デフォルト有効)
分散トレーシングとは?
• マイクロサービス環境で複数のサービスを経由して処理されるリクエストのサービス間の依存
関係やレイテンシーを可視化し、障害発生時の解析を容易にする
MicroProfile OpenTracing
64
(参考)The OpenTracing Data Model
https://opentracing.io/specification/
65
JaegerによるSpanのトラッキング
/tracing
Demo
https://www.jaegertracing.io/
OSSの分散トレーシングシステム
Demo - JaegerによるSpanのトラッキング
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)
トレース情報
66
67
Demo - JaegerによるSpanのトラッキング (Cont.)
[
{
"endpoint" : "http://helidon-demo-mp-1:8080/tracing/invoke",
"orders" : []
},
{
"endpoint" : "http://helidon-demo-mp-2:8080/tracing/invoke",
"orders" : [
{
"endpoint" : "http://helidon-demo-mp-3:8080/tracing/invoke",
"orders" : [
{
"endpoint" : "http://helidon-demo-mp-1:8080/tracing/invoke",
"orders" : []
}
]
},
{
"endpoint" : "http://helidon-demo-mp-0:8080/tracing/invoke",
"orders" : []
}
]
}
]
mp-1
mp-2
mp-3
mp-1
mp-0
mp-0
リクエスト json リクエストの流れ
68
JAX-RS REST Client API
• Java EE仕様に含まれるJavaベースのREST Client仕様
• JSON-Bを使ったJson – POJO バインディングが可能
• Filterを使った柔軟な動作カスタマイズが可能
MicroProfile REST Client API
• REST Clientを作成する新たなAPI
• RESTfulサービスをタイプ・セーフに呼び出す方法を提供
• RestClientBuilderがエントリーポイント
- サービス・インターフェースを実装したオブジェクトをビルドする
- javax.ws.rs.core.Configurableをextendsしているので、ここからカスタマイズ可能
MicroProfile REST Client
69
MicroProfile Rest Client (Cont.)
REST API用
インターフェース
Server 実装
(JAX-RS)
Client 実装
(MP Rest Client)
@Path("/movies")
public interface MovieReviewService {
@POST
@Path("/{movieId}/reviews")
String submitReview(
@PathParam("movieId") String movieId,
Review review
);
}
URI apiUri = new URI("http://...");
MovieReviewService reviewSvc =
RestClientBuilder.newBuilder()
.baseUri(apiUri)
.build(MovieReviewService.class);
Review review = new Review(3, “Not bad");
reviewSvc.submitReview( movieId, review );
implements
builds
70
単一Interfaceからサーバー、クライアント双方をタイプセーフに作成する
/restclient
/movies
Demo
Demo – Rest Client
Browser
Helidon
GET /restclient
MP Rest Client
<< interface >>
MovieReviewService
MovieReviewServiceResource
POST /movies implements
builds
71
GET /restclient/1/submit-review?star=5&comment=great!
You submitted a review for movie [id=1,tiele=JOHN WICK: CHAPTER 2] as review [id=0,star=5,comment=great!]
[request]
[response]
{
star: 5
comment: “great!”
}
72
Helidon MP が提供する MicroProfile 以外の機能
Helidon MP が提供する MicroProfile 以外の機能
The gRPC Microprofile API
というHelidon MP上でgRPCサーバー/
クライアントをAnnotationを使って
簡単に実装する機能がありますが、
今回はバッサリ割愛します…
73
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) = トランザクションを管理するための仕様
74
/country のJPA版
/jpa/country
Demo
Helidon MP
H2 database (in memory)
H2 JDBC Driver
Java Transaction API
EclipseLink (JPA)
EntityApp
Hikari Connection Pool
application.yaml
persistence.xml
GET/POST/PUT/DELETE
75
まとめ
76
単なる「JavaでREST APIを書くためのフレームワーク」ではない
• Microservices環境に適したアプリケーションを効率的に作成できる
MicroProfileベンダーが必要な実装の大部分を提供するので(だからフレームワーク…)
開発者はビジネスロジックの開発に専念できる
• 放っておいても、Metrics、Health、OpenAPIなどはデフォルトで提供してくれる
多くの実績の中で育まれたJavaのエコシステムを活用できる
• IDE、ライブラリ、モニタリング・プロファイリング・デバッギング、etc.
• GraalVMの活用(native image化は克服すべき課題あり → Quarkusの取り組み)
MicroProfileを使う理由
Helidonという素敵なMicroProfile実装がある!
77
ご清聴ありがとうございました!
OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界

More Related Content

What's hot

企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)オラクルエンジニア通信
 
API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細
API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細
API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細オラクルエンジニア通信
 
OracleのCloud Native 戦略/ソリューションの特徴
OracleのCloud Native 戦略/ソリューションの特徴OracleのCloud Native 戦略/ソリューションの特徴
OracleのCloud Native 戦略/ソリューションの特徴オラクルエンジニア通信
 
[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...
[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...
[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...オラクルエンジニア通信
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るオラクルエンジニア通信
 
Oracle Database Appliance 2.9 アップデート及びパッチ管理について
Oracle Database Appliance 2.9 アップデート及びパッチ管理についてOracle Database Appliance 2.9 アップデート及びパッチ管理について
Oracle Database Appliance 2.9 アップデート及びパッチ管理についてオラクルエンジニア通信
 
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0オラクルエンジニア通信
 
Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)
Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)
Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)オラクルエンジニア通信
 
【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]
【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]
【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]オラクルエンジニア通信
 
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版][old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]オラクルエンジニア通信
 
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]オラクルエンジニア通信
 
Oracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデートOracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデートオラクルエンジニア通信
 
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニックオラクルエンジニア通信
 
Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日)
Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日) Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日)
Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日) オラクルエンジニア通信
 

What's hot (20)

企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
企業システムで使えるマイクロサービスの特長と実践 (Oracle Cloudウェビナーシリーズ: 2021年4月15日)
 
API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細
API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細
API Gateway - ヘッダー/クエリー変換、認証・認可機能詳細
 
20200527 oracle cloud infrastructure data science
20200527 oracle cloud infrastructure data science20200527 oracle cloud infrastructure data science
20200527 oracle cloud infrastructure data science
 
OracleのCloud Native 戦略/ソリューションの特徴
OracleのCloud Native 戦略/ソリューションの特徴OracleのCloud Native 戦略/ソリューションの特徴
OracleのCloud Native 戦略/ソリューションの特徴
 
[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...
[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...
[Modern Cloud Day Tokyo 2019] Oracle Functions = サーバーレス × Dockerコンテナ:AWS Lamb...
 
Big Data Service Overview 2020年7月版
Big Data Service Overview 2020年7月版Big Data Service Overview 2020年7月版
Big Data Service Overview 2020年7月版
 
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語るOracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
Oracle jdk 20190827 - 今、あらためてOracle提供のJDKを語る
 
[旧版]OCI Data Integration Overview 2020年7月版
[旧版]OCI Data Integration Overview 2020年7月版[旧版]OCI Data Integration Overview 2020年7月版
[旧版]OCI Data Integration Overview 2020年7月版
 
Oracle Database Appliance 2.9 アップデート及びパッチ管理について
Oracle Database Appliance 2.9 アップデート及びパッチ管理についてOracle Database Appliance 2.9 アップデート及びパッチ管理について
Oracle Database Appliance 2.9 アップデート及びパッチ管理について
 
Oracle no sql database cloud service overview202007
Oracle no sql database cloud service overview202007Oracle no sql database cloud service overview202007
Oracle no sql database cloud service overview202007
 
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
Oracle GoldenGate 19c を使用した 簡単データベース移行ガイド_v1.0
 
Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)
Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)
Oracle Database: リリースモデルとアップグレード・パッチ計画 (2021年2月版)
 
【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]
【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]
【旧版】Oracle Autonomous Database Cloud サービス紹介資料 [2020年/3月版]
 
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版][old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
[old] Oracle Container Engine for Kubernetes (OKE) ご紹介 [2020年7月版]
 
Oracle GoldenGate 概要 2020年11月版
Oracle GoldenGate 概要 2020年11月版Oracle GoldenGate 概要 2020年11月版
Oracle GoldenGate 概要 2020年11月版
 
Oracleが提供するマイクロサービス開発環境
Oracleが提供するマイクロサービス開発環境Oracleが提供するマイクロサービス開発環境
Oracleが提供するマイクロサービス開発環境
 
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
 
Oracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデートOracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデート
 
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
【より深く知ろう】活用最先端!データベースとアプリケーション開発をシンプルに、高速化するテクニック
 
Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日)
Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日) Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日)
Oracle Cloud の セキュリティ・コンプライアンス 最新情報(Oracle Cloudウェビナーシリーズ: 2020年7月16日)
 

Similar to OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界

20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)
20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)
20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)オラクルエンジニア通信
 
MySQLドキュメントストアとCTE
MySQLドキュメントストアとCTEMySQLドキュメントストアとCTE
MySQLドキュメントストアとCTEyoyamasaki
 
20190825_MySQL ServerだけじゃないMySQL Shellもあるんです
20190825_MySQL ServerだけじゃないMySQL Shellもあるんです20190825_MySQL ServerだけじゃないMySQL Shellもあるんです
20190825_MySQL ServerだけじゃないMySQL ShellもあるんですMachiko Ikoma
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1オラクルエンジニア通信
 
20161119 java one-feedback_osaka
20161119 java one-feedback_osaka20161119 java one-feedback_osaka
20161119 java one-feedback_osakaTakashi Ito
 
【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]
【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]
【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]オラクルエンジニア通信
 
[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...
[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...
[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...オラクルエンジニア通信
 
20191015 oracle beyondstudy
20191015 oracle beyondstudy20191015 oracle beyondstudy
20191015 oracle beyondstudyMai Nagahisa
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかChihiro Ito
 
20150920 中国地方db勉強会
20150920 中国地方db勉強会20150920 中国地方db勉強会
20150920 中国地方db勉強会yoyamasaki
 
20191015 beyondstudy oracle_nagahisa
20191015 beyondstudy oracle_nagahisa20191015 beyondstudy oracle_nagahisa
20191015 beyondstudy oracle_nagahisabeyond Co., Ltd.
 
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...オラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデートOracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデートオラクルエンジニア通信
 

Similar to OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界 (20)

20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)
20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)
20200424 Oracle Big Data Jam Session #2 登壇資料(Data Flow)
 
MySQLドキュメントストアとCTE
MySQLドキュメントストアとCTEMySQLドキュメントストアとCTE
MySQLドキュメントストアとCTE
 
[旧版]OCI Data Catalog Overview 2021年2月版
[旧版]OCI Data Catalog Overview 2021年2月版[旧版]OCI Data Catalog Overview 2021年2月版
[旧版]OCI Data Catalog Overview 2021年2月版
 
[旧版]OCI Data Integration Overview 2020年6月版
[旧版]OCI Data Integration Overview 2020年6月版[旧版]OCI Data Integration Overview 2020年6月版
[旧版]OCI Data Integration Overview 2020年6月版
 
[旧版]OCI Data Integration Overview 2021年2月版
[旧版]OCI Data Integration Overview 2021年2月版[旧版]OCI Data Integration Overview 2021年2月版
[旧版]OCI Data Integration Overview 2021年2月版
 
20190825_MySQL ServerだけじゃないMySQL Shellもあるんです
20190825_MySQL ServerだけじゃないMySQL Shellもあるんです20190825_MySQL ServerだけじゃないMySQL Shellもあるんです
20190825_MySQL ServerだけじゃないMySQL Shellもあるんです
 
[旧版]Big Data Service Overview 2020年4月版
[旧版]Big Data Service Overview 2020年4月版[旧版]Big Data Service Overview 2020年4月版
[旧版]Big Data Service Overview 2020年4月版
 
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
しばちょう先生が語る!オラクルデータベースの進化の歴史と最新技術動向#1
 
Oracle APEX概要
Oracle APEX概要Oracle APEX概要
Oracle APEX概要
 
20161119 java one-feedback_osaka
20161119 java one-feedback_osaka20161119 java one-feedback_osaka
20161119 java one-feedback_osaka
 
[旧版]OCI Data Catalog Overview 2020年3月版
[旧版]OCI Data Catalog Overview 2020年3月版[旧版]OCI Data Catalog Overview 2020年3月版
[旧版]OCI Data Catalog Overview 2020年3月版
 
【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]
【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]
【旧版】Oracle Cloud Infrastructure:サービス概要のご紹介 [2020年4月版]
 
[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...
[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...
[Oracle Innovation Summit Tokyo 2018] Fn Project: Next Generation Serverless ...
 
20191015 oracle beyondstudy
20191015 oracle beyondstudy20191015 oracle beyondstudy
20191015 oracle beyondstudy
 
OCI Data Flow Overview 2020年3月版
OCI Data Flow Overview 2020年3月版OCI Data Flow Overview 2020年3月版
OCI Data Flow Overview 2020年3月版
 
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうかWebアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
Webアプリに低レイテンシ・高可用性を求めるのは間違っているのだろうか
 
20150920 中国地方db勉強会
20150920 中国地方db勉強会20150920 中国地方db勉強会
20150920 中国地方db勉強会
 
20191015 beyondstudy oracle_nagahisa
20191015 beyondstudy oracle_nagahisa20191015 beyondstudy oracle_nagahisa
20191015 beyondstudy oracle_nagahisa
 
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
 
Oracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデートOracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデート
 

More from オラクルエンジニア通信

Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデートOracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデートOracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデートOracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデートOracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデートOracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデートOracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデートOracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデートOracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデートOracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデートOracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデートOracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデートOracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデートOracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)オラクルエンジニア通信
 
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会オラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデートOracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデートOracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデートOracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデートオラクルエンジニア通信
 
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)オラクルエンジニア通信
 
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]オラクルエンジニア通信
 

More from オラクルエンジニア通信 (20)

Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデートOracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデートOracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデートOracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデートOracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデートOracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデートOracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデートOracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデートOracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデートOracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデートOracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデートOracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデートOracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデートOracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデート
 
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)
 
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
 
Oracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデートOracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデートOracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデートOracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
 
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
 
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
【旧版】Oracle Gen 2 Exadata Cloud@Customer:サービス概要のご紹介 [2021年12月版]
 

OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界

  • 1. Eclipse MicroProfile と Helidon MP OCHaCafe Season 2 - #4 Cloud Native時代のモダンJavaの世界 Senior Director Oracle Corporation Japan December 19th, 2019 Tadahisa Kotegawa
  • 2. 2 The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, timing, and pricing of any features or functionality described for Oracle’s products may change and remains at the sole discretion of Oracle Corporation. Statements in this presentation relating to Oracle’s future plans, expectations, beliefs, intentions and prospects are “forward-looking statements” and are subject to material risks and uncertainties. A detailed discussion of these factors and other risks that affect our business is contained in Oracle’s Securities and Exchange Commission (SEC) filings, including our most recent reports on Form 10-K and Form 10-Q under the heading “Risk Factors.” These filings are available on the SEC’s website or on Oracle’s website at http://www.oracle.com/investor. All information in this presentation is current as of September 2019 and Oracle undertakes no duty to update any statement in light of new information or future events. Safe harbor statement
  • 3. 3 古手川 忠久 日本オラクル株式会社 クラウドソリューション推進本部 (英語名: Cloud Pursuit) 自己紹介 OCHa Cafeの紹介記事です! https://codezine.jp/article/detail/11762 CodeZine: 「クラウドネイティブ時代の技術 が学べる「OCHaCafe」とは?~注目の多言 語対応ランタイムGraalVMの勉強会に潜入」 @tkotegaw tkote oracle-japan
  • 4. 4 5 4 3 2 1 まとめ Helidon MP が提供する MicroProfile 以外の機能 MicroProfile 詳説 MicroProfile の概要と Helidon MP Program agenda
  • 5. 5 https://github.com/oracle-japan/ochacafe-microprofile-demo 本日のデモのソースはこちら 1. JDKをセットアップ 2. Gitをセットアップ 3. Mavenをセットアップ 4. あとは、以下のコマンドをたたけば動きます git clone https://github.com/oracle-japan/ochacafe-microprofile-demo.git cd ochacafe-microprofile-demo mvn compile exec:java
  • 8. 8 The MicroProfile is a baseline platform definition that optimizes Enterprise Java for a microservices architecture and delivers application portability across multiple MicroProfile runtimes. (訳) MicroProfileはエンタープライズJavaをマイクロサービス・アーキテクチャの ために最適化させたベースラインとなるプラットフォーム定義で、複数の MicroProfileランタイム間のポータビリティを提供するものです。 What is the MicroProfile? https://microprofile.io/faq/ より抜粋
  • 10. 10 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 Eclipse MicroProfile 3.2 (Nov. 1st, 2019) CDI 2.0 Common Annotations 1.3 JAX-RS 2.1 JSON-B 1.0 JSON-P 1.1 Java EE 8 由来MicroProfile 固有
  • 11. 11 OSS プロジェクト Microservicesを開発するためのJavaライブラリの集合体 単体のJVMとして動作。アプリケーションサーバー不要 従来からの一般的なツールで開発できる(Java SE, Maven, Docker, Kubernetes, etc.) 2つのプログラミングモデル • Helidon MP: 宣言的な記法、Java EE開発者フレンドリー • Helidon SE: 関数型の記法 Eclipse MicroProfile実装(MP) Oracle Cloudとのインテグレーション(将来的に実装される予定) Project Helidon ※ Helidonは ギリシア語でつばめ(swallow)を意味します Helidon は1.4.0(Nov. 22nd, 2019)でMicroProfile 3.2に対応!
  • 13. 13 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. Hybrid Application and Environment Management Copyright © 2019 Oracle and/or its affiliates. Hybrid Applications in Hybrid Environments Oracle Enterprise Java Vision – AppDev Platform Open Operating Systems Cloud Native Environment Java Microservices Polyglot microservicesTraditional Applications Public Cloud Private Cloud Hybrid Cloud Operators
  • 15. 15 色々ご意見あると思いますが… Helidon (MicroProfile) と WebLogic Server (Java EE) の使い分け Web Front Proxy Server Browser Database WebLogic Server servlet MVC JDBC WLS JTA JMS global transaction management Web Front Proxy Server API GW Browser Mobile App IoT DatabaseHelidon JAX-RS SPA/MVVC JDBC Microservices REST Client JAX-RS Java EE MicroProfile WLS ajax etc. Static contents EJB global transaction management Outer Systems (often XA resources)
  • 16. 16 とりあえず Quickstart MPから https://helidon.io/docs/latest/#/guides/03_quickstart-mp 書いてある通りにMavenプロジェクトを作って動かしていけば、以下のようなことができる • サンプルコードのコンパイル/パッケージングと実行 • Dockerイメージの作成 (Dockerの動作環境が必要) • Kubernetesクラスタへのデプロイ (Kubernetesクラスタとkubectlツールが必要) 一通り感覚をつかんだら、MicroProfile関連のHelidonドキュメントに目を通す https://helidon.io/docs/latest/#/microprofile/01_introduction GitHubも覗いてみる – https://github.com/oracle/helidon • examplesディレクトリに各種コードあり helidon.io Helidon MP の始め方
  • 18. 18 REST APIのインターフェースとロジック実装のための基本部分 CDI, Common Annotations, JAX-RS, JSON-B, JSON-P @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
  • 19. JAX-RS –The Java API for RESTful Web Services RESTfulを実装するAPIセット Plain Old Java Object(POJO)をアノテーションによって修飾 歴史 • Oracleがスペックリード • 2008年: JAX-RS 1.0 (JSR 311) リリース - Java EE 6 (JSR 316) • 2013年: JAX-RS 2.0 (JSR 339) リリース - Java EE 7 (JSR 342) • 2018年: JAX-RS 2.1 (JSR 370) リリース - Java EE 8 (JSR 366) JAX-RS実装 • Jersey (リファレンス実装), RESTEasy, Apache CXF, etc. 19
  • 20. 20 (超ざっくり言うと) コンポーネント間の依存性注入(DI)とそのスコープ(ライフサイクル)を管理する 依存性注入(DI) • (超ざっくり言うと)ダイナミックなオブジェクト参照を可能にすること Contexts and Dependency Injection (CDI) @Inject @ConfigProperty(name = “echo.reply", defaultValue = "Hi!") private String reply; ソースにはreply(参照型の変数)を初期化している箇所は無い CDIコンテナが実行(デプロイ)時にいい感じにオブジェクトを差し込んでくれる
  • 21. 21 Java API for JSON Processing (JSON-P) • オブジェクト・モデルAPI - メモリー内でJSONデータを示すツリーを作成 • ストリーミング・モデルAPI - 要素を読み取るイベント・ベースのパーサーを使用 Java API for JSON Binding (JSON-B) • JavaオブジェクトとJSONの相互変換(バインディング)を行う JavaのJSON処理標準
  • 22. 22 アプリケーションの定義情報を設定・取得するためのMP全般にわたる統一的仕様 設定情報(複数指定可能) • システム・プロパティ (優先順位=400) • 環境変数 (優先順位=300) • /META-INF/microprofile-config.properties (優先順位=100, config_ordinalで変更可) • ConfigSourceインターフェースの実装クラス(優先順位=任意) • ConfigSourceProviderインターフェースの実装クラス(優先順位=任意) MicroProfile Config com.acme.myproject.someserver.url = http://some.server/some/endpoint com.acme.myproject.someserver.port = 9085 com.acme.myproject.someserver.active = true com.acme.other.stuff.name = Karl com.acme.myproject.notify.onerror=karl@mycompany,sue@mcompany some.library.own.config=some value 基本コレ microprofile-config.propertiesを上書きできる
  • 23. 23 MicroProfile Config – 使用例 @ApplicationScoped public class InjectedConfigUsageSample { @Inject private Config config; @Inject @ConfigProperty(name="myprj.some.url") private String someUrl; @Inject @ConfigProperty(name="myprj.some.port") private Optional<Integer> somePort; @Inject @ConfigProperty(name="myprj.some.dynamic.timeout", defaultValue="100") private javax.inject.Provider<Long> timeout; @Inject @ConfigProperty(name="myPets") private String[] myArrayPets; @Inject @ConfigProperty(name="myPets") private List<String> myListPets; @Inject @ConfigProperty(name="myPets") private Set<String> mySetPets; } myPets=dog,cat,dog,cat {“dog”, “cat”, “dog,cat”}
  • 24. 24 文字列からターゲットのクラス型への変換 MicroProfile Config – Converter 種類 説明 Built-in • boolean and Boolean : “true”, “1”, “YES”, “Y” “ON” の場合 true (case insensitive) • int and Integer • long and Long • float and Float • double and Double • Class: Class.forName で生成されるクラス Custom Converterインターフェースの実装クラス Array Built-in/Custom Converterの配列への変換: デリミタ=, エスケープ= Automatic クラスTのオブジェクトが以下のいずれかの方法で生成できる場合 T.of(String) T.valueOf(String) new T(String) T.parse(CharSequence)
  • 25. 25 REST APIロジック作成 基本部分全部入り - JAX-RS, CDI, Config, JSON-P, JSON-B /echo Demo
  • 26. 26 耐障害性の高いMicroservicesシステム構築のための仕様 メソッドやクラスにアノテーションを付与して、障害発生時の振る舞いを設定する • 実装の仕組みは CDI Interceptor と同じ MicroProfile Fault Tolerance アノテーション 機能 Timeout メソッド実行が指定の時間に達した場合、例外(TimeoutException)を発生させる Retry メソッド実行の例外発生時、一定時間/回数処理を繰り返す Fallback メソッド実行の例外発生時、代替メソッドを呼び出す CircuitBreaker 例外発生が繰り返されるメソッドの実行を一時的に止めて、メソッドの処理を行う 前に例外(CircuitBreakerOpenException)を発生させる Bulkhead メソッドの同時実行数や(非同期実行の際の)待機キューの長さが指定の数を超え た場合、例外(BulkheadException)を発生させる Asynchronous メソッド実行を非同期(別スレッド)で行う
  • 27. 27 メソッド or クラス にannotationを指定 Timeout発生時、TimeoutException をthrowする @Fallback, @CircuitBreaker, @Asynchronous, @Bulkhead, @Retryと併せて利用可能 MicroProfile Fault Tolerance – @Timeout @Timeout(400) // timeout is 400ms public Connection serviceA() { Connection conn = null; counterForInvokingServiceA++; conn = connectionService(); return conn; } parameter 説明 デフォルト Value タイムアウト時間 1000 unit タイムアウト時間の単位 (java.time.temporal.ChronoUnit) MILLIS
  • 28. 28 メソッド or クラス に annotationを指定 @Fallback, @CircuitBreaker, @Asynchronous, @Bulkhead, @Timeout と併せて利用可能 MicroProfile Fault Tolerance – @Retry /** * jitterの変動値は-400ms~400msなので、リトライ間隔は0-800ms * 最低でも4回リトライするが、10回を超えてリトライはしない */ @Retry(delay = 400, maxDuration= 3200, jitter= 400, maxRetries = 10) public Connection serviceA() { return connectionService(); } parameter 説明 デフォルト maxRetries 最大リトライ回数 3 delay リトライ間隔 0 delayUnit 間隔時間の単位(java.time.temporal.ChronoUnit) MILLIS maxDuration 最大遅延時間 180000 durationUnit 遅延時間の単位 MILLIS jitter リトライ変動値 200 jitterDelayUnit 変動時間の単位 MILLIS retryOn リトライを実施する例外クラス Exception.class abortOn リトライを中止する例外クラス
  • 29. 29 エラー時の代替処理指定方法1: FallbackHandlerクラスを指定する MicroProfile Fault Tolerance – @Fallback @Retry(maxRetries = 1) @Fallback(StringFallbackHandler.class) public String serviceA() { counterForInvokingServiceA++; return nameService(); } public interface FallbackHandler<T>{ T handle(ExecutionContext context); } FallbackHandler インターフェース Public class StringFallbackHandler implements FallbackHandler { public String handle (ExecutionContext context) { … } } 返り値の型は同じにする java.lang.reflect.Method getMethod​() java.lang.Object[] getParameters​() 呼び出されたメソッドとパラメータを取得可能
  • 30. 30 エラー時の代替処理指定方法2: 代替メソッドを指定する • Annotateされたクラスからメソッドとして呼び出せること • 同じ型のパラメータ、返り値であること MicroProfile Fault Tolerance – @Fallback (cont.) @Retry(maxRetries = 2) @Fallback(fallbackMethod = "fallbackForServiceB") public String serviceB() { counterForInvokingServiceB++; return nameService(); } private String fallbackForServiceB() { return "myFallback"; }
  • 31. 31 継続的な障害に対し、速やかにエラーを返すことによりレイテンシの増加や余分なリ ソース消費を回避する 3つの状態 “Closed” “Open” “Half-Open” MicroProfile Fault Tolerance – @CircuitBreaker Closed Open Half- Open requestVolumeThreshold & failureRatio delay successThreshold << fails >> 正常な状態 異常な状態 不安定な状態
  • 32. 32 @Fallback, @Retry, @Asynchronous, @Bulkhead, @Timeout と併せて利用可能 MicroProfile Fault Tolerance – @CircuitBreaker (cont.) parameter 説明 デフォルト failOn 指定された例外を失敗とみなす(複数可) Throwable.cla ss delay サーキットがOpenからHalf-Openに移る時間 5000 delayUnit 間隔時間の単位 (java.time.temporal.ChronoUnit) MILLIS requestVolumeThreshold ローリング・ウィンドウとなる連続した リクエスト数 >= 1 20 failureRatio サーキットをOpenにする失敗率 0 < x < 1 0.5 successThreshold サーキットがCloseに移るための閾値 >= 1 1 /** * ローリング・ウィンドウとなる連続した4回の呼び出しのうち3回(4xfailureRatio=0.75)が失敗した場合 * サーキットはOpenとなる。サーキットは1,000msecの間Openの状態を保ったのちHalf-Openに遷移し、 * 以降10連続呼び出しが成功した場合にClosedとなる。そうでない場合は再びOpenに戻る。 */ @CircuitBreaker(successThreshold = 10, requestVolumeThreshold = 4, failureRatio = 0.75, delay = 1000) public Connection serviceA() { … }
  • 33. 33 特定のサービスに発生した障害の影響がカスケード的に全体に波及するのを防ぐ セマフォ・スタイルとスレッドプール・スタイル MicroProfile Fault Tolerance – @Bulkhead // 最大5同時リクエストを許可 @Bulkhead(5) public Connection serviceA() { Connection conn = null; counterForInvokingServiceA++; conn = connectionService(); return conn; } // 最大5同時&待機キューに最大8リクエストを許可 @Asynchronous @Bulkhead(value = 5, waitingTaskQueue = 8) public Future<Connection> serviceA() { Connection conn = null; counterForInvokingServiceA++; conn = connectionService(); return CompletableFuture .completedFuture(conn); } セマフォ・スタイル スレッドプール・スタイル
  • 34. 34 リクエストの処理を別スレッドで行う Future もしくは CompletionStage を返す (java.util.concurrent パッケージ) • 処理が完了するまで未完了のステータス – 両者で振る舞いが異なる • 耐障害性を考えると Future よりも CompletionStage が好ましい MicroProfile Fault Tolerance – @Asynchronous @Asynchronous @Retry public Future<Connection> serviceA() { CompletableFuture<U> future = new CompletableFuture<>(); future.completeExceptionally(new RuntimeException("Failure")); return future; } @Asynchronous @Retry public CompletionStage<Connection> serviceA() { CompletableFuture<U> future = new CompletableFuture<>(); future.completeExceptionally(new RuntimeException("Failure")); return future; } Retryは トリガーされる Retryは トリガーされない
  • 35. 35 Configでパラメーターのオーバーライトや無効化が可能 * Configだけで新規にFault Tolerance を設定できる訳ではないので注意 • classname/methodname/annotation/parameter (メソッドレベル) • classname/annotation/parameter (クラスレベル) • annotation/parameter (システムレベル) • classname/methodname/annotation/enabled=false (有効/無効) • classname/annotation/enabled=false (有効/無効) • annotation/enabled=false (有効/無効) MicroProfile Fault Tolerance – Configによる制御 com.acme.test.MyClient/serviceA/Retry/maxDuration=3000 com.acme.test.MyClient/Retry/maxRetries=100 Retry/maxRetries=30 com.acme.test.MyClient/methodA/CircuitBreaker/enabled=false com.acme.test.MyClient/CircuitBreaker/enabled=true CircuitBreaker/enabled=false
  • 36. 36 Istioのようなサービスメッシュに任せる? • サイドカー・パターン • 言語非依存、実装と設定を完全分離 • コントロールプレーンから環境全体をコントロール可能 • Fault Toleranceの他にも様々な機能を提供する • 稼働プロセスが2倍、故障可能ポイントも2倍?、導入にはそれなりの気合が必要そう… MicroProfile Fault Toleranceは? • MicroProfile 縛りだが、Java VMが稼働する環境であればどこでも使える • 中央集権的なコントロールプレーンは無い(良く言えば不要)、個々に設定必要 • Annotationを使うことによってソース内でビジネスロジックの実装からフォルトトレラン スの設定を分離している • Config(環境変数、-Dオプション)を使ってデプロイ時点で設定の制御も可能 Fault Tolerance はどこで実現すべきか? Service A Service B Envoy Envoy Istio control plane pod pod
  • 37. 37 Bulkhead & Circuit Breaker - Circuit Breakerの状態遷移を確認する /ft Demo
  • 38. 38 Kubernetesなどノードの状態を検査するプロセスに対してヘルスチェック情報を提供する MicroProfile Health @Liveness @Readiness public class MyCheck implements HealthCheck { public HealthCheckResponse call() { ... } } Annotation Path Function @Liveness /health/live Liveness @Readiness /health/ready Readiness @Health /health (Deprecated) Liveness + Readiness @ApplicationScoped class MyChecks { @Produces @Liveness HealthCheck check1() { … } @Produces @Readiness HealthCheck check2() { … } } CDIを使ってmethodを分けるパターン
  • 39. 39 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
  • 40. 40 Health Check と Kubernetes Liveness Probe の組み合わせ /health Demo
  • 41. 41 RESTfulの認証スタイルに沿ったAPIの必要性 • ステートレス - セキュリティの状態はCookie等を使用せずリクエスト毎に送られる • 軽量で相互運用性のあるトークンを使って認証情報をサービス間で伝搬する MP JWT Authentication • JSON Web Tokensのインターフェス - org.eclipse.microprofile.jwt.JsonWebToken • Java EE/MicroProfile APIとのマッピング、インテグレーション JSON Web Tokens(JWT) https://tools.ietf.org/html/rfc7519 MicroProfile JWT Authentication GET /resource/1 HTTP/1.1 Host: example.com Authorization: Bearer mF_9.B5f-4.1JqM HTTPのAuthorizationヘッダに ”Bearer <JWT>” を設定して 認証情報をサーバーに渡すよくあるパターン
  • 42. 42 (参考) Json Web Token [ヘッダ] eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb3UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS8pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk [ペイロード(クレームセット)] [シグナチャ] { "typ": "JWT", "alg": "RS256", "kid": "abc-1234567890" } { "iss": "https://server.example.com", "aud": ["s6BhdRkqt3"], "exp": 1311281970, "iat": 1311280970, "sub": "24400320", "upn": "jdoe@server.example.com", "groups: ["red-group", "green-group", "admin-group"], "roles": ["auditor", "administrator"], "jti": "a-123", "auth_time": 1311280969, "preferred_username": "jdoe", "acr": "phr", "nbf": 1311288970 } ヘッダとペイロードを 署名したもの イメージ
  • 43. 43 org.eclipse.microprofile.jwt パッケージ • JsonWebToken インターフェース • java.security.Principal の拡張インターフェース • getXXX(), getClaim(String claimName) • Claims 列挙型 • 個々のクレームの説明とJava型を保持する JAX-RSでの認証方式の指定(web.xmlのlogin-config相当のもの) MicroProfile JWT Authentication - API import org.eclipse.microprofile.annotation.LoginConfig; @LoginConfig(authMethod = "MP-JWT", realmName = "TCK-MP-JWT") @ApplicationPath("/") public class TCKApplication extends Application { ・・・ }
  • 44. 44 CDI Injection MicroProfile JWT Authentication - API (Cont.) @Path("/endp") @DenyAll @RequestScoped public class RolesEndpoint { @Inject private JsonWebToken callerPrincipal; ... @RequestScoped public class MyEndpoint { @Inject @Claim(standard=Claims.iat) private Long issuedAt; ... JsonWebTokenを インジェクト Claimの個々の値 をインジェクト
  • 45. 45 JAX-RS APIとのインテグレーション #1 MicroProfile JWT Authentication - API (Cont.) @Provider @Auth public class BasicAuthFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext context) throws IOException { SecurityContext securityContext = context.getSecurityContext(); JsonWebToken jwt = (JsonWebToken)securityContext.getUserPrincipal() if(!securityContext.isUserInRole("admin")){ ... JsonWebToken オブジェクトを返す
  • 46. 46 JAX-RS APIとのインテグレーション #2 • @DenyAll – どのセキュリティロールもアクセス不可 • @RolesAllowed – 指定したロールのみアクセス可能 • @PermitAll – 全てのロールがアクセス可能 MicroProfile JWT Authentication - API (Cont.) @Path(value="/addresses") @PermitAll public class AddressBookResource { @GET @Produces(value="text/plain") public String getList() { ... } @PUT @RolesAllowed(“Administrator”) public void updateList(String books) { ... } } どのセキュリティ ロールでもアクセス可能 “Administrator”ロール のみアクセス可能 JWTの”groups”クレーム とのマッピングを行う このクラスのデフォルト アクセスレベルを指定
  • 48. 48 • 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
  • 49. 49 Oracle Integration Cloud Serviceと連携してユーザー認証&認可を行う Demo 1 - OIDC (Open ID Connect) Authentication Provider + IDCS Role Mapping Provider こちらも参考にして下さい! https://www.slideshare.net/oracle4engineer/ochacafe5 IDCS Helidon Open ID Connect Sequence /security/idcs/login Cookie Browser scope user group
  • 50. 50 @RolesAllowed を使ってエンドポイント毎の認可を設定する Demo 2 - HTTP Basic Authentication Browser Endpoint Roles allowed Permitted Users /security/basic/public <anonymous> <everyone> /security/basic/guest <logged-in users> John, Mary, Ken /security/basic/user user John, Mary /security/basic/admin admin John, Helidon application.yaml GitHubのソースは こちらの設定です
  • 51. 51 Metrics = システムの健全性を測定するために使用される指標 既存JMX(Java Management Extensions)標準はJVMを前提 - Polyglot環境では不向き Polyglot環境に適したモニタリングを可能にする ヘルスチェックとは異なる目的 • 長期的なトレンドの把握 • キャパシティ・プラニング、潜在的問題の早期把握 • スケジューリング・システムと連動したスケーリング MicroProfile Metrics
  • 52. 52 以下の3種類のスコープが存在 RESTエンドポイント MicroProfile Metrics スコープ 説明 base 全てのMicroProfile実装で提供しなければいけないメトリクス vendor ベンダ独自のメトリクス (optional) application アプリケーション独自のメトリクス (optional) Endpoint Request Type Supported Format Description /metrics GET JSON, OpenMetrics 全ての登録されているメトリクスを返す /metrics/<scope> GET JSON, OpenMetrics 当該スコープに登録されているメトリクスを返す /metrics/<scope>/<metric_name> GET JSON, OpenMetrics 当該スコープ・名前に一致するメトリクスを返す /metrics OPTIONS JSON 全ての登録されているメトリクスのメタデータを返す /metrics/<scope> OPTIONS JSON 当該スコープに登録されているメトリクスのメタデータを返す /metrics/<scope>/<metric_name> OPTIONS JSON 当該スコープ・名前に一致するメトリクスのメタデータを返す HTTP request のAccept: ヘッダで切り替え
  • 53. 53 メタデータ メトリック・タイプ (詳細は、org.eclipse.microprofile.metrics パッケージのJava Doc参照) MicroProfile Metrics メタデータ 説明 name メトリックの名前 unit メトリックの単位 type メトリックのタイプ (下表参照) description (optional) メトリックの説明 displayName (optional) メトリックの表示名 reusable (optional) 同じMetric IDの下で複数回メトリックを登録できるか タイプ 説明 例 counter 単調に増加していく数値 受信リクエスト数の合計 concurrent gauge 漸進的に増減する数値 メソッド呼び出しの並列度 gauge サンプルされた数値 CPU温度 / ディスク使用量 meter 平均スループット、1/5/15分の指数加重移動平均スループット histogram 数値の分布 timer 継続時間の集計値、継続時間の統計、スループットの統計
  • 54. 54 Helidonの例(/metrics) MicroProfile Metrics – OpenMetrics Text Format # TYPE base_cpu_availableProcessors gauge # HELP base_cpu_availableProcessors Displays the number of processors available to the Java virtual machine... base_cpu_availableProcessors 2 # TYPE vendor_requests_count_total counter # HELP vendor_requests_count_total Each request (regardless of HTTP method) will increase this counter vendor_requests_count_total 12 # TYPE vendor_requests_meter_total counter # HELP vendor_requests_meter_total Each request will mark the meter to see overall throughput vendor_requests_meter_total 12 # TYPE vendor_requests_meter_rate_per_second gauge vendor_requests_meter_rate_per_second 0.05411739326125853 # TYPE vendor_requests_meter_one_min_rate_per_second gauge vendor_requests_meter_one_min_rate_per_second 0.12177241397420359 # TYPE vendor_requests_meter_five_min_rate_per_second gauge vendor_requests_meter_five_min_rate_per_second 0.21843631434845615 # TYPE vendor_requests_meter_fifteen_min_rate_per_second gauge vendor_requests_meter_fifteen_min_rate_per_second 0.32275102524669447 Meterを表す
  • 55. 55 application スコープのメトリックを登録・公開することが可能 2種類の方法 • Annotationを使う方法 • プログラマティカル&動的に作成する方法 Annotationを使う方法 – いろいろな方法あり MicroProfile Metrics – Application Metrics Annotation Constructor Field Method Parameter Type(Class) 説明 @Counted O O O @ConcurrentGauge O O O @Gauge O @Metered O O O @Timed O O O @Metric O O O Fieldで使用できるのはMeter, Timer, Counter, Histogram Gaugeが使用できるのはProducer method か field
  • 56. 56 MicroProfile Metrics – Example: Annotation package oracle.demo.metrics; @ApplicationScoped @Path("/mpmetrics") 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(); } }
  • 57. 57 MicroProfile Metrics – Example: Metrics # TYPE application_oracle_demo_metrics_MetricsResource_blue_total counter # HELP application_oracle_demo_metrics_MetricsResource_blue_total application_oracle_demo_metrics_MetricsResource_blue_total 10 # TYPE application_oracle_demo_metrics_MetricsResource_blue_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_rate_per_second 0.0948144020926388 # TYPE application_oracle_demo_metrics_MetricsResource_blue_one_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_one_min_rate_per_second 0.11031275087245901 # TYPE application_oracle_demo_metrics_MetricsResource_blue_five_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_five_min_rate_per_second 0.030672989003081328 # TYPE application_oracle_demo_metrics_MetricsResource_blue_fifteen_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_blue_fifteen_min_rate_per_second 0.010806905605177459 # TYPE application_oracle_demo_metrics_MetricsResource_green_total counter # HELP application_oracle_demo_metrics_MetricsResource_green_total application_oracle_demo_metrics_MetricsResource_green_total 9 # TYPE application_oracle_demo_metrics_MetricsResource_green_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_rate_per_second 0.08533204569172652 # TYPE application_oracle_demo_metrics_MetricsResource_green_one_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_one_min_rate_per_second 0.1265310936101765 # TYPE application_oracle_demo_metrics_MetricsResource_green_five_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_five_min_rate_per_second 0.028990958652981156 # TYPE application_oracle_demo_metrics_MetricsResource_green_fifteen_min_rate_per_second gauge application_oracle_demo_metrics_MetricsResource_green_fifteen_min_rate_per_second 0.009886502441084419 # TYPE application_oracle_demo_metrics_MetricsResource_total counter # HELP application_oracle_demo_metrics_MetricsResource_total application_oracle_demo_metrics_MetricsResource_total 19 パッケージ名 クラス名 メトリック名 メソッド名がメトリック名になる
  • 58. 58 Application Scope Metrics – コーディングから Prometheus - Grafanaによるビジュアライズまで /mpmetrics Demo
  • 59. 59 Demo – Helidon & Prometheus & Grafana PrometheusGrafana Helidon /metrics /mpmetrics/blue /mpmetrics/green application scope の メトリクスをテスト https://grafana.com/ https://prometheus.io/ メトリクスの監視・集計メトリクスの可視化
  • 60. 60 OpenAPI = RESTfulなAPIを記述するメタモデルの標準仕様 JAX-RS + MP OpenAPI Annotationで OpenAPI v3ドキュメントを生成 • org.eclipse.microprofile.openapi.annotations パッケージ MicroProfile OpenAPI @GET @Path("/findByStatus") @Operation(summary = "Finds Pets by status", description = "Multiple status values can be provided with comma separated strings") public Response findPetsByStatus(...) { ... } /pet/findByStatus: get: summary: Finds Pets by status description: Multiple status values can be provided with comma separated strings operationId: findPetsByStatus Java Source OpenAPI Spec
  • 61. 61 JAX-RS + MicroProfile OpenAPI Annotation さらに、Configを使ってドキュメント生成を制御できる APIを使ってOpenAPIのmodel treeを生成することも可能 MicroProfile OpenAPI – ドキュメント生成の仕組み こちらも参考にしてください! https://www.slideshare.net/oracle4engineer/ochacafe6-apiここにアクセスすれば何もしなくても とりあえずのAPIの構成は出てくる
  • 62. 62 /openapi を眺めてみる (OCHaCafe APIの回のおさらい) /country Demo
  • 63. 63 分散トレーシングのためのAPIを提供 既存の分散トレーシング・システムと統合し、マイクロサービス環境の一部として機能 OpenTracing (opentracing.io) を前提 JAX-RSアプリケーションは追加的なコードを必要としない • SpanContextは受信したリクエストから自動的に取り出される • Spanはリクエストを受信時に自動的にスタートし、リクエスト処理時に終了する • リクエスト送信時、自動的にSpanContextを挿入する/ Spanを開始し、完了後終了する - Client: (1) javax.ws.rs.client.Client(設定処理要) と (2) MicroProfile Rest Client (デフォルト有効) 分散トレーシングとは? • マイクロサービス環境で複数のサービスを経由して処理されるリクエストのサービス間の依存 関係やレイテンシーを可視化し、障害発生時の解析を容易にする MicroProfile OpenTracing
  • 64. 64 (参考)The OpenTracing Data Model https://opentracing.io/specification/
  • 66. Demo - JaegerによるSpanのトラッキング 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) トレース情報 66
  • 67. 67 Demo - JaegerによるSpanのトラッキング (Cont.) [ { "endpoint" : "http://helidon-demo-mp-1:8080/tracing/invoke", "orders" : [] }, { "endpoint" : "http://helidon-demo-mp-2:8080/tracing/invoke", "orders" : [ { "endpoint" : "http://helidon-demo-mp-3:8080/tracing/invoke", "orders" : [ { "endpoint" : "http://helidon-demo-mp-1:8080/tracing/invoke", "orders" : [] } ] }, { "endpoint" : "http://helidon-demo-mp-0:8080/tracing/invoke", "orders" : [] } ] } ] mp-1 mp-2 mp-3 mp-1 mp-0 mp-0 リクエスト json リクエストの流れ
  • 68. 68 JAX-RS REST Client API • Java EE仕様に含まれるJavaベースのREST Client仕様 • JSON-Bを使ったJson – POJO バインディングが可能 • Filterを使った柔軟な動作カスタマイズが可能 MicroProfile REST Client API • REST Clientを作成する新たなAPI • RESTfulサービスをタイプ・セーフに呼び出す方法を提供 • RestClientBuilderがエントリーポイント - サービス・インターフェースを実装したオブジェクトをビルドする - javax.ws.rs.core.Configurableをextendsしているので、ここからカスタマイズ可能 MicroProfile REST Client
  • 69. 69 MicroProfile Rest Client (Cont.) REST API用 インターフェース Server 実装 (JAX-RS) Client 実装 (MP Rest Client) @Path("/movies") public interface MovieReviewService { @POST @Path("/{movieId}/reviews") String submitReview( @PathParam("movieId") String movieId, Review review ); } URI apiUri = new URI("http://..."); MovieReviewService reviewSvc = RestClientBuilder.newBuilder() .baseUri(apiUri) .build(MovieReviewService.class); Review review = new Review(3, “Not bad"); reviewSvc.submitReview( movieId, review ); implements builds
  • 71. Demo – Rest Client Browser Helidon GET /restclient MP Rest Client << interface >> MovieReviewService MovieReviewServiceResource POST /movies implements builds 71 GET /restclient/1/submit-review?star=5&comment=great! You submitted a review for movie [id=1,tiele=JOHN WICK: CHAPTER 2] as review [id=0,star=5,comment=great!] [request] [response] { star: 5 comment: “great!” }
  • 72. 72 Helidon MP が提供する MicroProfile 以外の機能 Helidon MP が提供する MicroProfile 以外の機能 The gRPC Microprofile API というHelidon MP上でgRPCサーバー/ クライアントをAnnotationを使って 簡単に実装する機能がありますが、 今回はバッサリ割愛します…
  • 73. 73 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) = トランザクションを管理するための仕様
  • 74. 74 /country のJPA版 /jpa/country Demo Helidon MP H2 database (in memory) H2 JDBC Driver Java Transaction API EclipseLink (JPA) EntityApp Hikari Connection Pool application.yaml persistence.xml GET/POST/PUT/DELETE
  • 76. 76 単なる「JavaでREST APIを書くためのフレームワーク」ではない • Microservices環境に適したアプリケーションを効率的に作成できる MicroProfileベンダーが必要な実装の大部分を提供するので(だからフレームワーク…) 開発者はビジネスロジックの開発に専念できる • 放っておいても、Metrics、Health、OpenAPIなどはデフォルトで提供してくれる 多くの実績の中で育まれたJavaのエコシステムを活用できる • IDE、ライブラリ、モニタリング・プロファイリング・デバッギング、etc. • GraalVMの活用(native image化は克服すべき課題あり → Quarkusの取り組み) MicroProfileを使う理由 Helidonという素敵なMicroProfile実装がある!