狠狠撸

狠狠撸Share a Scribd company logo
Copyright?2019 NTT corp. All Rights Reserved.
Spring I/O 2019 報告
Spring Framework のロードマップと
5.2 の新機能
2019年6月24日
NTTソフトウェアイノベーションセンタ
岩塚 卓弥
2Copyright?2019 NTT corp. All Rights Reserved.
? 名前:岩塚 卓弥
? 所属:NTT ソフトウェアイノベーションセンタ
? NTTの研究所のうちソフトウェアを専門に扱う
? 自部署ではソフトウェア工学を研究
? Springベースのグループ共通フレームワークの整備を担当
? Spring I/O は 2019 で5回目
? 多分今回がラスト…?!
自己紹介
3Copyright?2019 NTT corp. All Rights Reserved.
Spring I/O について
? ヨーロッパ最大規模の Spring カンファレンス
? 参加者もヨーロッパ勢が多数
? 昨年から1000人規模に拡大
? 例年バルセロナで5月頃開催
? 日程は二日間
4Copyright?2019 NTT corp. All Rights Reserved.
今回の Top 3 Talks
1.Multi-Service Reactive Streams Using Spring,
Reactor, and RSocket
2.Cutting-edge Continuous Delivery: Automated
Canary Analysis through Spring-based
Spinnaker
3.Event-driven Microservices with Axon and
Spring Boot: excitingly boring
5Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? Spring Framework 5.3 以降のロードマップ
今日のトピック
6Copyright?2019 NTT corp. All Rights Reserved.
Spring Framework 5.2
CY 2017 2018 2019 2020
Spring 5.0 Spring 5.1 Spring 5.2
(9/4 GA)
Spring 5.3
(2Q GA)
Spring Framework 5.x の主要テーマ
? コアコンテナの改善
? リアクティブ API の整備
? 関数型 API の整備
? Kotlin 対応
? アノテーション処理の高速化 等
? リアクティブトランザクション 等
? WebMvc.fn 等
? コルーチン対応 等
Spring Framework 5.0 以降継続的に取り組んできたテーマがそれぞれ進展
7Copyright?2019 NTT corp. All Rights Reserved.
Spring Framework 5.2
CY 2017 2018 2019 2020
Spring 5.0 Spring 5.1 Spring 5.2
(9/4 GA)
Spring 5.3
(2Q GA)
Spring Framework 5.x の主要テーマ
? コアコンテナの改善
? リアクティブ API の整備
? 関数型 API の整備
? Kotlin 対応
? アノテーション処理の高速化 等
? リアクティブトランザクション 等
? WebMvc.fn 等
? コルーチン対応 等
Spring Framework 5.0 以降継続的に取り組んできたテーマがそれぞれ進展
本日のメイントピック
8Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? リアクティブAPI関連
? 関数型API関連
? Spring Framework 5.3 以降のロードマップ
今日のトピック
9Copyright?2019 NTT corp. All Rights Reserved.
リアクティブ API の整備
NoSQL
RDBMS
RSocket メッセージング
リアクティブトランザクション
? RSocket を利用したメッセージングAPIを追加
? R2DBC による RDBMS へのリアクティブアクセスに
おいてトランザクション管理が可能に
→ 主要機能のリアクティブ対応がほぼ整った
10Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? リアクティブAPI関連
? RSocket メッセージング
? リアクティブトランザクション
? Reactor の改善
? 関数型API関連
? Spring Framework 5.3 以降のロードマップ
今日のトピック
11Copyright?2019 NTT corp. All Rights Reserved.
? L7 のバイナリプロトコル
? トランスポートには TCP, WebSocket, Aeron 等を利用
? Reactive Streams 対応
? バックプレッシャが効く
? 4つのインタラクションモデルに対応
RSocket とは
fire-and-forget request/response
request/stream channel
Producer Consumer Producer Consumer
Producer Consumer Producer Consumer
12Copyright?2019 NTT corp. All Rights Reserved.
spring-boot-starter-rsocket
13Copyright?2019 NTT corp. All Rights Reserved.
RSocket メッセージング
@Bean
RSocket rSocket() {
return RSocketFactory
.connect()
.dataMimeType(MimeTypeUtils.APPLICATION_JSON_VALUE)
.frameDecoder(PayloadDecoder.ZERO_COPY)
.transport(TcpClientTransport.create(7000))
.start()
.block();
}
@Bean
RSocketRequester requester(RSocketStrategies strategies) {
return RSocketRequester.wrap(
this.rSocket(),
MimeTypeUtils.APPLICATION_JSON,
strategies);
}
spring.rsocket.server.port=7000
Producer
Consumer
io.rsocket.RSocket
org.springframework.messaging.rsocket.RSocketRequester
14Copyright?2019 NTT corp. All Rights Reserved.
RSocket メッセージング
Request – Response
Producer
Consumer
Publisher<GreetingResponse> greet(@PathVariable String name) {
return this.requester
.route("greet")
.data(new GreetingRequest(name))
.retrieveMono(GreetingResponse.class);
}
@Controller
class GreetingController{
@MessageMapping("greet")
GreetingResponse greet(GreetingRequest request) {
return new GreetingResponse(request.getName());
}
Producer Consumer
15Copyright?2019 NTT corp. All Rights Reserved.
RSocket メッセージング
Channel
Publisher<AccResponse> acc(@PathVariable int value){
return this.requester
.route("acc")
.data(
Flux.range(0, value)
.map(n->{return new AccRequest(n);})
.delayElements(Duration.ofSeconds(1))
, AccRequest.class)
.retrieveFlux(AccResponse.class);
}
@MessageMapping("acc")
Flux<AccResponse> acc(Flux<AccRequest> request){
return request.map(AccRequest::getValue)
.scan((x,y) -> x+y)
.map(n-> {return new AccResponse(n);});
}
Producer
Consumer
Producer Consumer
16Copyright?2019 NTT corp. All Rights Reserved.
RSocketRequester とインタラクションモデル
fire-and-forget request/response
request/stream channel
Producer Consumer Producer Consumer
Producer Consumer Producer Consumer
requester.route(…)
.data(…)
.retrieveFlux(…)
requester.route(…)
.data(…)
.retrieveFlux(…)
requester.route(…)
.data(…)
.retrieveMono(…)
requester.route(…)
.data(…)
.send()
dataの内容で自動的に選択される
17Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? リアクティブAPI関連
? RSocket メッセージング
? リアクティブトランザクション
? Reactor の改善
? 関数型API関連
? Spring Framework 5.3 以降のロードマップ
今日のトピック
18Copyright?2019 NTT corp. All Rights Reserved.
? R2DBC
? リレーショナルデータベースのドライバ用のSPIを定義
? PostgreSQL, H2, MSSQL 等の対応ドライバがある
? Reactive Streams 対応
? バックプレッシャが効く
? Spring Data R2DBC
? R2DBC を使用してRDBへアクセスするクライアントを提供
? 現時点で PostgreSQL, H2, MSSQL に対応
R2DBC / Spring Data R2DBC
19Copyright?2019 NTT corp. All Rights Reserved.
リアクティブトランザクション
@Bean
ReactiveTransactionManager reactiveTransactionManager
(ConnectionFactory connectionFactory) {
return new R2dbcTransactionManager(connectionFactory);
}
@Service
@Transactional
public class AccountServiceImpl implements AccountService {
@Autowired
DatabaseClient databaseClient;
@Override
public Mono<Void> transfer(int fromId, int toId, int amount) {
return databaseClient.execute()
//omit
TransactionManager のBean定義
Transactional な Service の実装
Spring Data R2DBC
20Copyright?2019 NTT corp. All Rights Reserved.
? 従来のトランザクション管理はスレッドモデルに依存
? トランザクションの状態は ThreadLocal に保持される
? Reactive Streams では1トランザクションが同一ス
レッドで実行される保証はない
→ 全く別の実装が必要になる
ほぼ同様の宣言型トランザクション管理が利用できるが
戻り値の型によって内部的には異なる実装に切り替わる
トランザクションとスレッド
21Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? リアクティブAPI関連
? RSocket メッセージング
? リアクティブトランザクション
? Reactor の改善
? 関数型API関連
? Spring Framework 5.3 以降のロードマップ
今日のトピック
22Copyright?2019 NTT corp. All Rights Reserved.
従来のデバッグ出力
Hooks.onOperatorDebug();
// omit
Flux.range(0, 5).filter(n->n>6).single();
デバッグ出力を有効化
エラー箇所の特定には有用だが,スタックトレース取得のコストが高いのが難点
23Copyright?2019 NTT corp. All Rights Reserved.
? バイトコード変換によってデバッグ情報を埋め込むこと
により,デバッグ情報取得コストを削減
? Reactor 3.3.0.M1 時点では reactor-core とは別
に開発されている
? 本資料作成時点では reactor-core の master に入っている
Reactor Debug Agent
ReactorDebugAgent.init();
24Copyright?2019 NTT corp. All Rights Reserved.
? ノンブロッキング処理が期待されている箇所で,ブロッ
キングAPIが呼び出されるとエラーを投げる
? まだ実験段階のツール
? https://github.com/reactor/BlockHound
Block Hound
BlockHound.install();
25Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? リアクティブAPI関連
? 関数型API関連
? WebMVC.fn
? Spring Framework 5.3 以降のロードマップ
今日のトピック
26Copyright?2019 NTT corp. All Rights Reserved.
今まで WebFlux でのみ使用可能だった
Router Functions が WebMVC でも使用可能に
関数型 API の整備
spring-webmvc
spring-webflux
@Controller
@RequestMapping
Router Functions
WebMvc.fn
27Copyright?2019 NTT corp. All Rights Reserved.
WebMVC.fn
@Bean
RouterFunction<ServerResponse> routes(){
return RouterFunctions.route()
.GET("/hoge",
rq -> ServerResponse.ok().body("hoge"))
.GET("/greet/{name}",
rq -> ServerResponse.ok()
.body("Hello, " +
rq.pathVariable("name") + "!"))
.build();
}
ServerRequest
@Controller, @RestController とも併用可
28Copyright?2019 NTT corp. All Rights Reserved.
? Spring Framework 5.2 の新機能
? Spring Framework 5.3 以降のロードマップ
今日のトピック
29Copyright?2019 NTT corp. All Rights Reserved.
Spring Framework 5.3
30Copyright?2019 NTT corp. All Rights Reserved.
Spring Framework 6 以降となる見込みの内容

More Related Content

Spring I/O 2019 報告 Spring Frameworkのロードマップと5.2の新機能

  • 1. Copyright?2019 NTT corp. All Rights Reserved. Spring I/O 2019 報告 Spring Framework のロードマップと 5.2 の新機能 2019年6月24日 NTTソフトウェアイノベーションセンタ 岩塚 卓弥
  • 2. 2Copyright?2019 NTT corp. All Rights Reserved. ? 名前:岩塚 卓弥 ? 所属:NTT ソフトウェアイノベーションセンタ ? NTTの研究所のうちソフトウェアを専門に扱う ? 自部署ではソフトウェア工学を研究 ? Springベースのグループ共通フレームワークの整備を担当 ? Spring I/O は 2019 で5回目 ? 多分今回がラスト…?! 自己紹介
  • 3. 3Copyright?2019 NTT corp. All Rights Reserved. Spring I/O について ? ヨーロッパ最大規模の Spring カンファレンス ? 参加者もヨーロッパ勢が多数 ? 昨年から1000人規模に拡大 ? 例年バルセロナで5月頃開催 ? 日程は二日間
  • 4. 4Copyright?2019 NTT corp. All Rights Reserved. 今回の Top 3 Talks 1.Multi-Service Reactive Streams Using Spring, Reactor, and RSocket 2.Cutting-edge Continuous Delivery: Automated Canary Analysis through Spring-based Spinnaker 3.Event-driven Microservices with Axon and Spring Boot: excitingly boring
  • 5. 5Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 6. 6Copyright?2019 NTT corp. All Rights Reserved. Spring Framework 5.2 CY 2017 2018 2019 2020 Spring 5.0 Spring 5.1 Spring 5.2 (9/4 GA) Spring 5.3 (2Q GA) Spring Framework 5.x の主要テーマ ? コアコンテナの改善 ? リアクティブ API の整備 ? 関数型 API の整備 ? Kotlin 対応 ? アノテーション処理の高速化 等 ? リアクティブトランザクション 等 ? WebMvc.fn 等 ? コルーチン対応 等 Spring Framework 5.0 以降継続的に取り組んできたテーマがそれぞれ進展
  • 7. 7Copyright?2019 NTT corp. All Rights Reserved. Spring Framework 5.2 CY 2017 2018 2019 2020 Spring 5.0 Spring 5.1 Spring 5.2 (9/4 GA) Spring 5.3 (2Q GA) Spring Framework 5.x の主要テーマ ? コアコンテナの改善 ? リアクティブ API の整備 ? 関数型 API の整備 ? Kotlin 対応 ? アノテーション処理の高速化 等 ? リアクティブトランザクション 等 ? WebMvc.fn 等 ? コルーチン対応 等 Spring Framework 5.0 以降継続的に取り組んできたテーマがそれぞれ進展 本日のメイントピック
  • 8. 8Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? リアクティブAPI関連 ? 関数型API関連 ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 9. 9Copyright?2019 NTT corp. All Rights Reserved. リアクティブ API の整備 NoSQL RDBMS RSocket メッセージング リアクティブトランザクション ? RSocket を利用したメッセージングAPIを追加 ? R2DBC による RDBMS へのリアクティブアクセスに おいてトランザクション管理が可能に → 主要機能のリアクティブ対応がほぼ整った
  • 10. 10Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? リアクティブAPI関連 ? RSocket メッセージング ? リアクティブトランザクション ? Reactor の改善 ? 関数型API関連 ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 11. 11Copyright?2019 NTT corp. All Rights Reserved. ? L7 のバイナリプロトコル ? トランスポートには TCP, WebSocket, Aeron 等を利用 ? Reactive Streams 対応 ? バックプレッシャが効く ? 4つのインタラクションモデルに対応 RSocket とは fire-and-forget request/response request/stream channel Producer Consumer Producer Consumer Producer Consumer Producer Consumer
  • 12. 12Copyright?2019 NTT corp. All Rights Reserved. spring-boot-starter-rsocket
  • 13. 13Copyright?2019 NTT corp. All Rights Reserved. RSocket メッセージング @Bean RSocket rSocket() { return RSocketFactory .connect() .dataMimeType(MimeTypeUtils.APPLICATION_JSON_VALUE) .frameDecoder(PayloadDecoder.ZERO_COPY) .transport(TcpClientTransport.create(7000)) .start() .block(); } @Bean RSocketRequester requester(RSocketStrategies strategies) { return RSocketRequester.wrap( this.rSocket(), MimeTypeUtils.APPLICATION_JSON, strategies); } spring.rsocket.server.port=7000 Producer Consumer io.rsocket.RSocket org.springframework.messaging.rsocket.RSocketRequester
  • 14. 14Copyright?2019 NTT corp. All Rights Reserved. RSocket メッセージング Request – Response Producer Consumer Publisher<GreetingResponse> greet(@PathVariable String name) { return this.requester .route("greet") .data(new GreetingRequest(name)) .retrieveMono(GreetingResponse.class); } @Controller class GreetingController{ @MessageMapping("greet") GreetingResponse greet(GreetingRequest request) { return new GreetingResponse(request.getName()); } Producer Consumer
  • 15. 15Copyright?2019 NTT corp. All Rights Reserved. RSocket メッセージング Channel Publisher<AccResponse> acc(@PathVariable int value){ return this.requester .route("acc") .data( Flux.range(0, value) .map(n->{return new AccRequest(n);}) .delayElements(Duration.ofSeconds(1)) , AccRequest.class) .retrieveFlux(AccResponse.class); } @MessageMapping("acc") Flux<AccResponse> acc(Flux<AccRequest> request){ return request.map(AccRequest::getValue) .scan((x,y) -> x+y) .map(n-> {return new AccResponse(n);}); } Producer Consumer Producer Consumer
  • 16. 16Copyright?2019 NTT corp. All Rights Reserved. RSocketRequester とインタラクションモデル fire-and-forget request/response request/stream channel Producer Consumer Producer Consumer Producer Consumer Producer Consumer requester.route(…) .data(…) .retrieveFlux(…) requester.route(…) .data(…) .retrieveFlux(…) requester.route(…) .data(…) .retrieveMono(…) requester.route(…) .data(…) .send() dataの内容で自動的に選択される
  • 17. 17Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? リアクティブAPI関連 ? RSocket メッセージング ? リアクティブトランザクション ? Reactor の改善 ? 関数型API関連 ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 18. 18Copyright?2019 NTT corp. All Rights Reserved. ? R2DBC ? リレーショナルデータベースのドライバ用のSPIを定義 ? PostgreSQL, H2, MSSQL 等の対応ドライバがある ? Reactive Streams 対応 ? バックプレッシャが効く ? Spring Data R2DBC ? R2DBC を使用してRDBへアクセスするクライアントを提供 ? 現時点で PostgreSQL, H2, MSSQL に対応 R2DBC / Spring Data R2DBC
  • 19. 19Copyright?2019 NTT corp. All Rights Reserved. リアクティブトランザクション @Bean ReactiveTransactionManager reactiveTransactionManager (ConnectionFactory connectionFactory) { return new R2dbcTransactionManager(connectionFactory); } @Service @Transactional public class AccountServiceImpl implements AccountService { @Autowired DatabaseClient databaseClient; @Override public Mono<Void> transfer(int fromId, int toId, int amount) { return databaseClient.execute() //omit TransactionManager のBean定義 Transactional な Service の実装 Spring Data R2DBC
  • 20. 20Copyright?2019 NTT corp. All Rights Reserved. ? 従来のトランザクション管理はスレッドモデルに依存 ? トランザクションの状態は ThreadLocal に保持される ? Reactive Streams では1トランザクションが同一ス レッドで実行される保証はない → 全く別の実装が必要になる ほぼ同様の宣言型トランザクション管理が利用できるが 戻り値の型によって内部的には異なる実装に切り替わる トランザクションとスレッド
  • 21. 21Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? リアクティブAPI関連 ? RSocket メッセージング ? リアクティブトランザクション ? Reactor の改善 ? 関数型API関連 ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 22. 22Copyright?2019 NTT corp. All Rights Reserved. 従来のデバッグ出力 Hooks.onOperatorDebug(); // omit Flux.range(0, 5).filter(n->n>6).single(); デバッグ出力を有効化 エラー箇所の特定には有用だが,スタックトレース取得のコストが高いのが難点
  • 23. 23Copyright?2019 NTT corp. All Rights Reserved. ? バイトコード変換によってデバッグ情報を埋め込むこと により,デバッグ情報取得コストを削減 ? Reactor 3.3.0.M1 時点では reactor-core とは別 に開発されている ? 本資料作成時点では reactor-core の master に入っている Reactor Debug Agent ReactorDebugAgent.init();
  • 24. 24Copyright?2019 NTT corp. All Rights Reserved. ? ノンブロッキング処理が期待されている箇所で,ブロッ キングAPIが呼び出されるとエラーを投げる ? まだ実験段階のツール ? https://github.com/reactor/BlockHound Block Hound BlockHound.install();
  • 25. 25Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? リアクティブAPI関連 ? 関数型API関連 ? WebMVC.fn ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 26. 26Copyright?2019 NTT corp. All Rights Reserved. 今まで WebFlux でのみ使用可能だった Router Functions が WebMVC でも使用可能に 関数型 API の整備 spring-webmvc spring-webflux @Controller @RequestMapping Router Functions WebMvc.fn
  • 27. 27Copyright?2019 NTT corp. All Rights Reserved. WebMVC.fn @Bean RouterFunction<ServerResponse> routes(){ return RouterFunctions.route() .GET("/hoge", rq -> ServerResponse.ok().body("hoge")) .GET("/greet/{name}", rq -> ServerResponse.ok() .body("Hello, " + rq.pathVariable("name") + "!")) .build(); } ServerRequest @Controller, @RestController とも併用可
  • 28. 28Copyright?2019 NTT corp. All Rights Reserved. ? Spring Framework 5.2 の新機能 ? Spring Framework 5.3 以降のロードマップ 今日のトピック
  • 29. 29Copyright?2019 NTT corp. All Rights Reserved. Spring Framework 5.3
  • 30. 30Copyright?2019 NTT corp. All Rights Reserved. Spring Framework 6 以降となる見込みの内容