Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

34
Copyright©2016 NTT corp. All Rights Reserved. Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions 2016年6⽉22⽇ NTT ソフトウェアイノベーションセンタ 岩塚 卓弥

Transcript of Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

Page 1: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

Copyright©2016 NTT corp. All Rights Reserved.

Spring I/O 2016 報告Test / Cloud / Other Popular Sessions2016年6⽉22⽇NTT ソフトウェアイノベーションセンタ岩塚 卓弥

Page 2: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

2Copyright©2016 NTT corp. All Rights Reserved.

• 名前:岩塚 卓弥

• 所属:NTT ソフトウェアイノベーションセンタ• NTTの研究所のうちソフトウェアを専⾨に扱う• ⾃部署ではソフトウェア⼯学を研究• Springベースのグループ共通フレームワークの整備を担当• Spring本2冊にレビュアーとして参加

• 改訂新版 Spring⼊⾨,Spring徹底⼊⾨• 良い本なので両⽅買おう!

• Spring I/Oには⼆年連続での参加• 去年よりTシャツがカッコイイ!• 今年は⽇本からの参加者が増えて素晴らしい!

⾃⼰紹介

Page 3: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

3Copyright©2016 NTT corp. All Rights Reserved.

• Spring I/O 2016のセッションのうち以下を紹介• テストに関するセッション

• Testing Spring Boot Applications• Phil Webb

• JUnit 5 – Shaping the Future of Testing on the JVM• Sam Brannen

• クラウドに関するセッション• Spring Cloud *: Exproling Spring Cloud Implementations

• SPENCER GIBB

• (Optional)その他の⼈気セッション• Cacheing with Spring: Advanced Topics and Best Practices

• MICHAEL PLÖD• Understanding Microservice Performance

• ROB HARROP

今⽇話す内容

Page 4: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

4Copyright©2016 NTT corp. All Rights Reserved.

テストに関するセッション

Page 5: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

5Copyright©2016 NTT corp. All Rights Reserved.

• Spring Boot 1.4におけるテスト機能の改善について

Testing Spring Boot Applications

コミットログを古い順から追っていくと1.3→1.4への変更が分かるようになっている

Page 6: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

6Copyright©2016 NTT corp. All Rights Reserved.

• 時間がないのでダイジェストでお送り致します• コミットログを追いながら10個のポイントを紹介

• 気になるところは以下の資料をチェック!• リポジトリ:https://github.com/philwebb/testing-

spring-boot-applications

• リファレンス:http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle

• 公式ブログ:https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4

Page 7: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

7Copyright©2016 NTT corp. All Rights Reserved.

1. SpringRunnerの使⽤

機能は同じ

Before (≦ Spring Boot 1.3)

After (Spring Boot 1.4 ≦)

Page 8: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

8Copyright©2016 NTT corp. All Rights Reserved.

2.@SpringBootTestの使⽤Before (≦ Spring Boot 1.3)

⼀つのアノテーションに集約After (Spring Boot 1.4 ≦)

Page 9: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

9Copyright©2016 NTT corp. All Rights Reserved.

3. ContextConfigurationの推論Before

After消えた!

classesを省略&@Configurationが内部に定義されていない場合⾃動的に@SpringBootConfigurationを探す

Page 10: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

10Copyright©2016 NTT corp. All Rights Reserved.

4. @LocalServerPortの使⽤Before (≦ Spring Boot 1.3)

After (Spring Boot 1.4 ≦)

汎⽤的な@Valueに代わって専⽤のアノテーションを使⽤

Page 11: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

11Copyright©2016 NTT corp. All Rights Reserved.

5. TestRestTemplateを@AutowiredBefore

Before

Before (≦ Spring Boot 1.3)

Page 12: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

12Copyright©2016 NTT corp. All Rights Reserved.

5. TestRestTemplateを@AutowiredAfter

After

After (Spring Boot 1.4 ≦)

“http://localhost:${local.server.port}” が設定済み

Page 13: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

13Copyright©2016 NTT corp. All Rights Reserved.

6. @DataJpaTestの使⽤

New(Spring Boot 1.4 ≦)

デフォルトで@Transactional &⾃動的に組み込みDBが設定される

New (Spring Boot 1.4 ≦)

Page 14: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

14Copyright©2016 NTT corp. All Rights Reserved.

7. @AutoConfigurableTestDatabaseの使⽤New (Spring Boot 1.4 ≦)

