appengine × spring boot × kotlin

15
AppEngine × Spring Boot × Kotlin Hidetake Iwata (@int128) NTT DATA CORPORATION AppEngine ja night #2

Upload: hidetake-iwata

Post on 21-Jan-2018

434 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: AppEngine × Spring Boot × Kotlin

AppEngine × Spring Boot × Kotlin

Hidetake Iwata (@int128)NTT DATA CORPORATION

AppEngine ja night #2

Page 2: AppEngine × Spring Boot × Kotlin

Hidetake Iwata

Software EngineerNTT DATA CORPORATION

※今日は個人的なお話です

2

Page 3: AppEngine × Spring Boot × Kotlin

agenda

1. AppEngine × Spring Boot × Kotlinでサービスを作った話

2. Gradleのプラグインを作った話

3. CircleCIによる継続的デプロイ

3

Page 4: AppEngine × Spring Boot × Kotlin

GradleUpdate

ビルドツール(Gradle)の新しいバージョンが出たら、バージョンアップのPull Requestを送ってくれるサービスを開発中

https://gradleupdate.appspot.com

● AppEngine Standard● Spring Boot● Thymeleaf● Kotlin● EGit

Page 5: AppEngine × Spring Boot × Kotlin

AppEngine/Java

最近のStandard Environmentは大幅に改善されている

● Java 8に対応

● Servlet 3.1に対応

● クラス制限の廃止、スレッド生成の対応

(心の声...)

● もうJava 9が出たよ

● 時代はGolang一択では

5

Page 6: AppEngine × Spring Boot × Kotlin

Spring Boot

Pros

● JVM言語のWebアプリケーションフレームワークではデファクトスタンダード

(Java, Groovy, Kotlin)● エコシステムが発達している

Cons

● 初期化が遅い

● フットプリントが大きい

6

Page 7: AppEngine × Spring Boot × Kotlin

Kotlin

Pros

● 既存言語のよいところを取り入れたモダンな言語

● Javaとの相互運用性

● コンパイルが速い

Cons

● 欠点は無い?

7

Page 8: AppEngine × Spring Boot × Kotlin

AppEngine × Spring Boot × Kotlin

Pros

● モバイルアプリとバックエンドを同じ言語で実装できる(Android)● 大抵のSpring Bootアプリはちゃんと動く

● うれしい無料枠

Cons

● エコシステムが未発達なのでLow Level APIに頼らざるを得ない

● Too long spin up time● AppEngineとSpring Bootの相性

8

Page 9: AppEngine × Spring Boot × Kotlin

⚠ Too long spin up time問題

トラフィックが増えてスケールアウトする

と、

大きなレイテンシが発生する

約20~25秒のレイテンシ

● 7秒(コンテナの起動)

● 5秒(JVMやJettyの起動)

● 8秒(Springの初期化)

9

Page 10: AppEngine × Spring Boot × Kotlin

⚠ 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

Page 11: AppEngine × Spring Boot × Kotlin

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

● 環境依存値の管理

Page 12: AppEngine × Spring Boot × Kotlin

CircleCIによる継続的デプロイ

GitHubにpushした契機でAppEngineにデプロイしたい

● CircleCI 2.0を使う

● サービスアカウントの秘密鍵はBASE64で環境変数に入れておく

● google/cloud-sdk:alpineイメージにopenjdk8とapp-engine-javaをインストール

● GradleのappengineDeployタスクでデプロイ

12

Page 13: AppEngine × Spring Boot × Kotlin

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

Page 14: AppEngine × Spring Boot × Kotlin

- 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

Page 15: AppEngine × Spring Boot × Kotlin

まとめ

AppEngine × Spring Boot × Kotlinを快適に使うためのTipsを紹介しました

● Gradle plugin for App Engine Standard and Spring Boothttps://github.com/int128/appengine-spring-boot-plugin

● CircleCIによる継続的デプロイ

15