0

J'ai lutté avec cela pendant environ une semaine et rien de ce que j'ai vu sur SO a travaillé pour moi. J'ai une API REST basée sur Spring Boot que j'essaie de déployer sur Google App Engine. Exécuter localement est très bien et quand je l'exécute sur l'émulateur GAE ça fonctionne bien aussi; Cependant, une fois que je déploie en utilisant mvn appengine:deploy, je reçois une build réussie, mais lorsque j'essaie les points de terminaison, je ne reçois qu'un 502. Je ne suis pas sûr de l'endroit où se trouvent les logs, donc c'est vraiment un coup de pied dans mes fesses.Printemps Boot REST sur Google App Engine jette 502

Mon pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.mycompany.admin</groupId> 
    <artifactId>admin-api</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 

    <parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.6.RELEASE</version> 
    <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
    <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <!-- Exclude this for deployment only --> 
     <exclusions> 
      <exclusion> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-starter-tomcat</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.projectlombok</groupId> 
     <artifactId>lombok</artifactId> 
     <optional>true</optional> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 

    <!-- other project dependencies --> 
    <dependency> 
     <groupId>com.google.firebase</groupId> 
     <artifactId>firebase-admin</artifactId> 
     <version>5.3.0</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jsoup</groupId> 
     <artifactId>jsoup</artifactId> 
     <version>1.10.2</version> 
    </dependency> 
    <!-- end other project specific dependencies --> 

    <!-- Dependencies provided during deployment --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jul-to-slf4j</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <scope>provided</scope> 
    </dependency> 
    <!-- End dependencies for deployment --> 

    <!-- Dependencies for local --> 
    <!--  <dependency> --> 
    <!--   <groupId>org.springframework.boot</groupId> --> 
    <!--   <artifactId>spring-boot-starter-tomcat</artifactId> --> 
    <!--   <scope>provided</scope> --> 
    <!--  </dependency> --> 
    <!-- End dependencies for local --> 
    </dependencies> 

    <build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
     <plugin> 
      <groupId>com.google.cloud.tools</groupId> 
      <artifactId>appengine-maven-plugin</artifactId> 
      <version>1.3.1</version> 
      <configuration> 
       <project>project-id-from-GAE-here</project 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Ma classe d'application est une classe simple @SpringBootApplication annoté. J'ai 2 contrôleurs avec l'annotation de @RestController et des méthodes simples @RequestMapping. L'un des contrôleurs REST concerne le point de terminaison /_ah/health qui renvoie 200 car une constante mentionnée dans le message redémarre étant déclenchée par l'absence d'un point de terminaison d'intégrité.

J'ai simple application.yml pour mes injections de valeur et crée un fichier app.yaml placé dans src/main/appengine

runtime: java 
env: flexible 
threadsafe: true 
manual_scaling: 
    instances: 1 
handlers: 
- url: /.* 
    script: this field is required, but ignored 
runtime_config: 
    jdk: openjdk8 

Je suis à une perte complète à ce sujet. C'est mon premier déploiement de GAE avec plus d'espoir. (Je suis pas non plus en utilisant Docker encore depuis que je suis sur une machine Windows 10 qui se brise lorsque je charge Docker dessus.)

MISE À JOUR J'ai remarqué que j'avais oublié de mettre mon id projet sous le plugin maven . Une fois que je l'ai fait, j'ai eu des erreurs à propos de ne pas trouver le app.yaml. J'ai réalisé que depuis que j'utilise un environnement flexible, je n'avais pas besoin du fichier appengine-web.xml et mon fichier s'appelait app.yml plutôt que app.yaml. J'ai mis à jour ma question avec ceci et je reçois toujours un 502 après un déploiement réussi.

+0

J'ai eu le même 502 quand j'ai utilisé la sécurité de printemps .. J'ai spécifié les ressources dans app.yaml pour mieux la machine. alors ça résout. – Evan

Répondre

3

J'ai réalisé ma période d'essai avec GAE inclus le support technique donc je les ai contactés. Le demandé pour mon pom et app.yaml. Leur réponse a été d'ajouter ce qui suit à mon app.yaml « Depuis Java est connu pour consommer une utilisation élevée de la mémoire, il y a un processus en tête consommé plus que la valeur de 0.4GB approximative »

resources: 
    cpu: 2 
    memory_gb: 2.3 
    disk_size_gb: 10 
    volumes: 
    - name: ramdisk1 
    volume_type: tmpfs 
    size_gb: 0.5 

Ils ont également fourni ce lien pour référence: https://cloud.google.com/appengine/docs/flexible/java/configuring-your-app-with-app-yaml#resource-settings

Une fois que j'ai fait cela, mon application a commencé à fonctionner très bien.

EDIT

Si vous avez une application simple, définissez cpu:1 puisque vous obtenez facturé sur les heures de CPU et votre quota quotidien est 28 et avec 2 processeurs vous vous retrouvez avec 48 heures de CPU. J'ai brûlé le crédit gratuit de 300 $ en 1 mois parce que leurs tutoriels ont mis en place un RDB (80 $) qui ne s'utilise pas et ne montre pas pour tuer le projet. Assurez-vous également lors du déploiement de quelque chose de nouveau que vous supprimez les anciennes versions ou vous serez facturé pour chaque version qui est en place.