Thursday, 25 October 2012

Aplicación Java Spring MVC Heroku (Español) - Instalar archivo WAR en Heroku

This information in English:
Heroku es una plataforma que permite alojar tus aplicaciones en la Nube (Cloud) de manera fácil y rápida. Heroku pertenece al proveedor de Cloud Computing Salesforce, y es una herramienta que permite migrar tus aplicaciones a la Nube, ya sean aplicaciones Java, Python, Ruby, Clojure o Scala, sin necesidad de efectuar ninguna configuración en servidores, ya que toda la parte de servidor es automáticamente gestionada por Heroku.

La documentación online que proporciona Heroku puede ser de ayuda al principio, sobre todo para configurar tu entorno de desarrollo, para entender el funcionamiento de la plataforma y empezar a subir rápido las aplicaciones de ejemplo. El problema es que la documentación de Heroku y todo el entorno de trabajo que Heroku proporciona está disponible únicamente en inglés.

El primer artículo donde se explica los requisitos necesarios para empezar a manejar tus aplicaciones Java con Heroku es "Getting Started with Java on Heroku"; que básicamente dice que  lo necesario para empezar es lo siguiente:
  • Conocimiento básico en Java y una versión instalada de JVM y Maven
  • Tus aplicaciones deben ser compatibles con OpenJDK, versiones 6 o 7
  • Una cuenta de usuario de Heroku: puedes crear una cuenta gratis de forma instantánea
La mayoría de la gente que programa en Java usa Eclipse, por lo que es recomendable instalar los plugins para Heroku y Git (requieren Eclipse versión 3.7 o superior); este enlace de Heroku explica los pasos necesarios para instalar el plugin de Heroku y este artículo del projecto EGit para el plugin de Git.

Si tienes tu propia aplicación Web y usas Spring MVC, lo que probablemente te interesará será la manera más fácil y rápida de subir tu aplicación a la Nube. Los artículos que proporciona Heroku para aplicaciones Spring MVC explican los pasos necesarios para clonar las aplicaciones de ejemplo de sus repositorios, pero si quieres subir una aplicación propia que ya tengas desarrollada en Java/Spring, la documentación oficial no da muchos detalles y no es muy clara en ese sentido. Por eso he escrito este artículo, para explicar paso a paso y en un mismo sitio lo que hay que hacer para instalar tus archivos WAR en Heroku, incluyendo los cambios necesarios en cuanto a la conexión con la base de datos, los plugins en el fichero pom.xml o la nomenclatura necesaria para las URLs.

Crea una aplicación Heroku vacía

Para crear una aplicación vacía en Heroku desde Eclipse, efectúa los siquientes pasos:

New > Project > Heroku > Create Heroku App from Template.

Rellena el campo Application Name con el nombre que le quieres dar a tu aplicación (tiene que ser un identificador único dentro de Heroku), selecciona la opción Blank Heroku App y haz click en Finish para crear una nueva aplicación de Heroku sin nada.

Al finalizar estos pasos se generará un nuevo proyecto en tu espacio de trabajo local, que será accesible con el explorador de directorios o desde Eclipse en tu explorador de paquetes.

Si accedes a tu centro de desarrollo de Heroku también podrás ver la aplicación que acabas de crear; aparecerá algo similar a lo que se muestra en la imagen siguiente:


Esta nueva aplicación ha sido creada completamente vacía en el entorno de Heroku, sin ningún tipo de recursos disponibles, de manera que hay que crear una base de datos y añadir el código Java de la aplicación que quieres subir a la Nube.

Crear una base de datos Postgresql en Heroku
Recursos de la Aplicación (vacío)

Las bases de datos que usa Heroku en sus ejemplos son siempre Postgresql (aunque se pueden utilizar otras), de manera que en este ejemplo también usaremos Postgresql para alojar la información de nuestra aplicación. Crear tu propia base de datos Postgresql es muy fácil desde tu cuenta del Centro de Desarrollo de Heroku. Haciendo click en el icono Resources se muestran los recursos de que dispone tu aplicación.


Al hacer click en el enlace Get Add-ons accederás a la página de Addons de Heroku, donde encontrarás el addon para Heroku Postgre y lo puedes instalar en tu aplicación; una vez instalado aparecerá como recurso disponible en tu lista de Addons.

El Addon de Heroku Postgres Dev está instalado en la aplicación
Conexión con la base de datos Postgresql

El nuevo Addon que se ha añadido a los recursos de tu aplicación es una base de datos Postgresql, que se encuentra vacía y, por tanto, hace falta crear la estructura de datos que necesites para ejecutar tu aplicación.

Conexión desde un cliente de base de datos: Los datos de conexión de la base de datos Postgresql que has creado en Heroku se pueden obtener accediendo al siguiente enlace para la configuración de la base de datos Heroku Postgre. Haciendo click en tu base de datos desde el Centro de Desarrollo de Herodu accedes a dicho enlace. Te puedes registrar gratis y, una vez que accedas, verás una lista con todas las bases de datos que tengas disponibles en Heroku, y para cada una de ellas puedes ver los parámetros de conexión haciendo click en el nombre de la base de datos.
 
Para conectarte de forma remota a tu base de datos Postgresql, necesitarás usar dos parámetros adicionales, ya que Heroku añade un grado de seguridad ssl a la conexión, esos parámetros y sus valores deben ser los siguientes:
  • ssl=true
  • sslfactory=org.postgresql.ssl.NonValidatingFactory
Una vez que te hayas conectado a través de tu cliente de base de datos, puedes empezar a construir tu estructura de datos, crea tus propias tablas e inserta tus filas de datos.

