Los Microservicios están en un momento de popularidad muy alta entre los desarrolladores, arquitectos y en general en las áreas de TI. Últimamente he escuchado cada vez a más colegas mencionar que están implementando soluciones con este estilo de arquitectura en sus empresas, o bien, que tienen proyectos de planeación para migración y actualización de aplicaciones monolíticas hacia Microservicios.

Y no es de sorprenderse que esta tendencia vaya en aumento, en todos los eventos técnicos, meetups, summits y hasta en charlas con amigos escuchamos algo al respecto, pero, sobre todo, los fabricantes de software, en su marcha competitiva, lanzan a una velocidad impresionante herramientas alineadas a este tipo de soluciones, que por un lado favorecen la oferta de opciones, y al mismo tiempo dificultan la decisión sobre la mejor alternativa para cada caso.

Una de las opciones más populares entre los desarrolladores para este tipo de implementaciones es usar una combinación de elementos que involucran Spring Boot y Pivotal Cloud Foundry.

El objetivo es claro; simplificar el desarrollo de los Microservicios, al mismo tiempo que se aprovechen al máximo las herramientas que proveen entornos apropiados para el ciclo completo de entrega ágil de los mismos. En otras palabras, no reinventar la rueda y hacer todo de forma manual, sino usar la tecnología para automatizar la mayor cantidad de tareas, las cuales normalmente involucran actividades humanas, lo que se traduce en dependencias, tiempo adicional y posibilidad de error humano. De tal forma que se genera de manera muy natural una estrategia de entrega e integración continua, que, a su vez, podría evolucionar hacia la adopción de prácticas como DevOps.

Spring Boot es una de las tecnologías del ámbito de Spring que se ha vuelto muy popular. Tiene como objetivo simplificar la implementación de aplicaciones al proveer un Framework ligero que elimina la mayoría del trabajo de configuración al crear aplicaciones basadas en Spring, ya que provee la característica RAD (Rapid Application Development).

Por otro lado, Cloud Floundry es una plataforma como servicio (PaaS) open source propiedad de Pivotal Software. Está disponible como un paquete de software stand-alone que puede ser desplegado en distintos ambientes de proveedores Cloud como AWS, Google CP, Open Stack, entre otros.

Esta plataforma está optimizada para entregar, entre otras características; un ambiente para desarrollo y despliegue ágil, arquitecturas altamente escalables y disponibles, flujos de trabajo amigables para DevOps, automatización de tareas, reducción de errores humanos, eficiencia de cómputo multi-tenant, alto nivel de interoperabilidad y portabilidad.

En fechas recientes, Oracle anunció la integración con la plataforma de Cloud Foundry derivado de la implementación de un Open Service Broker que soporta Oracle Cloud Platform Services en Cloud Foundry workloads. Además de que abrió la interfaz BOSH Cloud Provider Interface que permite el despliegue de cargas de trabajo de distintos proveedores, tales como Cloud Foundry, sobre infraestructura Cloud de Oracle. Misma que estará disponible en los próximos meses.

La mezcla de Spring Boot, Cloud Foundry y Oracle Cloud provee una forma para implementar Microservicios, tomando ventaja de las facilidades de programación de Spring Boot, la agilidad de entrega y escalabilidad de Cloud Floundry y de la robustez de Oracle Cloud.

Puedes implementar tu solución usando el Open Service Broker para Oracle Cloud Platform Services. Esto significa que por medio de un Service Broker, es posible conectar las aplicaciones desplegadas en CF, con servicios de Oracle tales como Oracle Database Cloud, MySQL Cloud, Java Cloud, DataHub (Cassandra) y EventHub (Kafka) sin necesidad de desplegarlos en CF y con la facilidad de solo registrarlos. Cabe mencionar que estos servicios están disponibles OnPremise en Oracle Cloud Machine, en Oracle Exadata Cloud Machine, o bien, en Cloud público en Oracle Cloud Infrastructure.

Desplegar aplicaciones Cloud Foundry sobre Oracle IaaS es una segunda opción, y se lleva a cabo por medio de BOSH usando una Cloud Provider Interface, la cual consiste de un conjunto de métodos comunes que permiten trabajar con determinados proveedores de infraestructura Cloud, ayuda a crear y eliminar imágenes, iniciar y detener VMs, preparar redes y ejecutar otras tareas de administración de Cloud.

BOSH es un proyecto que unifica ingeniería de liberación, despliegue y manejo del ciclo de vida del software en Cloud. Puede provisionar y desplegar software sobre cientos de VMs, incluyendo monitoreo, recuperación de errores y actualizaciones de software con cero a mínimo downtime. Fue desarrollado con el propósito de ejecutar los 4 principios de un Realese Engineering moderno; Identifiability, Reproducibility, Consistency y Agility.

Tutorial

En este momento, mientras Oracle avanza en afinar los detalles de la integración con estas herramientas, comencemos por familiarizarnos con la combinación Spring Boot y Cloud Foundry.

En este simple ejercicio desarrollaremos un servicio REST con Spring Boot, que pudiera ser eventualmente complementado para ser un Microservicio, y lo desplegaremos en Cloud Foundry, lo que nos proveerá de características como mecanismos de aprovisionamiento automatizado, configuración de servicios externos, como por ejemplo bases de datos, y un entorno de ejecución simplificado que ya contiene atributos necesarios para implementar una arquitectura de Microservicios.

Para este ejemplo desplegaremos nuestro servicio en Pivotal Web Services, el cual es uno de los proveedores IaaS que soporta aplicaciones Cloud Floundry. Por lo que es necesario crear una cuenta de prueba, si no tienes alguna ya, puedes obtenerla en el sitio de Pivotal https://pivotal.io/get-started

