Environnement d'exécution Java 11

L'environnement d'exécution Java 11 est la pile logicielle chargée d'installer le code de votre service Web et ses dépendances, et d'exécuter votre service.

L'environnement d'exécution Java 11 dans l'environnement standard App Engine est déclaré dans le fichier app.yaml :

runtime: java11

Avant de commencer

  1. Téléchargez la dernière version de l'outil de ligne de commande gcloud ou mettez à jour votre outil gcloud vers la version actuelle :

    gcloud components update
    
  2. Pour déployer à l'aide de Maven, vous devez ajouter le plug-in App Engine Maven à votre fichier pom.xml :

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

    D'autres options de déploiement incluent l'utilisation de la commande gcloud app deploy ou du plug-in App Engine Gradle.

  3. Suivez les instructions concernant votre framework d'application pour configurer le build d'un fichier JAR exécutable.

Compatibilité avec le framework

Dans l'environnement d'exécution Java 11 d'App Engine, vous pouvez déployer des fichiers JAR exécutables. L'environnement d'exécution n'inclut aucun framework de diffusion Web, ce qui signifie que vous n'êtes pas limité à l'utilisation de frameworks ou de bibliothèques basés sur des servlets. Utilisez vos dépendances natives ou vos piles réseau, telles que la bibliothèque Netty.

Le dépôt GitHub de Google Cloud contient des exemples hello world utilisant des frameworks Web Java populaires :

Vous n'êtes pas limité à ces frameworks et nous vous encourageons à essayer celui que vous préférez, comme Grails, Blade, Play!, Vaadin ou jHipster.

Déployer des projets sources Maven dans l'environnement d'exécution Java 11

Vous pouvez déployer votre projet Maven en tant que code source, puis le compiler et le déployer à l'aide d'App Engine Buildpacks.

Pour déployer un projet Maven en tant que code source, accédez au répertoire de premier niveau de votre projet et saisissez :

gcloud app deploy pom.xml

Les journaux de compilation et de déploiement sont diffusés. Vous pouvez consulter les journaux détaillés dans l'historique de Cloud Build sur Cloud Console.

Utiliser des exécutables GraalVM

L'environnement d'exécution Java 11 standard d'App Engine est compatible avec les fichiers exécutables d'images natives GraalVM. Une fois que vous avez compilé votre application Java 11 à l'aide d'une image native GraalVM, vous pouvez utiliser le paramètre entrypoint de votre fichier app.yaml pour pointer vers l'exécutable.

Par exemple, un fichier exécutable portant le nom de fichier myexecutable peut avoir le fichier de configuration app.yaml suivant :

runtime: java11
entrypoint: ./myexecutable

Version Java compatible

L'environnement d'exécution Java 11 exploite la dernière version stable de Java 11. App Engine se met automatiquement à jour en cas de révisions mineures, mais pas en cas de nouvelle version majeure.

Par exemple, l'application peut être déployée sur Java 11.0.4 et faire ultérieurement l'objet d'une mise à jour automatique vers la version 11.0.5, mais elle ne sera pas automatiquement mise à jour vers Java 12.

Environnement Open JDK de l'environnement d'exécution

App Engine exécute des applications Java 11 dans un conteneur sécurisé par gVisor sur une distribution Linux Ubuntu 18.04 mise à jour et son package openjdk-11-jdk compatible. App Engine gère l'image de base et met à jour le package OpenJDK 11, sans que vous ayez à redéployer votre application.

L'application déployée se situe dans le répertoire /workspace de l'environnement d'exécution. Elle est également accessible via un lien symbolique à l'adresse /srv.

Dépendances

Pour en savoir plus sur la déclaration et la gestion des dépendances, consultez la page Spécifier des dépendances.

Démarrage de l'application

Les frameworks tels que Spring Boot, Micronaut et Ktor créent par défaut un uber JAR exécutable. Si votre fichier de version Maven ou Gradle produit un fichier uber JAR exécutable, l'environnement d'exécution démarre votre application en exécutant une application uber JAR.

App Engine peut également utiliser le contenu du champ facultatif entrypoint dans votre fichier app.yaml. Exemple :

runtime: java11
entrypoint: java -Xmx64m -jar YOUR-ARTIFACT.jar

Où l'exemple de fichier jar d'application YOUR-ARTIFACT.jar doit :

  • Être dans le répertoire racine avec votre fichier app.yaml.
  • Contenir une entrée Main-Class dans son fichier de métadonnées META-INF/MANIFEST.MF.
  • Éventuellement, contenir une entrée Class-Path avec une liste de chemins relatifs vers d'autres fichiers jar dépendants. Ceux-ci seront importés automatiquement avec l'application.

Pour que l'application reçoive des requêtes HTTP, le point d'entrée doit lancer un serveur Web qui écoute le port spécifié par la variable d'environnement PORT.

Avec un point d'entrée personnalisé, vous pouvez concevoir et empaqueter votre application sous la forme d'un fichier JAR fin ne contenant que le code de votre application et les dépendances directes. Lors du déploiement de votre application, le plug-in App Engine n'importe que les fichiers modifiés, et non l'ensemble du package uber JAR.

Assurez-vous d'utiliser la variable d'environnement PORT.