Conectar tu aplicación local a la base de datos de Heroku: Es recomendable probar la conectividad desde tu aplicación Spring MVC; para ello, deberás configurar tu dataSource de la siguiente manera:

Recuerda añadir el parámetro connectionProperties, si no lo añades a tu configuración, la conexión a la base de datos será rechazada.

Conectar tu aplicación Heroku a la base de datos de Heroku: En este caso, la configuración para la conexión se obtendrá directamente de una variable creada en el contexto de tu aplicación Heroku; deberás crear dos beans en tu configuración de Spring para especificar el parámetro dataSource, como muestra el siguiente ejemplo:

La variable DATABASE_URL se genera por defecto en el contexto de Heroku; cuando se instala el archivo WAR (deploy), se añade esta variable automáticamente al contexto de tu aplicación; el plugin de Eclipse para Heroku te permite ver las variables de entorno de que disponen tus aplicaciones. Si abres la vista de Eclipse "My Heroku Applications" y haces click con el botón derecho en el nombre de tu aplicación puedes seleccionar la opción App Info, y accediendo a la pestaña Environment Variables podrás encontrar esta información:


Llegados a este punto, ya se ha configurado todo lo necesario para ejecutar tu aplicación en la Nube a través de Heroku; sin embargo, es muy probable que las variables de entorno DATABASE_URL y JAVA_OPTS no se encuentren todavía en la lista de variables, ya que se generarán cuando se instale la aplicación (deploy).

Antes de subir tu código fuente a la Nube, es preciso realizar algunos cambios, que se explican a continuación en este artículo.

Cambios en tu código

Puedes copiar el código perteneciente a tu aplicación local en el directorio donde se ha creado tu nueva aplicación.
 
Cuando subas e instales tu aplicación a la Nube, Heroku buscará un archivo específico para ejecutar tu aplicación, de modo que es necesario crear dicho fichero para indicar a Heroku qué acción debe realizar una vez que la instalación de la aplicación se ha efectuado correctamente; este fichero es el Procfile, que debe ser creado bajo el directorio raíz del proyecto de tu espacio de trabajo, al mismo nivel que el archivo pom.xml padre.

El contenido del Procfile debe ser el siguiente:
 
Esta instrucción llamará al fichero webapp-runner.jar para instalar tu archivo WAR en Heroku, así que hace falta incluir un nuevo plugin en tu pom.xml padre, como se muestra a continuación:

De esta manera se incluirá el archivo webapp-runner.jar a tu aplicación cuando la compiles.

A parte de crear el Procfile y de incluir el nuevo plugin en tu pom.xml, deberás incluir los cambios indicados al principio de este artículo en cuanto al fichero de configuración de Spring, applicationContext.xml, para definir el dataSource de forma adecuada.

Añadir el código al repositorio de Heroku

Para ello usaremos el plugin de Git desde Eclipse, haciendo click derecho sobre tu proyecto Heroku y después Team > Commit.
Cuando añadas tu código, debes asegurarte de que los directorios target estén marcados para que se ignoren, de manera que tus compilaciones locales no lleguen a la Nube.
Introduce tus comentarios antes de añadir los ficheros y haz click en Commit.

Subir el código a Heroku

AUna vez añadido el código al repositorio, se puede subir a Heroku para que Heroku genere el la compilación mediante Maven.
Desde Eclipse, haz click derecho en tu proyecto Heroku y luego Team > Push To Upstream.
Al final del proceso, se mostrará un informe con las operaciones que se han llevado a cabo y el resultado final de cada una, ya sea correcto o erróneo. De esta manera te aseguras de que tu aplicación compila perfectamente en Heroku y que tu aplicación está lista para ser instalada.

Compila tu aplicación e instala tu archivo WAR

Ahora puedes compilar tu aplicación como lo haces normalmente con tus aplicaciones locales (mvn package) para crear tu archivo WAR, que posteriormente se instalará en la Nube.
Para instalar en Heroku el WAR que acabas de compilar correctamente, puedes usar el plugin de Heroku en Eclipse; en la vista de Eclipse "My Heroku Applications", haz click derecho sobre tu aplicación, selecciona la opción Deploy... y finalmente elige el archivo WAR que acabas de compilar.

Una vez que tu archivo WAR se ha instalado correctamente, tienes que asegurarte de que la variable DATABASE_URL se encuentra en la lista de tus variables de entorno de tu aplicación. Esto es muy importante, porque esta variable es necesaria para crear el bean dataSource, y si no ha sido creada al instalar el WAR, la aplicación no se podrá ejecutar.

Escalar tu aplicación

Después de instalar tu WAR, ya tienes tu aplicación lista para arrancar. Hay que escalar la aplicación web en Heroku, que se puede hacer de nuevo desde la vista de Eclipse "My Heroku Applications", haciendo click derecho sobre tu aplicación, selecciona al opción Scale y rellena los campos del cuadro de diálogo como se muestra en esta imagen.

Para confirmar que tu aplicación se ha escalado correctamente puedes abrir tu Centro de Desarrollo de Heroku y acceder a los recursos de tu aplicación, donde verás ahora que tus Dynos tienen un valor de 1.


Tu aplicación ya está lista en Heroku y ya deberías poder acceder a ella mediante la URL que te ha proporcionado Heroku.

 
Consideraciones adicionales sobre las URLs

Cuando he subido mis aplicaciones a Heroku, me he dado cuenta de que hay algunos aspectos relacionados con las URLs y que algunas páginas no eran redireccionadas de la forma en que yo esparaba; visita esta otra entrada de mi blog para más detalles: Managing Web App's URLs in Heroku.

Espero que este artículo te haya sido de ayuda. Si tienes alguna duda o algún problema siguiendo los pasos explicados, por favor, deja tu comentario.


2 comments: