Despliegue en Heroku
En esta guía aprenderás a desplegar una aplicación web basada en Quarkus como web-dyno en Heroku.
Esta guía abarca:
-
Actualizar el puerto HTTP de Quarkus
-
Instalar la CLI de Heroku
-
Despliegue de la aplicación en Heroku
-
Desplegar la aplicación como imagen Docker en Heroku
-
Desplegar la aplicación nativa como imagen Docker en Heroku
Requisitos previos
To complete this guide, you need:
-
Roughly 1 hour for all modalities
-
An IDE
-
JDK 11+ installed with
JAVA_HOMEconfigured appropriately -
Apache Maven 3.8.6
-
Optionally the Quarkus CLI if you want to use it
-
Una cuenta de Heroku. Las cuentas gratuitas funcionan.
Introducción
Heroku is a platform as a service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud. It supports several languages like Java, Ruby, Node.js, Scala, Clojure, Python, PHP, and Go. In addition, it offers a container registry that can be used to deploy prebuilt container images.
Heroku se puede utilizar de diferentes maneras para ejecutar una aplicación Quarkus:
-
Como un programa Java simple que se ejecuta en un contenedor definido por el entorno de Heroku
-
Como un programa Java en contenedor que se ejecuta en un contenedor definido por el proceso de construcción de Quarkus
-
Como un programa nativo en contenedor que se ejecuta en un contenedor definido por el proceso de construcción de Quarkus
All three approaches need to be aware of the port that Heroku assigns to it to handle traffic. Luckily, there’s a dynamic configuration property for it.
La guía asume que tienes la CLI de Heroku instalada.
Configuración del proyecto común
Esta guía tomará como entrada una aplicación desarrollada en la guía de inicio.
Asegúrate de tener a mano la aplicación de inicio, o clona el repositorio Git: git clone https://github.com/quarkusio/quarkus-quickstarts.git o descargue un archivo. La solución se encuentra en el directorio getting-started.
Heroku can react on changes in your repository, run CI and redeploy your application when your code changes. Therefore, we start with a valid repository already.
Además, asegúrate de que tu CLI de Heroku está funcionando:
heroku --version
heroku login
Preparar el puerto HTTP de Quarkus
Heroku picks a random port and assigns it to the container that is eventually running your Quarkus application.
That port is available as an environment variable under $PORT.
The easiest way to make Quarkus in all deployment scenarios aware of it is using the following configuration:
quarkus.http.port=${PORT:8080}
This reads as: "Listen on $PORT if this is a defined variable, otherwise listen on 8080 as usual."
Run the following to add this to your application.properties:
echo "quarkus.http.port=\${PORT:8080}" >> src/main/resources/application.properties
git commit -am "Configure the HTTP Port."
Desplegar el repositorio y construir en Heroku
The first variant uses the Quarkus Maven build to create the quarkus-app application structure containing the runnable "fast-jar" as well as all libraries needed inside Heroku’s build infrastructure and then deploying that result, the other one uses a local build process to create an optimized container.
Se necesitan dos archivos adicionales en el directorio raíz de su aplicación:
-
system.propertiespara configurar la versión de Java -
Procfilepara configurar cómo Heroku inicia su aplicación
Quarkus necesita JDK 11, así que lo especificamos primero:
echo "java.runtime.version=11" >> system.properties
git add system.properties
git commit -am "Configure the Java version for Heroku."
Vamos a desplegar una aplicación web por lo que necesitamos configurar el tipo web en el Heroku Procfile así:
echo "web: java \$JAVA_OPTS -jar target/quarkus-app/quarkus-run.jar" >> Procfile
git add Procfile
git commit -am "Add a Procfile."
Su aplicación ya debería poder ejecutarse a través de heroku local web.
Vamos a crear una aplicación en tu cuenta y a desplegar ese repositorio en ella:
heroku create
git push heroku master
heroku open
La aplicación tendrá un nombre generado y el terminal debería mostrarlo. heroku open abre su navegador por defecto para acceder a su nueva aplicación.
Para acceder al endpoint REST mediante curl, ejecute:
APP_NAME=`heroku info | grep "=== .*" |sed "s/=== //"`
curl $APP_NAME.herokuapp.com/hello
Por supuesto, también puedes utilizar la CLI de Heroku para conectar este repositorio a tu cuenta de GitHub, pero esto está fuera del alcance de esta guía.
Desplegar como contenedor
La ventaja de subir un contenedor completo es que tenemos un control total sobre su contenido y podemos incluso elegir desplegar un contenedor con un ejecutable nativo que se ejecute en GraalVM.
En primer lugar, inicie sesión en el registro de contenedores de Heroku:
heroku container:login
Necesitamos añadir una extensión a nuestro proyecto para construir imágenes de contenedores a través del plugin de Quarkus Maven:
mvn quarkus:add-extension -Dextensions="container-image-docker"
git add pom.xml
git commit -am "Add container-image-docker extension."
The image we are going to build needs to be named accordingly to work with Heroku’s registry and deployment.
We get the generated name via heroku info and pass it on to the (local) build:
APP_NAME=`heroku info | grep "=== .*" |sed "s/=== //"`
mvn clean package\
-Dquarkus.container-image.build=true\
-Dquarkus.container-image.group=registry.heroku.com/$APP_NAME\
-Dquarkus.container-image.name=web\
-Dquarkus.container-image.tag=latest
Con Docker instalado, ahora puedes empujar la imagen y liberarla:
docker push registry.heroku.com/$APP_NAME/web
heroku container:release web --app $APP_NAME
Puede y debe comprobar los registros para ver si su aplicación se está ejecutando desde el contenedor:
heroku logs --app $APP_NAME --tail
The initial push is rather big, as all layers of the image need to be transferred. The following pushes will be smaller.
The biggest advantage we take when deploying our app as a container is to deploy a container with the natively compiled application. Why? Because Heroku will stop or sleep the application when there’s no incoming traffic. A native application will wake up much faster from its sleep.
The process is pretty much the same. We opt in to compiling a native image inside a local container, so that we don’t have to deal with installing GraalVM locally:
APP_NAME=`heroku info | grep "=== .*" |sed "s/=== //"`
mvn clean package\
-Dquarkus.container-image.build=true\
-Dquarkus.container-image.group=registry.heroku.com/$APP_NAME\
-Dquarkus.container-image.name=web\
-Dquarkus.container-image.tag=latest\
-Pnative\
-Dquarkus.native.container-build=true
Después, suba y publique de nuevo:
docker push registry.heroku.com/$APP_NAME/web
heroku container:release web --app $APP_NAME