Si les avertissements concernant le port 8080 et NGINX s'affichent dans les fichiers journaux de votre application, le serveur Web de votre application écoute sur le port 8080 par défaut. Cela empêche App Engine d'utiliser sa couche NGINX pour compresser les réponses HTTP. Nous vous recommandons de configurer votre serveur Web pour répondre aux requêtes HTTP sur le port spécifié par la variable d'environnement PORT, généralement 8081. Par exemple :

/*
 * Copyright 2019 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.appengine;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Main {

  public static void main(String[] args) throws IOException {
    // Create an instance of HttpServer bound to port defined by the
    // PORT environment variable when present, otherwise on 8080.
    int port = Integer.parseInt(System.getenv().getOrDefault("PORT", "8080"));
    HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);

    // Set root URI path.
    server.createContext("/", (var t) -> {
      byte[] response = "Hello World!".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    // Create a second URI path.
    server.createContext("/foo", (var t) -> {
      byte[] response = "Foo!".getBytes();
      t.sendResponseHeaders(200, response.length);
      try (OutputStream os = t.getResponseBody()) {
        os.write(response);
      }
    });

    server.start();
  }
}

Compatibilité avec les versions précédentes de Java

Les utilisateurs peuvent accéder aux fonctionnalités suivantes à partir des versions précédentes de Java :

  • Inférence de type avancé avec le mot clé var.
  • Création simple de listes ou de cartes avec des collections non modifiables.
  • Appel d'hôtes distants à l'aide de HttpClient hiérarchisé.
  • Utilisation du système de module JPMS.
  • Utilisez d'autres langages JVM, tels que Apache Groovy, Kotlin ou Scala.

Variables d'environnement

Les variables d'environnement suivantes sont définies par l'environnement d'exécution :

Variable d'environnement Description
GAE_APPLICATION ID de votre application App Engine. Cet ID est précédé du préfixe "region code~", tel que "e~" pour les applications déployées en Europe.
GAE_DEPLOYMENT_ID ID du déploiement actuel.
GAE_ENV Environnement App Engine. Variable définie sur standard.
GAE_INSTANCE ID de l'instance sur laquelle votre service est en cours d'exécution.
GAE_MEMORY_MB Quantité de mémoire disponible pour le processus d'application, en Mo.
GAE_RUNTIME Environnement d'exécution spécifié dans le fichier app.yaml.
GAE_SERVICE Nom de service spécifié dans le fichier app.yaml. Si aucun nom de service n'est spécifié, il est défini par défaut sur default.
GAE_VERSION Libellé de la version actuelle du service.
GOOGLE_CLOUD_PROJECT ID du projet Cloud associé à votre application.
PORT Port qui reçoit les requêtes HTTP.

Vous pouvez définir des variables d'environnement supplémentaires dans le fichier app.yaml, mais les valeurs ci-dessus ne peuvent pas être remplacées.

HTTPS et proxy de transfert

App Engine met fin aux connexions HTTPS au niveau de l'équilibreur de charge et transfère les requêtes à votre application. Certaines applications doivent déterminer l'adresse IP et le protocole de la requête d'origine. L'adresse IP de l'utilisateur est disponible dans l'en-tête standard X-Forwarded-For. Les applications nécessitant ces informations doivent configurer leur framework Web pour qu'il fasse confiance au proxy.

Accès au système de fichiers

L'environnement d'exécution comprend un répertoire /tmp accessible en écriture, tous les autres répertoires ayant un accès en lecture seule. Le fait d'écrire des données dans /tmp utilise la mémoire système.

Serveur de métadonnées

Chaque instance de votre application peut demander des informations sur l'instance et votre projet à l'aide du serveur de métadonnées App Engine.

Vous pouvez accéder au serveur de métadonnées via les points de terminaison suivants :

  • http://metadata
  • http://metadata.google.internal

Les requêtes envoyées au serveur de métadonnées doivent inclure l'en-tête de requête Metadata-Flavor: Google. Cet en-tête indique que la requête a été envoyée dans le but de récupérer les valeurs de métadonnées.

La table suivante répertorie les points de terminaison sur lesquels vous pouvez effectuer des requêtes HTTP pour des métadonnées spécifiques :

Point de terminaison des métadonnées Description
/computeMetadata/v1/project/numeric-project-id Numéro de projet attribué à votre projet.
/computeMetadata/v1/project/project-id ID de projet attribué à votre projet.
/computeMetadata/v1/instance/zone Zone dans laquelle l'instance est en cours d'exécution.
/computeMetadata/v1/instance/service-accounts/default/aliases
/computeMetadata/v1/instance/service-accounts/default/email Adresse e-mail du compte de service par défaut attribué à votre projet.
/computeMetadata/v1/instance/service-accounts/default/ Répertorie tous les comptes de service par défaut pour votre projet.
/computeMetadata/v1/instance/service-accounts/default/scopes Répertorie tous les champs d'application disponibles pour les comptes de service par défaut.
/computeMetadata/v1/instance/service-accounts/default/token Renvoie le jeton d'authentification pouvant servir à authentifier votre application auprès d'autres API Google Cloud.

Par exemple, pour récupérer votre ID de projet, envoyez une requête à http://metadata.google.internal/computeMetadata/v1/project/project-id.