AppEngine × Spring Boot × Kotlin

AppEngine × Spring Boot × Kotlin

2017.10.26
AppEngine ja night #2

9054e8c93ca920a18b9822237c09f0a4?s=128

Hidetake Iwata

October 26, 2017
Tweet

Transcript

  1. AppEngine × Spring Boot × Kotlin Hidetake Iwata (@int128) AppEngine

    ja night #2
  2. Hidetake Iwata Software Engineer at NTT DATA ※今日は個人的なお話です 2

  3. agenda 1. AppEngine × Spring Boot × Kotlinでサービスを作った話 2. Gradleのプラグインを作った話

    3. CircleCIによる継続的デプロイ 3
  4. GradleUpdate ビルドツール(Gradle)の新しいバージョンが出たら、バージョンアップのPull Requestを 送ってくれるサービスを開発中 https://gradleupdate.appspot.com • AppEngine Standard • Spring

    Boot • Thymeleaf • Kotlin • EGit
  5. AppEngine/Java 最近のStandard Environmentは大幅に改善されている • Java 8に対応 • Servlet 3.1に対応 •

    クラス制限の廃止、スレッド生成の対応 (心の声...) • もうJava 9が出たよ • 時代はGolang一択では 5
  6. Spring Boot Pros • JVM言語のWebアプリケーションフレームワークではデファクトスタンダード (Java, Groovy, Kotlin) • エコシステムが発達している

    Cons • 初期化が遅い • フットプリントが大きい 6
  7. Kotlin Pros • 既存言語のよいところを取り入れたモダンな言語 • Javaとの相互運用性 • コンパイルが速い Cons •

    欠点は無い? 7
  8. AppEngine × Spring Boot × Kotlin Pros • モバイルアプリとバックエンドを同じ言語で実装できる(Android) •

    大抵のSpring Bootアプリはちゃんと動く • うれしい無料枠 Cons • エコシステムが未発達なのでLow Level APIに頼らざるを得ない • Too long spin up time • AppEngineとSpring Bootの相性 8
  9. ⚠ Too long spin up time問題 トラフィックが増えてスケールアウトする と、 大きなレイテンシが発生する 約20~25秒のレイテンシ

    • 7秒(コンテナの起動) • 5秒(JVMやJettyの起動) • 8秒(Springの初期化) 9
  10. ⚠ AppEngineとSpring Bootの相性問題 ⚠ Problem • Spring Security OAuth2でセッションにアクセストークンが保存されない https://stackoverflow.com/questions/45217234/issue-with-using-spring-oauth-o

    n-java8-standard-environment Workaround • AppEngine標準のセッションハンドラを使わない • Spring SessionでMemcache/Datastoreにセッション情報を保存 https://github.com/int128/spring-session-appengine
  11. appengine-spring-boot-plugin Gradle plugin for App Engine Standard and Spring Boot

    https://github.com/int128/appengine-spring-boot-plugin Features • Watch and Sync resources(テンプレートを編集したらリロードで反映) • Spring Bootのデバッグモードを有効化(テンプレートのキャッシュオフ等) • 環境依存値の管理
  12. CircleCIによる継続的デプロイ GitHubにpushした契機でAppEngineにデプロイしたい • CircleCI 2.0を使う • サービスアカウントの秘密鍵はBASE64で環境変数に入れておく • google/cloud-sdk:alpineイメージにopenjdk8とapp-engine-javaをインストール •

    GradleのappengineDeployタスクでデプロイ 12
  13. version: 2 jobs: build: docker: - image: google/cloud-sdk:alpine working_directory: ~/gradleupdate

    steps: - run: name: Install command: | apk --update add openjdk8 gcloud components install app-engine-java 13
  14. - deploy: name: Deploy command: | if [ "$CIRCLE_TAG" ];

    then echo "$GCP_SERVICE_ACCOUNT_KEY" | base64 -d > "$HOME/gcp-service-account-key.json" gcloud auth activate-service-account \ --key-file "$HOME/gcp-service-account-key.json" ./gradlew appengineDeploy fi 14
  15. まとめ AppEngine × Spring Boot × Kotlinを快適に使うためのTipsを紹介しました • Gradle plugin

    for App Engine Standard and Spring Boot https://github.com/int128/appengine-spring-boot-plugin • CircleCIによる継続的デプロイ 15