appengine × spring boot × kotlin
TRANSCRIPT
AppEngine × Spring Boot × Kotlin
Hidetake Iwata (@int128)NTT DATA CORPORATION
AppEngine ja night #2
Hidetake Iwata
Software EngineerNTT DATA CORPORATION
※今日は個人的なお話です
2
agenda
1. AppEngine × Spring Boot × Kotlinでサービスを作った話
2. Gradleのプラグインを作った話
3. CircleCIによる継続的デプロイ
3
GradleUpdate
ビルドツール(Gradle)の新しいバージョンが出たら、バージョンアップのPull Requestを送ってくれるサービスを開発中
https://gradleupdate.appspot.com
● AppEngine Standard● Spring Boot● Thymeleaf● Kotlin● EGit
AppEngine/Java
最近のStandard Environmentは大幅に改善されている
● Java 8に対応
● Servlet 3.1に対応
● クラス制限の廃止、スレッド生成の対応
(心の声...)
● もうJava 9が出たよ
● 時代はGolang一択では
5
Spring Boot
Pros
● JVM言語のWebアプリケーションフレームワークではデファクトスタンダード
(Java, Groovy, Kotlin)● エコシステムが発達している
Cons
● 初期化が遅い
● フットプリントが大きい
6
Kotlin
Pros
● 既存言語のよいところを取り入れたモダンな言語
● Javaとの相互運用性
● コンパイルが速い
Cons
● 欠点は無い?
7
AppEngine × Spring Boot × Kotlin
Pros
● モバイルアプリとバックエンドを同じ言語で実装できる(Android)● 大抵のSpring Bootアプリはちゃんと動く
● うれしい無料枠
Cons
● エコシステムが未発達なのでLow Level APIに頼らざるを得ない
● Too long spin up time● AppEngineとSpring Bootの相性
8
⚠ Too long spin up time問題
トラフィックが増えてスケールアウトする
と、
大きなレイテンシが発生する
約20~25秒のレイテンシ
● 7秒(コンテナの起動)
● 5秒(JVMやJettyの起動)
● 8秒(Springの初期化)
9
⚠ AppEngineとSpring Bootの相性問題
⚠ Problem
● Spring Security OAuth2でセッションにアクセストークンが保存されない
https://stackoverflow.com/questions/45217234/issue-with-using-spring-oauth-on-java8-standard-environment
Workaround
● AppEngine標準のセッションハンドラを使わない
● Spring SessionでMemcache/Datastoreにセッション情報を保存
https://github.com/int128/spring-session-appengine
appengine-spring-boot-plugin
Gradle plugin for App Engine Standard and Spring Boothttps://github.com/int128/appengine-spring-boot-plugin
Features
● Watch and Sync resources(テンプレートを編集したらリロードで反映)
● Spring Bootのデバッグモードを有効化(テンプレートのキャッシュオフ等)
● 環境依存値の管理
CircleCIによる継続的デプロイ
GitHubにpushした契機でAppEngineにデプロイしたい
● CircleCI 2.0を使う
● サービスアカウントの秘密鍵はBASE64で環境変数に入れておく
● google/cloud-sdk:alpineイメージにopenjdk8とapp-engine-javaをインストール
● GradleのappengineDeployタスクでデプロイ
12
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
- 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
まとめ
AppEngine × Spring Boot × Kotlinを快適に使うためのTipsを紹介しました
● Gradle plugin for App Engine Standard and Spring Boothttps://github.com/int128/appengine-spring-boot-plugin
● CircleCIによる継続的デプロイ
15