読者です 読者をやめる 読者になる 読者になる

たけこうの意識低い系ブログ

@talfi121 意識低い系エンジニアのブログです。時々思いついた時に書きます。極稀にエンジニアっぽい技術系を書きます。

JJUGナイトセミナー Javaフレームワーク特集 に行ってきた

6/27に開催されたJJUGナイトセミナーに行ってきたのでその参加レポートというか自分用メモです。
かなり長くなった。。。
まとめる能力(´・ω・`)

【東京】JJUGナイトセミナー Javaフレームワーク特集 - WildFly Swarm / Play Framework / Spring Boot
会場 日本オラクル株式会社 本社 13階
https://jjug.doorkeeper.jp/events/46954
ハッシュタグ#jjug
Togetterhttp://togetter.com/li/992744

WildFly Swarm - Rightsize Your Java EE Apps

田邊 義真さん (@emaggame)

以下メモ

WildFly / WildFly Swarm??

WildFly

Java EE7 対応APサーバ
Java9で入るJigsaw的なModule class loader

WildFly Swarm

各種インテグレーション:NetFlixとか
SpringBootっぽいよね?
Wildfly-bootというrepositoryがあるので元々はこういう名前だったのではないか

All In One のためスリム化は自身で行う必要がある
削ることはできるけど依存してたりするので大変
分割と再構築Fractionという単位で構成されていて必要な物だけ使えるぜ

基本的な使い方

WildFlyを表すcontainerというものをnewする
スライドはmvnだけですがgradleもあるよ
普通のWildFly: 1.ダウンロード/インストール 2.設定 3.起動&デプロイ
通常のWildFlyと比較すると依存性で解決できて、
設定・起動・デプロイはmain()で記述できて楽

Fractions

機能や設定の単位
とりあえず有効にすると、いい感じに設定してくれる
色々あるけど今回は一部紹介
※ここは実際にコード見ながらの説明だったのでスライドを見たほうが良い(15ページから)

core

JavaEEWildFlyのsubsystem相当
jpaを指定すればdatasourceも付いてくる

  • Datasources
  • WildFlyAPIそのままメソッドになってるぜ

Arquillian(テスト)

Mockを使わず本物のEJPやCDIコンテナを利用できる
WildFly を事前にインストールする必要があるけどSwarmは不要

Netflix OSS

現状はRibbonとHystrixのみ
使う下準備を支援
必要なライブラリの用意とか
Spring Bootみたいに annotation 1発で色々やってくれるわけではない
→issueが上がっている
興味ある人は公式tutorialへ

Topology

サービスディスカバリ
jgroups consul openshiftの3種類の実装が利用できる
3種類の実装があるが、意識せずにサービス登録可能

keycloak

認証/認可に対応した SSOサーバ
認証クライアント設定用APIを提供
マイクロサービスで1個1個認証書いているとツラいので認証サーバ用意するときに使える

Swagger

APIからドキュメントやモックを生成
JAX-RSで利用する場合下準備がかなり必要だがそれをやってくれる
annotationを追加することで動作を登録できる
Swagger UIを使ってドキュメント化が可能

Spring/Spring Boot

Spring + WildFlyはよく見かける組み合わせ
「対立する必要はないと思っている」
ユーザガイド未記載のためサンプル参照

便利な機能

project-stages.yml

ステージごとに設定が可能
起動時にステージを指定する

コミュニティ

  • @wildflyswarm
  • Google Groups
  • IRC
    比較的活発

最後に

一通り WildFly Swarm を触ってみるガイドを作ってみたとのこと
WildFly Swarm Tour
まだGAではないものの大分安定してきた
開発から1年で今後活かすも殺すもコミュニティ次第

Q&A(曖昧)

Q:Arquillianはサーバ立ててやりますが、一部だけモック化して行うことは可能ですか?
A:一気通貫でやるのがArquillianの方針であると思っていて一部モック化というものはやったことがない


The High Velocity Web Framework For Java and Scala

株式会社 DTS 梅澤 雄一郎さん (@garbagetown)

PlayFrameworkドキュメント翻訳仲間募集してますとのこと

スライドは後日公開? 公開されてた

免責事項:PlayはWebのフレームワークであり、Javaフレームワークではない。

以下メモ

Playの歴史

Frameworkは登場の背景とかを知ってないと間違ったところに適応されることがある
1系は 1.2 で終わったと思ったら、最近エストニアの方がメンテしている

Play1の歴史

Java6とかSAStrutsとかの時代、傍でRailsが絶好調
Java全体で停滞感
SunもOracleに買収された
WebはステートレスだからServletやめたった的な感じ
http://ikeike443.hatenablog.com/entry/20120107/p1

Javaではないなにか
  • groovy テンプレート
  • 起動高速化のためのPython使用
  • 割りきったクラス名
  • 例外を継承した戻り値
  • リフレクション・バイトコード多用
Javaの非合理な慣習や機能不足への調整

長ったらしいパッケージ名とか言ってたけどメモ追いつかなかった

そしてPlay2へ

これからリアルタイムWebだから非同期に

Play2の歴史

2012~
フレームワークの世代交代
当時はJamesが牽引していたがLagomに専念するらしい

Scalaで全面的に書き直し

2.0 当初は不十分で品質も不安定でメーリングリストが荒れた
2.3 から品質が安定

Akka統合

Akka:並行分散処理フレームワーク

特徴

Webフレームワーク

  • Servlet API非依存
    warも出来ないこともないけど茨の道
    組み込みNettyで動作(ここがAkka HTTPに変わるかも)
  • ステートレスアーキテクチャ
    サーバ側セッションなし
    Railsと同じでクライアント側Cookieセッション、Flash

ホットリロード

  • サーバを再起動せずに開発
    組み込みECJでcompile
    クラスローダ差し替え
  • Java/Scalaソース以外も静的検査
    アセット、トランスファイルしてくれる
    基本的にScalaにcompileされる

スキーマ管理

Evolutions

フルスタック

Web開発に必要な機能をデフォルト提供

  • ORM
  • バッチジョブ
  • Test
  • WebSocket
  • MVC

モジュール

便利な機能をモジュールで提供

Java/Scala API

  • Play1
    Scala APIはモジュールでサポート
  • Play2
    JavaAPIとScalaAPIのパッケージが非常に分かりにくい

非同期処理

Akka Actorに委譲する
「lagomとの統合も進むとPlayの役割がなくなっていくのでは」

lagom

マイクロサービスフレームワーク
サーキットブレイカー搭載
Java APIが搭載

使い方

Play2.4/Javaでの紹介

黒い画面苦手な人向けにActivatorUIもあるよ

  • IDE IDEAがオススメ Eclipseはちょっと手間

  • ディレクトリ構成が特殊

    • モデル
    • ビュー
    • コントローラ
    • ルーティング
  • app:MVC

  • public:アセット
  • conf:設定ファイル
  • test:テスト

PlayはRailsみたいにmodelの方にfinderを作ることが多い
View は Scala で書くのでScalaは避けられない
テンプレート名.renderでビューをレンダリングできる
conf/routesでルーティング情報を一元管理
router.Routes.scalaにcompileされる

利点/欠点

Play1

  • 大きな仕様変更はない見込み
  • 軽快な開発(ホットリロード)
  • Lombokとの相性が悪いらしい
  • ギヨームがコミッターを外れたのでサポート体制が不安

Play2

  • Scala Webフレームワークのデファクトスタンダード
  • Play2を追いかければリアクティブを追っていくことになる
  • 下位非互換性
  • compile速度 「APIサーバとして利用すればいいんじゃない?」とのこと

Q&A

Q:Play2とServlet使ってるSpringとかとの性能の差はありますか? A:単純なHTTPサーバならそんなに差はない モバイルからとかDBにバンバン書き込む場合はAkkaに丸投げするのがいいでしょう


From Zero to Hero with REST and OAuth2

Pivotalジャパン株式会社 槙 俊明さん (@making)

当初は「Spring Bootで作る簡単OAuth2 SSOシステム」でしたがタイトル変更
時間延長で1時間の枠に

9割ライブコーディングで、正直言ってかなり速かったので全然メモが追いつかなかった(´・ω・`)
メモ追いつかないどころか内容もほぼ追いつけなかった orz
速すぎてついていけないのにとりあえずSpring BootでSSOしてみようと思わせるプレゼンでした

とりあえずコチラに従えば同じものが作れるのでやりましょうってことで

OAuth2

トークンを払い出すためのフローがいくつかある

  • Resource Owner Password Credentials
    UserID と Passwordを使ってトークンを払い出す
    認証サーバにアクセスしてトークンを払い出してもらってそれを保持
  • AuthorizationCode
    Web UI -> authorize認証サーバ -> redirect -> loginpage -> Web UIがcode取得 -> redirect

以下なんかとってたメモ

簡単なメッセージを登録するものを作成

CrudRepositoryをextendすれば自動でCRUDできる

HAL
HAL Browser(Swaggerみたいなもの)

@RepositoryEventHandler(Entity.class) eventでのトランザクション
@Transactionalつけとけば一緒なトランザクション
つけなければ別トランザクション

@EnableResourceServerつけて

@RequestMapping(path = "/userinfo", method = RequestMethod.GET)
Object userinfo(Authentication authentication) {
    return authentication;
}

作ればTokenを払い出した人の情報を返すAPIを作成できる

resourceserverに「security.oauth2.resource.user-info-uri」を追加すればtokenを持ってアクセスしてきた人の情報を取得できるようになる

HATEOASを使うと _link とかの形式のJSONを、Javaのオブジェクトにデシリアライズできる

Twitter連携とかで出てくる許可しますか画面出てくるけど設定で出さないようにも出来るよ

「@EnableOAuth2Ssoをつければいろんなことやってくれます」

JWT

GitHub 連携したら遅く感じたのはREST APIが毎回ユーザ情報をAuthorizatioon Serverに問い合わせているせい
JWTを使うと解決する
Spring の自動設定から外れる
鍵の情報を設定する必要あり、propertiesだとつらいので yaml

Maki Home UAA

「槙家のAuthorization Server を使えるようにしてある。OAuth2に準拠していて、拡張しやすい」
「家庭内システムあるでしょ?アカウント毎回作ると嫁が怒るからSSOするしかない」


感想

ちゃんと全部真面目に聞いてたけど正直、槙さんのライブコーディングが速すぎてスゴすぎて全てをそこに持ってかれた感

ライブコーディング見てたけどもう何が起きてるのか全然ついていけなかったのでとりあえず写経して動かしてみるところからやらないとダメだなという結論

Spring Bootは触ったことあるけど、WildFly SwarmとPlayは触ったことないのでとりあえずなんか動かしてみよう

梅澤さんが仰っていた

「Frameworkは登場の背景とかを知ってないと間違ったところに適応されることがある」

という言葉がグサッときた

背景あまり知らないしフレームワーク使う側ですらなく、フレームワークに使わされてる感あるので精進します(´・ω・`)