$30 off During Our Annual Pro Sale. View Details »

AppEngine × Spring Boot × Kotlin

AppEngine × Spring Boot × Kotlin

2017.10.26
AppEngine ja night #2

Hidetake Iwata

October 26, 2017
Tweet

More Decks by Hidetake Iwata

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide