Slide 1

Slide 1 text

AppEngine × Spring Boot × Kotlin Hidetake Iwata (@int128) AppEngine ja night #2

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

agenda 1. AppEngine × Spring Boot × Kotlinでサービスを作った話 2. Gradleのプラグインを作った話 3. CircleCIによる継続的デプロイ 3

Slide 4

Slide 4 text

GradleUpdate ビルドツール(Gradle)の新しいバージョンが出たら、バージョンアップのPull Requestを 送ってくれるサービスを開発中 https://gradleupdate.appspot.com ● AppEngine Standard ● Spring Boot ● Thymeleaf ● Kotlin ● EGit

Slide 5

Slide 5 text

AppEngine/Java 最近のStandard Environmentは大幅に改善されている ● Java 8に対応 ● Servlet 3.1に対応 ● クラス制限の廃止、スレッド生成の対応 (心の声...) ● もうJava 9が出たよ ● 時代はGolang一択では 5

Slide 6

Slide 6 text

Spring Boot Pros ● JVM言語のWebアプリケーションフレームワークではデファクトスタンダード (Java, Groovy, Kotlin) ● エコシステムが発達している Cons ● 初期化が遅い ● フットプリントが大きい 6

Slide 7

Slide 7 text

Kotlin Pros ● 既存言語のよいところを取り入れたモダンな言語 ● Javaとの相互運用性 ● コンパイルが速い Cons ● 欠点は無い? 7

Slide 8

Slide 8 text

AppEngine × Spring Boot × Kotlin Pros ● モバイルアプリとバックエンドを同じ言語で実装できる(Android) ● 大抵のSpring Bootアプリはちゃんと動く ● うれしい無料枠 Cons ● エコシステムが未発達なのでLow Level APIに頼らざるを得ない ● Too long spin up time ● AppEngineとSpring Bootの相性 8

Slide 9

Slide 9 text

⚠ Too long spin up time問題 トラフィックが増えてスケールアウトする と、 大きなレイテンシが発生する 約20~25秒のレイテンシ ● 7秒(コンテナの起動) ● 5秒(JVMやJettyの起動) ● 8秒(Springの初期化) 9

Slide 10

Slide 10 text

⚠ 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

Slide 11

Slide 11 text

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のデバッグモードを有効化(テンプレートのキャッシュオフ等) ● 環境依存値の管理

Slide 12

Slide 12 text

CircleCIによる継続的デプロイ GitHubにpushした契機でAppEngineにデプロイしたい ● CircleCI 2.0を使う ● サービスアカウントの秘密鍵はBASE64で環境変数に入れておく ● google/cloud-sdk:alpineイメージにopenjdk8とapp-engine-javaをインストール ● GradleのappengineDeployタスクでデプロイ 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

- 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

Slide 15

Slide 15 text

まとめ AppEngine × Spring Boot × Kotlinを快適に使うためのTipsを紹介しました ● Gradle plugin for App Engine Standard and Spring Boot https://github.com/int128/appengine-spring-boot-plugin ● CircleCIによる継続的デプロイ 15