2016年9月3日参加的SpringOne Platform 2016报告会的会议笔记
2016年9月3日春季平台2016報告會參加會議記錄
-
- https://jsug.doorkeeper.jp/events/50931
-
- SpringOne Platform 2016
2016/8/1-4 @Las Vegas
整个活动·主题演讲
-
- 主催がSpringコミュニティからPivotal社に変わった
Pivotal Cloud Foundryのセッションが増えた
参加者2,000人超(昨年の倍)
日本からも約30名が参加(日本人発表者も)
スポンサーの顔ぶれが大幅に変化
Accenture, Google, EMC, Microsoftなど大企業が肩を並べた
NTT Dataもシルバースポンサー
Case Studyが増えた
基調講演
ツールだけでなくソフトウェア開発サイクルを回すCultureが重要(Pivotal Labsの紹介)
Springの歩み
2002 DI/AOP
2007 Annotation Config
2009 Boot/Cloud
Spring 5.0
Reactive対応が目玉
2017 Q1にリリース予定、Java SE9対応は5.1で
Spring 4.xは2019年までサポート
Spring 5.0は来春リリース! クラウドネイティブ開発、マイクロサービス化など最新技術・事例にあふれた4日間
春天的核心
使用Spring Framework 4.3进行现代Java组件设计,《Spring MVC 4 Web Apps》。
Spring Framework的回顾和4.3版本的新功能
-
- 4.2
コンストラクタインジェクション:フィールドをfinalにしてimmutableにできる
Lazy Injection Point
合成アノテーション
public @interface MyCustomeService{}
上書きしたい属性だけ公開できる
4.3
4系のラストリリース、2019年までサポート、SpringBoot1.4のデフォルト
Core Container
コンストラクタが1つなら@Autowiredは省略可能に
JavaConfigクラスでコンストラクタインジェクションできるように
InjectionPoint like CDI:インジェクション先のメタ情報を取れる
ちなみにlombokだと、@Slf3jでLogger logが定義される
Web Improvements
合成アノテーションの追加、@GetMapping @RequestScope
GET付与でHEADとOPTIONが自動サポート
引数に@RequestAttribute(“param1”) String param1 => servlet APIに依存せずに取れる
响应性
“从命令式到响应式的网络应用程序”,”Reactor 3.0a:Java 8和响应流的JVM基础”
-
- Reactive Streams
Stream processing, Asynchronus, Non-blocking, Back pressure
処理しきれなくなったらインスタンスを増やす⇒リソースを効率的に活用
Publisher:無限にご飯を出してくる田舎の親戚、Subscriber:帰省した青年
Reactor 2.x:正直言ってクソだった(やろうとしていることが多すぎる、多すぎて分からない)
Reactor 3.0
Publisher
Mono[0|1]とFlux[n]
Reactive Streamsのpublisherの実装
RxJava(Netflix製)はReactive Streams準拠を重視していない(ユーザの多くがAndroid)
Spring 5はReactor Coreに依存している、Springの歴史の中で何かに依存するのははじめて
“面向JVM的轻量级Rx API”
SpringOne Platform 2016 报告会 (JVM的轻量级Rx API)
-
- [元セッション]A lite Rx API for the JVM
[元セッション]lite-rx-api-hands-on
Reactive
広義にはnon-blockingでevent-drivenなシステムを形容する言葉
ユースケース:スケール、安定的に動作、キャパシティプランニング容易性
BigData processing、外部サービスに依存するwebapp、データ生成側と利用側の処理速度に非対称性があるシステム、大量のクライアントを捌く必要のあるシステム
Reactive Streams
非同期ストリーム処理の標準仕様
j.u.c.FlowとしてJava9にも組み込まれる予定
Subscriberが受け取るデータの個数を、自身でコントロール可能(backpressure)
Publisher, Subscriber, Subscription, Processor
Component A -> T1 -> Processor -> T2 -> Component B
Reactive API Library
RxJava 2.0
Akka-Stream
Reactor Core
Reactor
リソースの効率性に強くフォーカス
debug, logging, testを容易に行える
Mono
1個(または0個)の値を放出するPublisher
subscribeにcallableを渡すと裏側でsubscriptionを生成してフローが流れる
Flux
複数の値をemitするPublisher
Scheduller
publish/subscribeを行うスレッドのスレッドプールのfactory
single(), parallel(), elastic()
RxJavaとの相互運用
Rxjava1Adapter
Reactor and Spring 5
Flux/Monoを受け取り、返却可能なController
Flux/Monoを返却可能なHttpClient実装
Spring Initializrで手軽に試すことができる:Reactive Web(Spring Bootは1.4.1 SNAPSHOTを選ぶこと)
Reactor API Hands-on
銀の弾丸ではない
安定的な動作、予測可能なキャパシティと引き換えに、オーバーヘッドはある
例:データベースのquery数は増える
非同期処理特有の複雑さ、デバッグのしづらさはある
设计、实施和使用响应式API
-
- [元セッション]Designing, Implementing, and Using Reactive APIs
実用経験に基づいたReactive APIの設計、実装、使用法を紹介
https://github.com/cloudfoundry/cf-java-client
戻り値をvoidにしてはいけない
subscribeするまではただの「設計書」にすぎない
作った設計書を戻り値として返してやる必要がある
Mono delete(String id)
Functional Styleの推奨
副作用のない、単純で小さなメソッドをつくり、組み合わせて大きな処理を行う
組み合わせの道具:高階関数(関数を引数に取る、map/flatmapなど)
メソッド参照による組み立て(複数引数を取る関数には、補助関数とtupleで)
Pointfree Styleの推奨
f = (+1)
条件分岐
エラーによる条件分岐(otherwise)
Emptyによる条件分岐(defaultWithEmptyなど)
値による条件分岐は、if文を使って命令的に書けばよい(Mono/Fluxのメソッドでは直観的に理解しづらくなる)
テスト辛い問題
非同期処理なので、仕事を頼んだ時点で、メインスレッドは終了してしまう
他のスレッドの終了を待つ:java.util.concurrent.CountDownLatch
TestSubscriber⇒同期させるためのコードを自分で書かなくてよくなる
Reactorでは準備中、3.0.0.RELEASEでは除かれた、Clound Foundry Java Clientでは独自に実装したものを利用
追溯
如何正确归咎于导致延迟的事物:介绍分布式追踪和Zipkin技术, 使用Spring Cloud和Zipkin实施微服务追踪, 让我们来可视化您的Spring Boot应用程序。
[SpringOne2016] 使用 Sleuth 和 Zipkin 进行分布式跟踪。
-
- 分散システムを組む時に必ず直面する問題
どこで問題が起きたか、どこがボトルネックか
問題発生個所をログから調べる
リクエストに対してIDを発行してそれを共有
Spring Clound Sleuth
リクエスト全体:Trace、個別リクエスト:Span
HTTP/AMQPヘッダにIDを埋める、受け取ってThreadLocalに入れる、次に渡す・・・の繰り返し
サービスの構造を可視化する
Sleuthで集めた情報を使って、遅いところを探したりサービスの関連を見たい
Zipkin
Find Trace
Dependencies(サービスの関連が可視化される)
sleuthとzipkinの始め方
Spring Initializrで”sleuth” and “zipkin”を探す
zipkin側が落ちていた場合でも漏れなくtraceするには、間にRabbitMQ(かKafka)を挟む
Netflix VIZCERAL
春天云数据流
“云中的数据微服务” de
云中的数据微服务
-
- ETLに代わるもの
-
- Spring XD Streams/ ZooKeeper
stream1 = http | cassandra
課題:scale up / down、upgrade
Refactoring to MSA
コンテナに組み込まれた複数モジュールから、単体で実行されるスタンドアロンアプリへ
独自ランタイムからプラットフォーム委任へ
Spring Cloud Stream
Spring Boot based event-driven microservice framework
kafka inspired
Message Brokerと会話できる
XD-Containerはなくなり、RuntimeはClound Foundryなどに任せる
Spring Cloud Task
Spring Batchとの親和性が高い
Spring 5推出了新的功能性Web API。
-
- Annotation Hell -> Lambda
Spark, Ratpack, vert.x
Lambda-oriented HTTP routing & processing
org.springframework.web.reactive.function
https://github.com/making/demo-lambda-routing
No Reflection. Lightweight & Fast, DI Container is not necesary
will be in Spring 5.0.0.M2 (Sep 15th)
微服务
“消费者驱动的合约与您的微服务架构” de yǔ de
-
- Consumer Drivern Contract
ConsumerがProducerに期待する機能をContractとして共有し、Producerの全Consumerに対する責務をまとめたもの
ProducerとCounsumer間で合意したAPIの利用方法
アーキテクチャレベルのTDD
spring cloud contract
consumer側でcontractを作成(Consumer Driven)してAPIの変更を促す
groovy DSL -> jsonにしてwiremockでstub化してテストを通す(spring cloud contract wiremock)
producerに対してcontractのPRを出す -> producer側はPRを受け入れるとテストコードが自動生成される
“通过聚合形式开发微服务”
[SpringOne2016] 使用聚合开发微服务
[元会议]使用聚合开发微服务
-
- SpringOne 2016 谷本さん的ベストセッション
-
- マイクロサービスでトランザクション管理をどうするのか
2 phase commitはこの先 生き残る選択肢ではない
1回のマイクロサービスコール = トランザクション範囲 = NoSQLトランザクションにしていく
Event drivenを用いた結果整合性
データ更新/イベント発行 ⇒ event sourcing(DBを更新するのではなくイベントを発行する)
履歴の積み重ね ⇒ 順番は関係なく結果整合性ベースで考える
どう集約するかはポリシー次第、ショッピングカードであれば最終的な状態をユーザに確認させる
ACID性を担保したければRDBMSでロックしてやるしかないが、そのACID性は本当に必要か?
状態を更新しない、状態はイベントの蓄積から判断する(CQRSとも親和性が高い)
春季项目
“Spring Data有什么新变化”
[Spring Data有什么新功能?]
-
- Hopper
Spring Framework 4.2ベース
query by example
ExampleにEntity例と一致条件(ExampleMatcher)を渡す
repo.findAll(Example)
Open Projection
findAllProjectedBy()
Spring Data 2.0
Spring Framework 5.0 / JDK 8ベース
reactive(Mongo DB, Redis, Couchbase)
「关于Spring Security 4.1及其后续的发展」
Spring Security 4.1 的新功能
-
- @formatter.off
-
- CookieCsrfTokenRepository
withHttpOnlyFalse()をつけるとJSから取得可能
デフォルトでXSRF-TOKENに格納される
Contents Security Policy
許可するリソース取得元を定義
@AuthenticationPrinciple
Controllerの引数で取得できるようになった
Path Variable in Web Security Expressions
mvcMatcher
AntMatcherだと、末尾に”/”を負荷するとアクセスできてしまう
案例研究
-
- アプリケーションのヘルスチェックと監視 -> Spring Boot Acturator + extention endpoint
-
- Cloud Configで、デプロイなしでアプリケーションの挙動を変更
-
- Spring Initializerをforkしてカスタマイズ
- Microscerviecesは目的にするものではなく、大きいアプリケーションを徐々に分割していった結果
2016年的春天
-
- 11/18(金)9:30-18:30
- http://springday2016.springframework.jp/