⾃動的に組み込みDBが設定され,既存のDataSourceを置き換える

Page 15: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

15Copyright©2016 NTT corp. All Rights Reserved.

8. @JsonTestの使⽤New (Spring Boot 1.4 ≦)

New (Spring Boot 1.4 ≦) Spring Boot 1.4からはspring-boot-starter-testでAssertJが依存ライブラリに

追加される

Page 16: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

16Copyright©2016 NTT corp. All Rights Reserved.

9. @MockBeanの使⽤New (Spring Boot 1.4 ≦) Mockitoのmockを作成し

applicationContextに登録/置換

Page 17: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

17Copyright©2016 NTT corp. All Rights Reserved.

10. @WebMVCTestの使⽤New (Spring Boot 1.4 ≦) テスト対象のController

⾃動設定されたMockMvc

必要なコンポーネントのMockを作成

Page 18: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

18Copyright©2016 NTT corp. All Rights Reserved.

JUnit 5 – Shaping the Future of Testing on the JVM

・Modular全部⼊りのjarをやめてモジュール化

・ExtensibleRunner, @Rule, @ClassRuleをやめてシンプルに

・ModernJava8対応(Lambda, Stream, …)

・Forward & backward compatibleJUnit4でJUnit5のテストが動くJUnit5でJUnit4のテストも動く

5.0.0.GA late 2016!

スライド:http://www.slideshare.net/sbrannen/junit-5-from-lambda-to-alpha-and-beyond

Page 19: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

19Copyright©2016 NTT corp. All Rights Reserved.

Springとの連携

@RunWith(SpringRunner.class)@ContextConfigurationpublic class HogeTest{

Before (JUnit4)Spring 4.2までの場合は

SpringJUnit4ClassRunner.class

@RunWith(Theories.class)@ContextConfigurationpublic class HogeTest{

@ClassRulepublic static final SpringClassRule SPRING_CLASS_RULE =

new SpringClassRule();@Rulepublic final SpringMethodRule springMethodRule = new SpringMethodRule();

Spring 4.1までの場合はTestContextManagerを使⽤

他のRunnerを使いたい場合

Before (JUnit4)

Page 20: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

20Copyright©2016 NTT corp. All Rights Reserved.

Springとの連携

@ExtendWith(SpringExtension.class)@ContextConfigurationpublic class HogeTest{

After(JUnit5)

必要ならば複数のExtensionを指定できる

@AutowiredDog dog;

@Testvoid autowiredParameter(@Autowired Dog dog){

従来通りDI可能

メソッドの引数にもDIできる(by JUnit5 Extension API)

参考資料:https://github.com/sbrannen/spring-test-junit5/

Page 21: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

21Copyright©2016 NTT corp. All Rights Reserved.

クラウドに関するセッション

Page 22: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

22Copyright©2016 NTT corp. All Rights Reserved.

• Spring Cloundのロードマップ• Brixton GA:2016/5/11• Camden:2016年3Q (follow Spring Boot 1.4)• Dalston:2017年2Q (follow Spring 5 & Spring Boot 2.0)

• Service DiscoveryとDistributed Configurationについて3つのプロダクトを⽐較

• Eureka• Consul• Zookeeper

Spring Cloud *: Exproling Spring Cloud Implementations

Proʼs・Service Discovery & Configuration・HTTP API & DNS Interface・Health Check ・…(多数)Conʼs・Young・Agent on every host

スライド:https://spencer.gibb.us/preso/2016-05-18%20Spring%20Cloud%20Discovery%20and%20Config%20Sys%20Comparison.pdf

Page 23: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

23Copyright©2016 NTT corp. All Rights Reserved.

Consulの利点 – Service Discovery & Configuration

Node_A

Consul Agent (Client)

Service_A Service_B

Node_B

Consul Agent (Client)

Service_B Service_C Service_D

K/V Store

Node_S

Consul Agent (Server)

Data Center

…GET /v1/catalog/service/Service_C

[{“Node”:”Node_B”, “Address”:...

Service Discovery

Page 24: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

24Copyright©2016 NTT corp. All Rights Reserved.

Consulの利点 – Service Discovery & Configuration

Node_A

Consul Agent (Client)

Service_A Service_B

Node_B

Consul Agent (Client)

Service_B Service_C Service_D

K/V Store

Node_S

Consul Agent (Server)

Data Center

…GET /v1/kv/foo

[{...,”Value”:” YmFy”, ...,

Configuration

Page 25: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

25Copyright©2016 NTT corp. All Rights Reserved.

Consulの利点 – HTTP API & DNS Interface

Node_A

Consul Agent (Client)

Service_A Service_B

HTTP API経由だけでなくDNSでService Discoveryできる

$ dig @127.0.0.1 -p 8600 Service_C.service.consul SRV

…;; ANSWER SECTION:Service_C.service.consul. 0 IN SRV ...

Page 26: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

26Copyright©2016 NTT corp. All Rights Reserved.

Consulの利点 – Health Check

Node_A

Consul Agent (Client)

Service_A Service_B

Node, Serviceに対してそれぞれチェック内容を定義可能

・Script Check:外部スクリプトを定期実⾏・HTTP Check:GETリクエストを定期発⾏・TCP Check:TCPコネクションを定期試⾏・TTL Check:

⼀定期間内にステータスが更新されているかチェック・Docker Check:

Dockerコンテナ内の外部スクリプトを定期実⾏

Page 27: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

27Copyright©2016 NTT corp. All Rights Reserved.

Spring Cloud Consul

・Service DiscoveryやDistributed ConfigurationにConsulを使⽤

・Spring Cloud Netflixを使ってRibbonやZuulとも連係可能

Page 28: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

28Copyright©2016 NTT corp. All Rights Reserved.

その他の⼈気セッション

Page 29: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

29Copyright©2016 NTT corp. All Rights Reserved.

• Spring I/O 2016 ⼈気No.2セッション• エンタープライズアプリケーションにおけるキャッシュについての9つのベストプラクティス

• 分散の⽅針やキャッシュの対象について• Springのキャッシュ抽象化機能について

Cacheing with Spring: Advanced Topics and Best Practices

スライド:https://www.innoq.com/de/talks/2016/05/caching-spring-best-practices/

Page 30: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

30Copyright©2016 NTT corp. All Rights Reserved.

• Spring I/O 2016 ⼈気No.3セッション• 性能に関する以下のトピックをシミュレーションしながら解説

• 性能を正しく測る• 潜在的な性能障害を⾒つける• 最適化の候補を正しく特定する• 複雑なマイクロサービスをモデル化する• システムのスケーラビリティを予測する

Understanding Microservice Performance

スライド(動画):https://www.youtube.com/watch?v=SjC9bFjeR1k

Page 31: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

31Copyright©2016 NTT corp. All Rights Reserved.

参考:レイテンシとパーセンタイル

42回リクエストすれば約9割の確率で95パーセンタイル値以上のレイテンシを経験する

1 � 0.9542 = 0.88401...

レイテンシはロングテイルな分布になることが多い→ 分布を測定し,テイルに着⽬することが重要

レイテンシ

少⼩ ⼤

多くのユーザが⾼確率でこの辺りのレイテンシを経験することになる

Page 32: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

32Copyright©2016 NTT corp. All Rights Reserved.

参考:リトルの法則

L = �W

リトルの⽅式:安定したシステムにおいて

L:平均待ち⾏列数(同時処理リクエスト数)λ:平均到着率(スループット)W:平均待ち時間(レイテンシ)

Lがシステムの限界を超えるとどこまでも性能が劣化する→ 利⽤率が⾼いというのは危険な兆候

Page 33: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

33Copyright©2016 NTT corp. All Rights Reserved.

参考:Universal scalability law

C(N) =N

1 + �(N � 1) + �N(N � 1)

Universal scalability law:

C:キャパシティN:並列数α:競合コストβ:⼲渉コスト

(0 � �, � < 1)

・理想的(α=β=0)にはNを増やすだけスケール(C(N)=N)・β=0のときはアムダールの法則と⼀致・0<βのときは,Nが単調増加しなくなる

→ βを突き⽌めて最適化の対象とすることが重要

Page 34: Spring I/O 2016 報告 Test / Cloud / Other Popular Sessions

34Copyright©2016 NTT corp. All Rights Reserved.

•今⽇紹介できたのはほんの⼀部だけ• 是⾮スライドやリポジトリを⾒に⾏って下さい!

•できれば現地で聴講するのがベスト• デモやライブコーディングはこういった場での再現が難しい

• 機会があれば是⾮参加しましょう!

終わりに