spring i/o 2015 報告

63
Copyright©2015 NTT corp. All Rights Reserved. Spring I/O 2015 報報 2015 報 6 報 22 報 Spring I/O 2015 報報報 岩岩 岩岩 岩岩岩岩岩岩岩岩岩岩岩岩岩岩岩岩 NTT 岩岩岩岩岩岩岩岩岩岩岩岩岩岩岩岩

Upload: takuya-iwatsuka

Post on 13-Aug-2015

556 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Spring I/O 2015 報告

Copyright©2015 NTT corp. All Rights Reserved.

Spring I/O 2015 報告2015 年 6 月 22 日 @ Spring I/O 2015 報告会

岩塚 卓弥ソフトウェア革新技術プロジェクトNTT ソフトウェアイノベーションセンタ

Page 2: Spring I/O 2015 報告

2Copyright©2015 NTT corp. All Rights Reserved.

• 名前:岩塚 卓弥

• 所属: NTT ソフトウェアイノベーションセンタ

• 研究分野:ソフトウェア工学• ソフトウェア開発の生産性向上を目指す取り組みの一つと

して、 AP フレームワークの整備に取り組む

• その他:• 名古屋出身• プログラミング言語 / ソフトウェアの形式的検証技

術に関心• Spring については newbie なのでお手柔らかに!

自己紹介

Page 3: Spring I/O 2015 報告

3Copyright©2015 NTT corp. All Rights Reserved.

Spring 4.2 編

Page 4: Spring I/O 2015 報告

4Copyright©2015 NTT corp. All Rights Reserved.

• Core Container の改善

→ Modern Java Component Design with Spring Framework 4.2

• データアクセス の改善

• JMS の改善

• Web の改善

→ Spring4 Web Apps

• WebSocket メッセージング の改善

→ Real-time with Spring: SSE and WebSockets

• テスト の改善

→ Testing with Spring 4.x

Spring 4.2 の新機能と改善

From https://docs.spring.io/spring-framework/docs/4.2.x/spring-framework-reference/htmlsingle/#new-in-4.2

Page 5: Spring I/O 2015 報告

5Copyright©2015 NTT corp. All Rights Reserved.

WEB の改善SPRING 4.2 編

Page 6: Spring I/O 2015 報告

6Copyright©2015 NTT corp. All Rights Reserved.

•HTTP ストリーミング と SSE

•CompletableFuture のサポート

•CORS のビルトインサポート

•HTTP キャッシュの改善

•JavaScript View テンプレート

Web の改善

Page 7: Spring I/O 2015 報告

7Copyright©2015 NTT corp. All Rights Reserved.

• カスタム @RequestMapping

• Request Mapping の実行時制御

• RequestBodyAdvice

• @ExceptionHandler の引数に HandlerMethod

• HttpHeaders の Byte-range リクエストのサポート

• UriTemplateHandler

• MvcUriComponentsBuilder の改善

Web の改善

Page 8: Spring I/O 2015 報告

8Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

Web の改善

Page 9: Spring I/O 2015 報告

9Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

サーバからクライアントにイベントを PUSHHTTP リクエスト:イベント が 1: 多

Page 10: Spring I/O 2015 報告

10Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

サーバからクライアントにイベントを PUSHHTTP リクエスト:イベント が 1: 多

HTTP リクエスト

Page 11: Spring I/O 2015 報告

11Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

サーバからクライアントにイベントを PUSHHTTP リクエスト:イベント が 1: 多

HTTP リクエスト

HTTP レスポンス

Page 12: Spring I/O 2015 報告

12Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

サーバからクライアントにイベントを PUSHHTTP リクエスト:イベント が 1: 多

HTTP リクエスト

PUSH(Event1)

Event1

HTTP レスポンス

Page 13: Spring I/O 2015 報告

13Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

サーバからクライアントにイベントを PUSHHTTP リクエスト:イベント が 1: 多

HTTP リクエスト

Event1Event2

PUSH(Event2)

HTTP レスポンス

Page 14: Spring I/O 2015 報告

14Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング と SSE

サーバからクライアントにイベントを PUSHHTTP リクエスト:イベント が 1: 多

HTTP リクエスト

Event1Event2…

