More Related Content Similar to OCHaCafe Season 2 #4 - Cloud Native時代のモダンJavaの世界 (20) More from オラクルエンジニア通信 (20) 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
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 固有
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)
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
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)
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";
}
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
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
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のソースは
こちらの設定です
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
パッケージ名 クラス名 メトリック名
メソッド名がメトリック名になる
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の構成は出てくる
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) = トランザクションを管理するための仕様