Los requerimientos para implementar el ejercicio son:

  • Java JDK 1.8 https://java.com/en/download/
  • Maven 3.5+ https://maven.apache.org/download.cgi
  • IDE de desarrollo, en este caso Eclipse https://www.eclipse.org/downloads/
  • Cloud Foundry CLI https://docs.cloudfoundry.org/cf-cli/install-go-cli.html

Crear la aplicación de Spring Boot

Usaremos el Spring Boot Initializer https://start.spring.io/ aquí selecciona las siguientes opciones, establece el nombre del proyecto y del paquete, y para las dependencias selecciona las que contiene el pom de Config Server.

Importar la aplicación en Eclipse

Una vez que se ha descargado, descomprime el archivo y en Eclipse importa el proyecto como Existing Maven Projects.

Selecciona la carpeta de código fuente y el archivo pom.xml asociado a éste y continúa la importación.

Una vez completada la importación, complementa la clase autogenerada con el siguiente código:

package com.example.ms.cf.oracle.microservicesSB;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
public class MicroservicesSbApplication {

	public static void main(String[] args) {
		SpringApplication.run(MicroservicesSbApplication.class, args);
	}
}

@RestController
class MessageRestController {
 
    @RequestMapping("/ms")
    String getMessage(@RequestParam(value = "message") String message) {
        String response = "The message from request: " + message;
        System.out.println(response);
        return response;
    }
}

De tal forma que el proyecto queda de la siguiente manera:

Aquí puedes observar las anotaciones agregadas @RestController y @RequestMapping, donde la primera le indica a Spring que renderice el string de resultado directamente a quien ejecutó la petición, mientras que la segunda anotación provee información de ruteo, le indica a Spring que cualquier petición HTTP con el path / debe ser mapeada al método home. Cabe mencionar que estas anotaciones no son específicas de Spring Boot sino de Spring MVC.

Agregar archivo de configuración del proyecto

En la carpeta src/main/resources crea un archivo llamado bootstrap.properties y agrega las siguientes líneas

server.contextPath = /ms
management.security.enabled = false

Probar el servicio localmente

En este punto ya puedes desplegar el servicio y probarlo de manera local en una instancia de Tomcat container embebida. Selecciona la clase, clic derecho, Run As, Java Application y selecciona Spring Boot Application si lo solicita Eclipse. Una vez finalizado el despliegue se mostrará un mensaje como este:

Ejecuta la prueba en el explorador de internet en la ruta:

http://localhost:8080/ms?message=mymicroservice

El servicio está ahora en ejecución y funcionando. Lo siguiente es enviarlo a Cloud Foundry.

Generar el desplegable con Maven

Para generar el jar será necesario ejecutar los siguientes comandos desde la consola de línea de comandos. Primero ubícate en la carpeta del proyecto, después ejecuta maven package

Esto generará el archivo llamado microservicesSB-0.0.1-SNAPSHOT.jar en la carpeta target.

Crear el archivo de configuración de despliegue

En la carpeta raíz del proyecto crea un archivo llamado manifest.yml y agrega las siguientes líneas:

---
applications:
 - name: microservicesSB
   random-route: true
   path: target/microservicesSB-0.0.1-SNAPSHOT.jar
   memory: 768M
   instances: 1

Este archivo ayudará a desplegar la aplicación en Cloud Foundry y configurar las opciones requeridas de memoria, instancias creadas, ubicar el jar, entre otras cosas más.

Desplegar la aplicación en Cloud Foundry

Ahora es turno de CF de hacer el trabajo, para desplegar la aplicación será necesario usar los comandos de Cloud Floundry CLI y tener la cuenta de Pivotal WS activa y a la mano. Cambia de ubicación a la carpeta del proyecto, ejecuta el comando de login y provee usario y password.

cd /Users/sandra/Proyectos/Eclipse/SpringBoot/microservicesSB
cf login -a api.run.pivotal.io

Para ver las aplicaciones actualmente desplegadas ejecuta el comando cf apps, inicialmente no tendrás ninguna.

Ejecutar el comando cf push para desplegar la aplicación

Una vez finalizado el despliegue ejecuta nuevamente el comando cf apps, ahora podrás ver tu aplicación desplegada de manera exitosa y el url donde está en ejecución.

Probar el servicio desplegado

En el explorador web, usa el endpoint mostrado anteriormente y ejecuta el servicio.

Conclusión.

Noticias como esta no solo representan un beneficio para aquellos que desarrollamos y usamos las tecnologías de Oracle, sino para todos los que estamos en este ámbito, el hecho de que los gigantes del software estén abriendo sus puertas para colaborar entre sí indica que la tendencia se inclina hacia diseñar soluciones combinando tecnologías de distintos tipos y proveedores, en las que el reto ahora es realizar la combinación adecuada para solucionar problemas específicos.

La inclusión de Oracle en Cloud Foundry abre las puertas a los arquitectos para diseñar soluciones modernas, portables y en las que muchas veces se deben utilizar elementos usados por las organizaciones, de tal forma que se puede aprovechar al máximo la inversión en software sin sacrificar la funcionalidad y en apego a formas de trabajo ágiles y actuales.

Referencias.

https://www.oracle.com/corporate/pressrelease/oow17-major-innovations-container-native-100217.html

https://pivotal.io/microservices

https://docs.pivotal.io/pivotalcf/1-12/concepts/overview.html

https://docs.oracle.com/en/cloud/paas/app-container-cloud/dvcjv/preparing-cloud-foundry-application-deployment.html

http://bosh.io

https://content.pivotal.io/blog/on-choice-and-oracle-joining-the-cloud-foundry-party