HTTP レスポンス

Page 15: Spring I/O 2015 報告

15Copyright©2015 NTT corp. All Rights Reserved.

HTTP ストリーミング の使い方

ResponseBodyEmitter を作成

イベントを PUSH

何度も PUSHやめる

作成した emitter を返す

その後、別のスレッドで…

Page 16: Spring I/O 2015 報告

16Copyright©2015 NTT corp. All Rights Reserved.

•SSE(Server-Sent Events)• W3C 勧告• PUSH されるイベントのフォーマットが定められている

SSE の使い方

ResponseBodyEmitter の代わりにSseEmitter を作成

SSE のフォーマットイベントを PUSH

Page 17: Spring I/O 2015 報告

17Copyright©2015 NTT corp. All Rights Reserved.

• IE は SSE 未対応

• 以下のような用途には向かない• オンラインゲーム• コレボレーションツール• 金融アプリケーション

注意点

これらの場合には WebSocket の使用を検討

Page 18: Spring I/O 2015 報告

18Copyright©2015 NTT corp. All Rights Reserved.

CompletableFuture のサポート

Web の改善

Page 19: Spring I/O 2015 報告

19Copyright©2015 NTT corp. All Rights Reserved.

Java8 で導入された非同期処理用のクラス豊富な機能を持つ

• コールバック指定• タイムアウトの設定• 実行の中断• 複数の並行処理の同期 等

CompletableFuture

Page 20: Spring I/O 2015 報告

20Copyright©2015 NTT corp. All Rights Reserved.

DeferredResult と CompletableFuture

DeferredResult CompletableFuture

isSetOrExpired isDone

onCompletion whenComplete

onTimeout exceptionally

setResult complete

setErrorResult completeExceptionally

DeferredReslut でできることはだいたい CompletableFuture でもできる

Page 21: Spring I/O 2015 報告

21Copyright©2015 NTT corp. All Rights Reserved.

リクエストに対して非同期処理の結果を返す

Before DeferredResult を返す

その後、別のスレッドで…

Page 22: Spring I/O 2015 報告

22Copyright©2015 NTT corp. All Rights Reserved.

リクエストに対して非同期処理の結果を返す

After CompletableFuture を返す

その後、別のスレッドで…

Page 23: Spring I/O 2015 報告

23Copyright©2015 NTT corp. All Rights Reserved.

CORS のビルトインサポート

Web の改善

Page 24: Spring I/O 2015 報告

24Copyright©2015 NTT corp. All Rights Reserved.

• 同一オリジンポリシー• セキュリティのため、オリジンの異なるリソースへ

の AJAX 等の通信を禁止

•CORS• 異なるオリジンへのリソースへ安全にアクセスする

ために定められた仕様

CORS(Cross Origin Resource Sharing)

http://xxx.com:80 https://yyy.org:8080

HTML を取得AJAX 等

ドメイン , ポート等

リクエスト

オリジン A

オリジン B

オリジン C選別する

Page 25: Spring I/O 2015 報告

25Copyright©2015 NTT corp. All Rights Reserved.

CORS のサポート

@CrossOrigin

After

Before サードパーティのライブラリ等を利用

@CrossOrigin でクラス / メソッド単位に設定

例: CORS Filter(http://software.dzhuvinov.com)

web.xml で一括フィルタリング

Page 26: Spring I/O 2015 報告

26Copyright©2015 NTT corp. All Rights Reserved.

• JavaConfig

•XML

一括でフィルタリングしたいとき

CorsRegistory にマッピングを追加

mvc:cors にマッピングを追加

Page 27: Spring I/O 2015 報告

27Copyright©2015 NTT corp. All Rights Reserved.

HTTP キャッシュの改善

Web の改善

Page 28: Spring I/O 2015 報告

28Copyright©2015 NTT corp. All Rights Reserved.

Cache-Control ヘッダ

HTTP レスポンスのヘッダでコンテンツのキャッシュの扱いを指定する

Cache-Control: no-store

例:キャッシュしない

Cache-Control: max-age=3600, private

キャッシュしたレスポンスは 3600 秒間有効キャッシュを他のユーザと共有しない

Page 29: Spring I/O 2015 報告

29Copyright©2015 NTT corp. All Rights Reserved.

Cache-Control の設定方法

Before WebContentInterceptor に設定

After 新しく追加された CacheControl ビルダを利用

プロパティをチェイン

Page 30: Spring I/O 2015 報告

30Copyright©2015 NTT corp. All Rights Reserved.

JavaScript View テンプレート

Web の改善

Page 31: Spring I/O 2015 報告

31Copyright©2015 NTT corp. All Rights Reserved.

JavaScript View テンプレート

JavaScript のテンプレートエンジンをサーバ側で実行1. 初期ページ読み込み速度の改善

→ 特にリソースの限られたモバイル環境で影響大

2. クライアント / サーバ のコード共通化→ 最近流行りの Isomorphic JavaScript

3. SEO 対策→ JavaScript を解釈しないロボットでも コンテンツを取得できる

Page 32: Spring I/O 2015 報告

32Copyright©2015 NTT corp. All Rights Reserved.

•Handlebars http://handlebarsjs.com/

•EJS http://www.embeddedjs.com/

•Mustache https://mustache.github.io/

•React https://facebook.github.io/react/

JavaScript View テンプレート

Page 33: Spring I/O 2015 報告

33Copyright©2015 NTT corp. All Rights Reserved.

• Controller

• テンプレート (Handlebars)

使い方

コンテンツの設定

“Page Title” に置換される

Page 34: Spring I/O 2015 報告

34Copyright©2015 NTT corp. All Rights Reserved.

Config の書き方

ScriptTemplateViewResolver

ScriptTemplateConfigurer

JRuby, Jython も(JSR223)

Page 35: Spring I/O 2015 報告

35Copyright©2015 NTT corp. All Rights Reserved.

WEBSOCKET メッセージング の改善

SPRING 4.2 編

Page 36: Spring I/O 2015 報告

36Copyright©2015 NTT corp. All Rights Reserved.

• メッセージに対する @JsonView のサポート

•接続ユーザ情報の取得

• サーバをまたがる User Destination の解決

• StompSubProtocolErrorHandler

• グローバルな @MessageExceptionHandler

• SimpleBrokerMessageHandler の改善

WebSocket メッセージングの改善

Page 37: Spring I/O 2015 報告

37Copyright©2015 NTT corp. All Rights Reserved.

• STOMP クライアント over TCP/WebSocket

• @SendTo, @SendToUser の改善

•戻り値に ListenableFuture/CompletableFuture

• XML ペイロードのメッセージ / オブジェクト変換

WebSocket メッセージングの改善

Page 38: Spring I/O 2015 報告

38Copyright©2015 NTT corp. All Rights Reserved.

メッセージに対する@JsonView のサポート

WebSocket メッセージング の改善

Page 39: Spring I/O 2015 報告

39Copyright©2015 NTT corp. All Rights Reserved.

• @MessageMapping と @SubscribeMapping のメソッドの戻り値に @JsonView が使用可能に

•今までは @ResponseBody でしか使えなかった→ Web の機能への追従が進む

メッセージに対する @JsonView のサポート

グループの指定

グループの指定

@JsonView(≧4.1) のおさらい

Page 40: Spring I/O 2015 報告

40Copyright©2015 NTT corp. All Rights Reserved.

テストの改善SPRING 4.2 編

Page 41: Spring I/O 2015 報告

41Copyright©2015 NTT corp. All Rights Reserved.

• SpringJUnit4ClassRunner から Rule への置き換え

• ContextCache

• TestContext 周りの改善

• ReflectionTestUtils の static フィールドアクセス

• @DirtiesContext の改善

• 組み込み DB の名前周りの改善

• AopTestUtils による Proxy のターゲットの取得

テストの改善

Page 42: Spring I/O 2015 報告

42Copyright©2015 NTT corp. All Rights Reserved.

SpringJUnit4ClassRunner から Rule への置き換え

テストの改善

Page 43: Spring I/O 2015 報告

43Copyright©2015 NTT corp. All Rights Reserved.

• Spring の機能を JUnit のテストケース内で使用できるようにするテストランナー

• テストケース内で DI したいときなどに用いる

SpringJUnit4ClassRunner

テストランナーはひとつしか指定できない

Page 44: Spring I/O 2015 報告

44Copyright©2015 NTT corp. All Rights Reserved.

別のテストランナーと併用したいとき

Before@Before メソッドで TestContextManager を作成

任意のテストランナー

TestContextManager

Page 45: Spring I/O 2015 報告

45Copyright©2015 NTT corp. All Rights Reserved.

別のテストランナーと併用したいとき

After @Rule と @ClassRule を使う

必ず二つとも記述すること

任意のテストランナー

Page 46: Spring I/O 2015 報告

46Copyright©2015 NTT corp. All Rights Reserved.

セッション紹介編

Page 47: Spring I/O 2015 報告

47Copyright©2015 NTT corp. All Rights Reserved.

タイトル カテゴリ

Building “Bootful” Applications with Spring Boot Boot

Building Microservices with Spring Cloud and Netflix OSS Cloud

Developing and Maintaining Spring-based Enterprise Software: Lessons Learned

事例

Static Resources Management with Spring and Single Page Applications

Web

Inside http://spring.io - a production spring reference application

事例

Real-time with Spring: SSE and WebSockets Web

Testing with Spring 4.x Test

Performance Testing Crash Course その他

Everything you need to know about Java Classloaders その他

Scaling real time search and analytics with Elasticsearch その他

Improving your (legacy) Application with Spring その他

紹介セッション一覧

Page 48: Spring I/O 2015 報告

48Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Josh Long

• デモを交えながら Spring Boot を紹介• Spring Project Initializer

• Web 上のインタフェースでプロジェクト雛形を作成• CommandLineRunner

• コマンドライン引数を与えて実行• REST

• ビューには Thymeleaf を使用• Spring Boot Actuator

• アプリケーションのモニタリング

• 他のセッションでも Boot は当たり前のように使用

Building “Bootful” Applications with Spring Boot

Page 49: Spring I/O 2015 報告

49Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Dave Syer

• マイクロサービスの協調動作のためのボイラープレートに Spring Cloud × Netflix OSS を利用

• 設定の管理• サービス探索• ロードバランサ•耐障害性• …

Building Microservices with Spring Cloud and Netflix OSS

Page 50: Spring I/O 2015 報告

50Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Dave Syer

• マイクロサービスの協調動作のためのボイラープレートに Spring Cloud × Netflix OSS を利用

Building Microservices with Spring Cloud and Netflix OSS

Page 51: Spring I/O 2015 報告

51Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Dave Syer

• マイクロサービスの協調動作のためのボイラープレートに Spring Cloud × Netflix OSS を利用

Building Microservices with Spring Cloud and Netflix OSS

Histrix Ribbon

Eureka Zuul

設定用のアノテーションを提供e.g. @EnableEurekaClient,

@HystrixCommandhttp://cloud.spring.io/spring-cloud-netflix/

Page 52: Spring I/O 2015 報告

52Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Mortiz Kleine

• ドイツの CMS ベンダによる Spring 利用時のノウハウ

• XML で設定し、自作の ContextInitializer で読み込む

• https://gihub.com/mkleine/spring-component-loader

• カスタマイズした XmlBeanDefinitionReader を使用

• 複数の設定ファイルで同一リソースをインポートする際の冗長なロードの問題 (SPR-1142) を避ける

• 複雑になるので AOP は使わない

Developing and Maintaining Spring-based Enterprise Software: Lessons Learned

Page 53: Spring I/O 2015 報告

53Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Brian Clozel@

•静的リソースの扱いについてのワークショップ• < 4.1 ( ワークショップ 1)

•任意の場所にリソースを配置

• Cache-Control によるキャッシュ管理

Static Resources Management with Spring and Single Page Applications(Workshop)

https://github.com/bclozel/resource-handling-workshop

Page 54: Spring I/O 2015 報告

54Copyright©2015 NTT corp. All Rights Reserved.

• ≧ 4.1 ( ワークショップ 2[AngularJS], 3[ES6])

• Webjar のビルド• リソースを target/classes/static に配置• 開発時はプロファイルを切り替えローカルファイル

を参照• fingerprinting によるキャッシュ

• ファイル名ベースのバージョニング• Minify 等はクライアントサイドのツールを使う

•講演者: Brian Clozel@

•静的リソースの扱いについてのワークショップ

Static Resources Management with Spring and Single Page Applications(Workshop)

https://github.com/bclozel/resource-handling-workshop

Page 55: Spring I/O 2015 報告

55Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Brian Clozel

• Spring の公式サイト (http://spring.io) 自体のプロジェクト (Sagan) について

• クライアントサイドリソースの管理

• Spring Boot の利用

• Java8(lambda, stream) によるリファクタリング

• Spring IO Platform への移行

• HipChat を利用したコミュニケーション

• Blue/Green デプロイメント

Inside http://spring.io - a production spring reference application

Page 56: Spring I/O 2015 報告

56Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Sergi Almar

• Spring における SSE, WebSocket の利用法を紹介

• SSE, WebSocket についての解説

• Spring 4.2 における SSE の利用法•本日解説済み!

• Spring の WebSocket と JSR-356 の違い• SockJS によるフォールバック• STOMP のサポート• セキュリティ

Real-time with Spring: SSE and WebSockets

Page 57: Spring I/O 2015 報告

57Copyright©2015 NTT corp. All Rights Reserved.

•講演者: San Brannen

• Spring4.0, 4.1 のテスト関連機能の紹介• Spring4.2 で導入される機能の紹介

•本日解説しなかった内容• @DirtiesContext に before method, before class

を追加

• 組み込みデータベースに対する固有名の生成• <jdbc:embedded-database /> に database-name 属性

を追加

• ReflectionTestUtils で static なフィールドにアクセス

Testing with Spring 4.x

Page 58: Spring I/O 2015 報告

58Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Dustin Whittle

• 多数のアプリケーションの性能試験ツール / サービスの紹介

• 汎用• Apache Bench• Seige• Apache JMeter• Multi-Mechanize

• クラウド / 分散環境• Bees with Machine Guns• locust.io

• クライアントサイド• Google PageSpeed• WBench

Performance Testing Crash Course

・パフォーマンストラッキング  ・ Statsd + Graphite + Grafana  ・webpagetest.org  ・ SiteSpeed.io  ・ APP DYNAMICS・ Load testing  ・ Apica  ・ BLITZ  ・ BlazeMeter

とにかく沢山紹介

Page 59: Spring I/O 2015 報告

59Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Oleg Selajev

• クラスローダの基本動作とエラー発生時の対処

•詳細は割愛

Everything you need to know about Java Classloaders

NoClassDefFoundErrorNoSuchMethodError 等

Page 60: Spring I/O 2015 報告

60Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Clinton Gormley

• Elasticsearch の動作とスケールアウトの仕組み

•詳細は割愛

Scaling real time search and analytics with Elasticsearch

Page 61: Spring I/O 2015 報告

61Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Marten Deinum

• モノリシックな古い Spring アプリケーションをリファクタリングするデモ

• Spring 2.0.8 → 3.2.13 へのアップグレード• SimpleFormController への置き換え

• テストケースを書く

• サービスを機能で分割し,パッケージも分ける• Event を使って結合を疎に

• 分割したサービスを独立したアプリケーションに• Boot を使う

• Controller をリファクタリング• @Controller と @RequestMapping に書き換える

Improving your (legacy) Application with Spring

Page 62: Spring I/O 2015 報告

62Copyright©2015 NTT corp. All Rights Reserved.

•講演者: Marten Deinum

• モノリシックな古い Spring アプリケーションをリファクタリングするデモ

• Spring 2.0.8 → 3.2.13 へのアップグレード• SimpleFormController への置き換え

• テストケースを書く

• サービスを機能で分割し,パッケージも分ける• Event を使って結合を疎に

• 分割したサービスを独立したアプリケーションに• Boot を使う

• Controller をリファクタリング• @Controller と @RequestMapping に書き換える

Improving your (legacy) Application with Spring

密結合,大規模 → 疎結合,小規模適切な手順を踏めばアップグレードは怖くない!

Page 63: Spring I/O 2015 報告

63Copyright©2015 NTT corp. All Rights Reserved.

http://www.springio.net

リファレンス

スライドへのリンク