자바 8 런타임

자바 8 런타임은 웹 제공 프레임워크를 포함하지 않습니다. 유일한 요구사항은 앱에서 포트 8080을 수신 대기하고 응답하는 것입니다. 이 문서의 샘플 코드에서는 Spring Boot 등의 자체 프레임워크를 자바 8 런타임에 추가하는 방법을 보여줍니다.

기본 요건

  • 개발을 시작하기 전에 Google Cloud SDK의 최신 버전을 다운로드하거나 Cloud SDK를 최신 버전으로 업데이트합니다.

    gcloud components update
    
  • Maven을 사용하여 배포하려면 pom.xmlApp Engine Maven 플러그인을 추가해야 합니다.

    <plugin>
       <groupId>com.google.cloud.tools</groupId>
       <artifactId>appengine-maven-plugin</artifactId>
       <version>2.2.0</version>
    </plugin>

    gcloud app deploy 명령어 또는 App Engine Gradle 플러그인 사용을 포함한 다른 배포 옵션도 있습니다.

  • 애플리케이션 프레임워크 안내를 따라 실행 가능한 JAR 빌드를 구성합니다. 이 실행 가능한 JAR은 java -jar app.jar을 통해 실행되어야 합니다. 예를 들어 Spring Boot 문서를 참조할 수 있습니다.

파일 정리

개발 파일의 계층구조는 다음과 같아야 합니다.

MyDir/
  pom.xml
  [index.yaml]
  [cron.yaml]
  [dispatch.yaml]
  src/main/
    appengine/
      app.yaml
    docker/
      Dockerfile
    java/
      com.example.mycode/
        MyCode.java

app.yaml

app.yaml 파일은 필수 항목입니다. 파일을 다음과 같이 정의하세요.

runtime: java
env: flex

runtime: java를 지정하면 JAR(*.jar) 파일을 배포할 때 런타임 이미지 gcr.io/google-appenine/openjdk:8이 자동으로 선택됩니다.

JDK 버전을 선택하려면 runtime_config.jdk 필드를 사용합니다.

runtime: java
env: flex
runtime_config:
  jdk: openjdk8

app.yaml 사용에서 다른 app.yaml 설정을 찾을 수 있습니다.

선택적 파일

다음 구성 파일은 선택사항입니다.

이 파일을 MyDir의 최상위 수준에 배치하세요. 이러한 파일을 사용하는 경우 gcloud app deploy 명령어를 사용하여 별도로 배포해야 합니다.

기본 진입점

OpenJDK 8 이미지의 진입점인 docker-entrypoint.bash는 전달된 명령줄 인수를 처리하여 기본 명령어(java)에 대한 실행 가능한 대안 또는 인수를 찾습니다.

이미지의 첫 번째 인수를 실행할 수 없으면 java 명령어가 암시적으로 추가됩니다. 예를 들면 다음과 같습니다.

$ docker run openjdk -jar /usr/share/someapplication.jar

이미지의 첫 번째 인수를 실행할 수 있으면(예: bash) 해당 명령어를 실행합니다.

예를 들어 다음과 같이 셸을 실행할 수 있습니다.

> docker run -it --rm openjdk bash
root@c7b35e88ff93:/#

환경 변수

app.yaml 파일의 env_variables 키를 사용하여 환경 변수를 설정합니다. 예를 들면 다음과 같습니다.

env_variables:
   MY_VAR_COLOR: 'blue'

다음 표에서는 기능을 사용, 중지 또는 구성하는 데 사용할 수 있는 환경 변수를 보여줍니다.

환경 변수 설명 유형 기본
DBG_ENABLE Cloud Debugger boolean true
TMPDIR 임시 디렉토리 dirname
JAVA_TMP_OPTS JVM tmpdir 인수 JVM 인수 -Djava.io.tmpdir=${TMPDIR}
GAE_MEMORY_MB 사용 가능한 메모리 크기 Google App Engine 또는 /proc/meminfo-400M에서 설정
HEAP_SIZE_RATIO 힙용 메모리 percent 80
HEAP_SIZE_MB 사용 가능한 힙 크기 ${GAE_MEMORY_MB}${HEAP_SIZE_RATIO}%
JAVA_HEAP_OPTS JVM 힙 인수 JVM 인수 -Xms${HEAP_SIZE_MB}M -Xmx${HEAP_SIZE_MB}M
JAVA_GC_OPTS JVM GC 인수 JVM 인수 -XX:+UseG1GC 및 구성
JAVA_USER_OPTS JVM 기타 인수 JVM 인수
JAVA_OPTS JVM 인수 JVM 인수 아래 참조
SHUTDOWN_LOGGING_THREAD_DUMP 종료 스레드 덤프 boolean false
SHUTDOWN_LOGGING_HEAP_INFO 종료 힙 정보 boolean false
SHUTDOWN_LOGGING_SAMPLE_THRESHOLD 종료 샘플링 percent 100

JAVA_OPTS를 명시적으로 설정하지 않으면 JAVA_OPTS:=-showversion \ ${JAVA_TMP_OPTS} \ ${DBG_AGENT} \ ${JAVA_HEAP_OPTS} \ ${JAVA_GC_OPTS} \ ${JAVA_USER_OPTS} 기본값이 적용됩니다.

실제로 실행되는 명령줄은 다음과 같습니다. 여기에서 $@은 docker 진입점에 전달된 인수입니다.

java $JAVA_OPTS "$@"

로컬 테스트

다음을 사용하여 앱을 빌드할 수 있습니다.

mvn package

java 명령줄을 사용하여 실행합니다.

java -jar target/myjar.jar

또는 로컬에서 앱을 실행하는 방법에 대한 애플리케이션 프레임워크 관련 안내에 따릅니다.

로컬 환경에서 테스트할 때는 원격 Google Cloud 서비스 대신 에뮬레이션된 Google Cloud 서비스를 사용할 수 있습니다. Datastore, Pub/Sub, Bigtable용 에뮬레이터가 있습니다. 앱을 실행하기 전에 gcloud 명령어를 사용하여 시작합니다.

gcloud beta emulators datastore start
gcloud beta emulators pubsub start
gcloud beta emulators bigtable start

앱 배포

구성을 완료하면 Google Cloud SDK에서 다음을 사용하여 app.yaml 파일과 JAR이 포함된 이 디렉터리를 배포할 수 있습니다.

gcloud app deploy app.yaml

선택적 구성 파일 중 하나(index.yaml, cron.yaml, dispatch.yaml)를 사용하는 경우 gcloud 명령어를 통해 별도로 배포해야 합니다. 예를 들면 다음과 같습니다.

gcloud app deploy cron.yaml

Maven

Maven을 사용하여 앱을 배포합니다.

mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID

PROJECT_ID를 Cloud 프로젝트의 ID로 바꿉니다. pom.xml 파일에 이미 프로젝트 ID가 지정된 경우 실행할 명령어에 -Dapp.deploy.projectId 속성을 포함하지 않아도 됩니다.

Gradle

Gradle을 사용하여 앱을 배포합니다.

gradle appengineDeploy

자바 8 런타임 맞춤설정

Dockerfile이 없어도 자바 8 런타임에 앱을 배포할 수 있습니다. 그러나 앱에 추가적인 구성이 필요한 경우 명시적으로 Dockerfile을 제공하여 자바 런타임을 맞춤설정할 수 있습니다.

이미지를 커스텀 런타임의 기본으로 사용하려면 app.yaml 파일에 runtime: custom을 지정한 후 다음과 같이 Dockerfile을 작성하면 됩니다.

FROM gcr.io/google-appengine/openjdk:8
COPY your-application.jar $APP_DESTINATION

이 줄은 Docker 컨테이너의 올바른 위치에 JAR을 추가합니다.

Dockerfile에 추가 지시문을 더하여 자바 런타임을 맞춤설정할 수 있습니다. 커스텀 런타임 빌드를 참조하세요.