More Related Content Similar to microprofile (20) microprofile5. MicroProfile.io
Copyright 2017 FUJITSU LIMITED
An open forum to optimize Enterprise Java for a
microservices architecture by innovating across
multiple implementations and collaborating on
common areas of interest with a goal of standardization.
The Mission
4
6. マイクロサービスアーキテクチャ(MSA)
Copyright 2017 FUJITSU LIMITED
マイクロサービスアーキテクチャとは
モノリシックなソフトウェアではなく、
疎結合な小さなサービスの集合・分散
サービスとして実装するアーキテクチャ。
マイクロサービスが訴求するのは
意思決定とビジネスの速さ
マイクロサービスの価値
Observe
Orient
Decide
Action
OODAループ
迅速な意思決定を助けるアーキテクチャと
フィードバックループによる進化
5
7. アプリケーション
サーバー
MSAレイヤーと要素技術
Copyright 2017 FUJITSU LIMITED
VM/コンテナ
アプリケーション
サーバー
アプリケーション
docker
memory
footprint
resiliency
IaaS
PaaS
ステートレス
API化
サービス分割
サーバレス
非同期
REST
MicroProfile 1.0
Java EE 7
Java EE 8/9
MSAで必要な機能
(3)(2)
(1)
(1)JAX-RS、CDI、JSON-P
(2)Websocket、JPA等
(3)Healthcheck等
6
8. Java EE にも Profile
Copyright 2017 FUJITSU LIMITED
Java EEにProfileを追加できるのはOracleだけ
Java EE Full Profile
Java EE Web Profile
Java EE Micro Profile
追加
7
9. Java EE 歴史
Copyright 2017 FUJITSU LIMITED
JSR
Initiation
Early Draft
Review
Public
Review
Final
Release
J2EE 1.4 2001/10 - 2002/5 2003/11
Java EE 5 2004/5 2005/4 2005/6 2006/5
Java EE 6 2007/7 2008/10 2009/1 2009/12
Java EE 7 2011/5 2012/4 2013/1 2013/5
Java EE 8 2014/8 2015/10 2017/7?
J2EE 1.2 J2EE 1.3
J2EE 1.4
Java EE 5
Java EE 6
Java EE 7 Java EE 8
2000 2005 2010 2015 2020
リリース間隔
8
10. JCPステージ
Copyright 2017 FUJITSU LIMITED
Initiation Draft
Release
Final
Release
Main-
tenance
Expert Group設立
(SpecLead)
最終承認投票
(EC)
保守投票
(EC)
ドラフト
レビュー
JSR
レビュー
ドラフト承認投票
(EC)
RI & TCK
(EG)
JSR承認投票
(EC)
9
11. Java EE 8 状況
Copyright 2017 FUJITSU LIMITED
JSR 機能 状況
(2016/3)
状況
(2017/3)
366 Java EE 8 Platform EDR EDR2
367 JSON-B 1.0 – JSON Binding EDR PR
371 MVC 1.0 – Model View Controller EDR2 EDR2
372 JSF 2.3 – Integration with WebSocket EDR FD
369 Servlet 4.0 – HTTP/2 EDR EDR
365 CDI 2.0 – outside of Java EE container EDR PR
375 Security API - EDR
370 JAX-RS 2.1 – non-blocking I/O - EDR
373 Management 2.0 - WD
380 Bean Validation 2.0 - EDR
368 JMS 2.1 EDR WD
374 JSON-P 1.1 EDR FD
10
15. JCP v.s. OpenJDK
Copyright 2017 FUJITSU LIMITED
JEPによる開発
JDKのオープンソース Java SE の RI
JCP
JSRによる開発
(Java Enhancement Proposal)
openjdk.java.net
OpenJDK
14
16. JCP構成
Copyright 2017 FUJITSU LIMITED
Executive Committee
JSR
JCP member
非営利団体
企業
個人
Oracle 1シート
Elected 6シート
Ratified 16シート
SpecLead 1-2名
Expert Group 数名選出
承認
設立
Associate 2シート
15
23. MicroProfile 1.1
Copyright 2017 FUJITSU LIMITED
2017/2Q リリース予定
Configuration API
Health Check API
JWT Token Definition
Fault Tolerance (stretch goal)
22
24. Configuration API
Copyright 2017 FUJITSU LIMITED
設定の外だし
別環境への移動時等、設定変更のためのリビルドを不要に
環境が変更するたびに、リデプロイが不要に
設定動的反映
Netflix/archaiusの考え方
優先度づけされた複数の設定(ConfigSource)で構成
1. システムプロパティ
2. 環境変数
3. 設定ファイル
META-INF/microprofile-config.properties
高
(優先順位)
低
23
25. Configuration API
Copyright 2017 FUJITSU LIMITED
Config config = ConfigProvider.getConfig();
ConfigValue portConfig =
config.access(“com.fujitsu.interstage.port”)
.as(Integer.class)
.cacheFor(5, TimeUnit.MINUTES)
.logChanges(true)
.evaluateVariables(true)
.withDefault(8080);
Integer port = portConfig.getValue();
5分間キャッシュする
Apache DeltaSpike由来のAPI
org.apach.delatspike.core.api.config.Config.Resolver
値が変化したらINFOログ
出力
${foo}のような変数の再評価
24
26. Configuration API
Copyright 2017 FUJITSU LIMITED
@Inject
@ConfigProperty(
“com.fujitsu.interstage.port”,
cacheFor=5,
timeUnit=TimeUnit.MINUTES,
evaluateVariables=true)
ConfigValue<Integer> portConfig;
int port = portConfig.get();
アノテーションも使えるように
25
27. Interoperable JWT RBAC
Copyright 2017 FUJITSU LIMITED
OpenID ConnectベースのRole Based Access Control
OpenID ConnectのIDトークンに
認可のためのクレームを加えたbearer/accessトークン
が提案されている
まだ具体的な仕様は少ない
HTTPヘッダからトークン情報を取得したり、ハンドリングす
るAPIも考えられているが。
JavaOne 2016のMicroProfile Meetingでセキュリティとして
優先だが高いとされた
26
28. Interoperable JWT RBAC
Copyright 2017 FUJITSU LIMITED
{
"iss": "https://server.example.com",
"sub": "24400320",
"preferred_username": "jdoe",
"aud": "s6BhdRkqt3",
"nonce": "n-0S6_WzA2Mj",
"exp": 1311281970,
"iat": 1311280970,
"auth_time": 1311280969,
"realm_access": {
"roles": ["role-in-realm", "user", "manager"]
},
"resource_access": {
"my-service": {
"roles": [
"role-in-my-service"
]
}
},
例:
27
29. Service Healthchecks
Copyright 2017 FUJITSU LIMITED
アプリケーションのヘルスチェックをするRESTエンドポイント仕様
Consumer Producer
Health Check Procedure
GET /health
200:UP
or
503:Down
全てのProcedureを実行し、
結果をまとめてJSONで返却
Kubernetes health check互換
Health Check ProcedureHealth Check Procedure
チェック対象のアプリケーションProducerの生存を特定するマシン
(Kubernetesとか)
28
30. Service Healthchecks
Copyright 2017 FUJITSU LIMITED
Health Check Procedureの例 (JAX-RS)
@Path("/app")
public class HealthCheckResource {
@GET
@Path("/diskspace")
@Health
public HealthStatus checkDiskspace() {
long freeBytes = path.getFreeSpace();
long threshold = 1024 * 1024 * 100; // 100MB
return freeBytes>threshold ?
HealthStatus.named("diskspace")
.up().withAttribute("freebytes", freeBytes) :
HealthStatus.named("diskspace")
.down().withAttribute("freebytes", freeBytes);
}
29
32. Fault Tolerance
Copyright 2017 FUJITSU LIMITED
RetryPolicy rp = retryPolicy
.retryOn(TimeOutException.class) // リトライの条件
.withDelay(2, TimeUnit.SECONDS) // リトライ間隔
.withMaxRetries(2); // リトライ回数
Connection conn = execution
.with(rp) // RetryPolicyの設定
.withFallBack(this::connectToBackup)
// getのリトライに失敗した際の処理
.get(this::connectToPrimary)
RetryPolicy
Fallback
31
33. Fault Tolerance
Copyright 2017 FUJITSU LIMITED
CircuitBreaker cb = circuitBreaker
.withFailureThreshold(3, 10)
.withSuccessThreshold(5)
.withDelay(1, TimeUnit.MINUTES);
Connection conn = execution.with(cb).run(this::connect);
CircuitBreaker
closed
CircuitBreaker
open
CircuitBreaker
half-open
10回中3回失敗した 5回連続成功した
正常時
リクエスト送信遮断なし
リクエスト送信遮断
1分後
5回連続成功しなかった
リクエスト送信再開
CircuitBreaker
32
34. Fault Tolerance
Copyright 2017 FUJITSU LIMITED
@Inject
@CircuitBreaker (
delay=1, failThreshold=3, successThreashold=5)
CircuitBreaker cb;
Connection conn = execution.with(cb).run(this::connect);
CircuitBreaker (アノテーションでも)
33
35. Fault Tolerance
Copyright 2017 FUJITSU LIMITED
BulkHead bh = bulkHead.withPool(“myPool”);
Connection conn = execution
.with(bh)
.run(this::connect);
Connection connect = execution
.withTimOut(2, TimeUnit.SECONDS)
.run(this::connect);
BulkHead
処理ごとに個別のスレッドプールを使用することで、
異常時の影響を分離
Timeout
34
37. サマリ
Copyright 2017 FUJITSU LIMITED
フィードバックループによるマイクロサービスを実践
既存のJavaコミュニティを分裂するものではない
アプリケーションポータビリティ
最終的にはJCPで標準化
オープンイノベーション
実装(ベンダー)を選択可能
36
39. Copyright 2017 FUJITSU LIMITED
Javaは、Oracle Corporationおよびその子会社、関連会社の米国および
その他の国おける登録商標です。
本ドキュメントに記載されている、社名、商品名等は各社の商標または
登録商標である場合があります。
その他の記載されている、商標および登録商標については、
一般に各社の商標または登録商標です。
38
Editor's Notes 0 1 3 12 17 20 35