Un curso intensivo: Como utilizar Spring Cloud Services en PAS

This article is available in English at Getting Started with Spring Cloud Services on Pivotal Application Service.

Cuando se trata de crear una arquitectura de microservicios robusta y resistente ubicada en la nube, los componentes de Spring Cloud/Netflix OSS son habilitadores conocidos y respetados. Ciertos modelos y mecanismos se han probado absolutamente esenciales para lograr alta velocidad (en desarollo) y alta disponibilidad (en producción), y Spring Cloud/Netflix OSS tiene unos de los "mejores entre los mejores".

Pivotal Application Service provee componentes claves de Spring Cloud/Netflix OSS como servicios de fácil consumo en su mercado, disponible por PAS Apps Manager y la interfaz de la línea de mandos de Cloud Foundry (CF CLI en inglés). Estos componentes son particularmente útiles cuando desplegado, manejado, escalado, y segurado por PAS:

  • Spring Cloud Services Config Server: exteriorizar los ajustes de su sistema distribuida como se hace Spring Cloud Config
  • Spring Cloud Services Service Registry: provee un directorio en que todas instancias de su microservicios se puede ver una a otra como se hace Spring Cloud Netflix Eureka
  • Spring Cloud Services Circuit Breaker Dashboard: un monitor visual de circuitos inter-servicio que muestra estadisticas de peticiones y el estatus de circuitos (cerrado, abierto, medio abierto) como se hace Spring Cloud Netflix Hystrix Dashboard

Por este artículo, le mostraré a Uds. como crear rápidamente estes servicios en su ambiente PAS. Unas asuncionas basicas nos ayudarán destilar este artículo a su esencia:

  1. Ya conocen Uds. los servicios de Spring Cloud/Netflix OSS que se sirven como fundaciones de estos componentes. Si no, por favor que lean esa material antes de leer este artículo. Se proveen referencias utiles en el parte inferior de esta página para que ayudarlos empezar.
  2. Seguridad es esencial por las sistemas en producción, y estos servicios no son excepciones. Pero por este artículo, nos concentramos especificamente y solamente en los propios servicios y de primero, como hacerlos funcionales en su ambiente de no producción.
  3. Por el primer punto antedicho, si ya se lo usan el Spring Cloud Config, es probable que ya tienen un repositorio de git que pueda proveer sus microservicios con los ajustes que se requieran y se esperen. Esto mismo repositorio se puede usado por el SCS Config Server si es accesible por https o ssl. Por este artículo, configuro SCS para accesar con https un repositorio de archivos de configuración en Github, pero para entender todas las opciones disponibles, por favor, consultan la documentación de SCS por los enlaces en el parte inferior de esta página.
  4. Ustedes están conectados a un punto final de PCF/PAS, sus administradores de nube han expuesto los servicos antedichos por el mercado, y tienes los privilegios necesarios de activarlos.
  5. No tanto una asunción como una declaración: yo prefiero la línea de mandos sobre las interfaces gráficas por muchas de las tareas que se pueden hacer con ambas, así que voy a usar la CF CLI por la mayoría de las tareas...pero la interfáz de PAS Apps Manager es extremamente limpia y útil, y la usaré cuando yo piense que provea más claridad. Pero por favor, hagan lo que se funciona mejor para Uds.

Con eso, vamonos!

Los microservicios, parte I

Para demostrar como estes servicios se funcionan y soportan nuestro microservicios, claro que necesitemos unos microservicios. Crearemos un microservicio dominio (que provea persistencia y lógico específico de un dominio de negocio) y un microservicio de borde (que provea una API expuesta al exterior a las aplicaciones clientes).

Por este artículo, he creado un servicio dominio se llama coffee-service y un microservicio de borde que se llama edge-service. El coffee-service expone un catálogo de cafés actualmente disponibles, detalles de cafés individuos, y un punto final que se llama /coffees/random que provee un café random por petición.

El edge-service expone un punto final que se llama /surpriseme (sorpréndame!) para barristas usando aplicaciones clientes (web, iOS, Android) para elegir un café random por petición del cliente.

Para conectar nuestras aplicaciones a SCS, tenemos que cambiar pocas cosas pequeñas.

coffee-service

La clase de aplicación principal

Necesitamos añadir la anotación @EnableDiscoveryClient a la clase principal de nuestra aplicación así que coffee-service se registra con y sondea el registro de servicios Eureka.

bootstrap.properties

spring.application.name=coffee-service  

Por nuestro ambiente de no producción (por favor, revisan las asuncionas antedichos!), deactivamos seguridad HTTP basica y seguridad para los puntos finales de administración de Actuator (si usemos Spring Boot Actuator). Los ajustes que lo hagan son security.basic.enabled y management.security.enabled, y se configuran a falso en los ajustes de coffee-service obtenidos del SCS Config Server.

manifest.yml

Creamos un archivo se llama manifest.yml y lo añade al directorio "root" del proyecto Spring Boot para que tengamos un método consistente y declarativo de desplegar la aplicación a PAS con el mando cf push. Aquí están los contenidos:

  applications:
    - name: coffee-service
      path: target/coffee-service-0.0.1-SNAPSHOT.jar
      memory: 1G

Dependencias

Para asegurar la propia interoperación de los microservicios desplegados a PAS con los componentes de SCS, debemos tomar un poco de cuidado para sincronizar versiones de las librerías de Spring Boot, Spring Cloud, y Spring Cloud Services. Este enlace provee una guía concisa de cuales versiones de eligir.

Después de eligir las versiones correctas, añadir capabilidades SCS a sus microservicios es relativamente fácil. Seguí la información en la página detrás el enlace antedicho, con variaciones pequeñas. Aquí están los pasos que tomé por configuración rapida y mantenibilidad de largo plazo.

En primer lugar, yo creé otro propiedad en el archivo pom.xml de coffee-service por spring-cloud-services.version para corresponder con lo que existe spring-cloud.version, usando las entradas correctas de la tabla de dependencias clientes.

Segundo, añadí las librerías clientes config-client y service-registry adentro de la sección de Maven <dependencies>.

Tercero, añadí las dependencias apropiadas adentro de la sección de Maven <dependencyManagement>, refiriendo a la propiedad spring-cloud-services.version creado antes.

edge-service

La clase de aplicación principal

Tengan cuidado añadir ambas anotaciones @EnableCircuitBreaker y @EnableDiscoveryClient a la declaración de la clase de aplicación principal así que edge-service se registra con y sondea el registro de servicios Eureka y soportar Hystrix cortacircuitos (en inglés, circuit breakers).

bootstrap.properties

spring.application.name=edge-service  

Por nuestro ambiente de no producción (por favor, revisan las asuncionas antedichos!), deactivamos seguridad HTTP basica y seguridad para los puntos finales de administración de Actuator (si usemos Spring Boot Actuator). Como con coffee-service, los ajustes que lo hagan son security.basic.enabled y management.security.enabled, y se configuran a falso en los ajustes de edge-service obtenidos del SCS Config Server.

manifest.yml

Creamos un archivo se llama manifest.yml y lo añade al directorio "root" del proyecto Spring Boot para que tengamos un método consistente y declarativo de desplegar la aplicación a PAS con el mando cf push. Aquí están los contenidos:

  applications:
    - name: edge-service
      path: target/edge-service-0.0.1-SNAPSHOT.jar
      memory: 1G

Dependencias

Como con coffee-service, yo creé otro propiedad en el archivo pom.xml de edge-service por spring-cloud-services.version para corresponder con lo que existe spring-cloud.version.

Segundo, añadí las librerías clientes config-client, service-registry, y circuit-breaker a la sección de Maven <dependencies>.

Tercero, añadí las dependencias apropiadas a la sección de Maven <dependencyManagement>, refiriendo a la propiedad spring-cloud-services.version creado antes.

Ambos microservicios

Finalmente, construí ambos proyectos con mvn clean package y hice un mando cf push --no-start para enviar las aplicaciones a PAS. Usamos la bandera --no-start para subir los microservicios a la nube pero no ejecutarlos, pendiente a sus conexiones a los servicios SCS.

Es todo por ahora. Próximamente, tenemos que crear los servicios SCS que planeamos usar con nuestros microservicios.

El mercado (Marketplace)

Cada servicio disponible en el mercado puede tener un plan...or muchos planes de los que se puede elegir. Estos planes se muestran en el mercado de Apps Manager cuando se elige el servicio deseado y se abre la página de información, o de la CF CLI si se manda cf marketplace, o simplemente cf m.

Apps Manager Marketplace listing

Services Marketplace en Apps Manager

CF CLI Marketplace listing

Services Marketplace catálogo en la CF CLI

Por cada servicio que se quiere activar del mercado, se necesita determinar cual plan de elegir. Por servicios con sólo un plan, es fácil: se elige el plan. :)

Por adicional información sobre un servicio particular en el mercado, existe este mando útil de la CF CLI:

cf m -s <NOMBRE_DE_SERVICIO>  

Spring Cloud Services Config Server

Para activar el SCS Config Server, sólo se necesita dos cosas: la CF CLI y un repositorio adecuado de archivos de configuración con ajustes para los microservicios deseados. Para conectar los dos, aquí está el mando se necesita escribir en el la CF CLI (con cambios apropiados al nombre del servicio y el uri del repositorio, claro):

cf cs p-config-server standard config-service -c '{"git": { "uri": "https://github.com/mkheck/SCSconfig", "label": "master" } }'  

Examinemos esto un poco.

cf el la utilidad CF CLI

cs es el mando de "create service", or crear un servicio

p-config-server es el nombre de servicio expuesto en el mercado para el Spring Cloud Services Config Server

standard es el plan que eligimos

config-service es el nombre que asigné a la instancia de servicio que se crea. Por favor, eligen nombres que se adhieran con sus preferencias y estándares de nombrado.

-c es seguido por un objeto JSON conteniendo parámetros de configuration. Es este caso, nuestro objeto git contiene propiedades para un uri (representando un repositorio accesible de git, en este ejemplo, un repositorio ubicado en Github) y la label apropiada (aquí, "master").

Una vez que hemos emitido el mando antedicho, escribiendo cf s en la línea de mandos se muestra una lista de nuestros servicios activos. De nota particular es el columno con el título "last operation" que se muestra el estatus de "create succeeded" para el Config Server cuando está listo.

Spring Cloud Services Service Registry

Para crear y configurar el regístro de servicios SCS, simplemente ejecutar el mando siguiente en la CF CLI (con su elección de NOMBRE_DE_SERVICIO, claro):

cf cs p-service-registry standard eureka-service  

Para ver la consola (dashboard en inglés) del SCS Service Registry, navigamos al enlace de "dashboard" que se muestra en la salida del mando cf service eureka-service (o en Apps Manager, elegiendo "Manage" de la página del SCS Service Registry).

Service Registry Dashboard (sin servicios ya registrado)

Nuestros dos microservicios, coffee-service y edge-service no se han atado con el regístro y aún no se ejecutan en este punto, así que no se aparecen aquí.

Spring Cloud Services Circuit Breaker Dashboard

Para activar la consola de Spring Cloud Netflix Hystrix como componente SCS, simplemente escriben el mando siguiente en la CF CLI, cambiando el nombre de SERVICE_INSTANCE como quieran:

cf cs p-circuit-breaker-dashboard standard hystrix-dashboard  

Para ver la consola SCS Circuit Breaker, navigamos al enlace de "dashboard" que se muestra en la salida del mando cf service hystrix-dashboard (o elegiendo "Manage" de la página SCS Circuit Breaker Dashboard en Apps Manager).

Circuit Breaker Dashboard (sin circuitos activos actuales)

Nuestros dos microservicios, coffee-service y edge-service todavía no están ejecutando, así que no están circuitos actuales de monitor.

Los microservicios, parte II

Ahora que tengamos microservicios desplegados en PAS y SCS Services se configuran para soportarlos, el paso final es hacer las conexiones necesarias.

cf bs

Para que nuestros microservicios pueden usar los servicios que creemos en PAS, es necesario enlazar nuestras aplicaciones a los servicios apropiados. Es fácil hacerlo con el mando cf bind-service o su forma corta, cf bs.

Como tenemos dos microservicios y algunos SCS servicios con que enlazar cada uno, es necesario escribir estos mandos:

cf bs coffee-service config-service  
cf bs coffee-service eureka-service  
cf bs edge-service config-service  
cf bs edge-service eureka-service  
cf bs edge-service hystrix-dashboard  

Reiniciando nuestros microservicios

Las respuestas que recibimos cuando escribimos los mandos antedichos indicaron que se necesita "restage" ambos microservicios para que los cambios se activan, pero como solamente subimos las aplicaciones con la bandera --no-start y no las ejecutamos, necesitamos reiniciar (restart) nuestras aplicaciones para configurarlas completamente y crear el contenedor:

cf restart coffee-service  
cf restart edge-service  

Nuestros microservicios ahora deberían estar ejecutando, confiando en Spring Cloud Services para el apoyo esencial por una sistema distribuida. Verifiquemos para estar cierto. :)

Primero chequeemos el Service Registry.

Service Registry mostrando ambos servicios

Podemos verificar la salud y estatus de los dos microservicios por acesando los puntos finales expuestos por Spring Boot Actuator que incluimos en ambos proyectos y exponimos con propiedades entregado a cada microservicio por el SCS Config Server. Para hacerlo, accedemos el punto final /actuator desde el uri de cada aplicación, como mostrado en el siguiente ejemplo con coffee-service:

coffee-service actuator endpoint

Por supuesto, podemos navigar los puntos finales de la API de coffee-service que creemos también: /coffees, /coffees/{id}, y /coffees/random. Por ahora, vamos a saltar adelante para probar el punto final de edge-service /surpriseme que acceda el punto final de coffee-service /coffees/random y nos ofrece una opción rapida de probar los dos microservicios simultaneamente:

edge-service's /surpriseme endpoint

Se funciona (claro que sí)! Ahora que tenemos tráfico, deberíamos estar capaces de monitor nuestro circuito en la SCS Circuit Breaker Dashboard:

Circuit Breaker Dashboard mostrando un circuito activo!

Hay más (por supuesto!), pero dejaremos las discusiones por actualizaciones futuros.

Summary

Los componentes de Spring Cloud/Netflix OSS proveen una fundación solida para crear una arquitectura robusta y resistente para microservicios en la nube, y Pivotal Application Services lo hace fácil de crear y configurar estes habilitadores críticos como servicios manejando por la plataforma. En este artículo, creamos unos servicios dominios y entonces los conectamos con tres habilitadores claves:

  • Spring Cloud Services Config Server para suministrar los ajustes de configuración a nuestros microservicios dominios
  • Spring Cloud Services Service Registry para servir como directorio de todas instancias de nuestros microservicios
  • Spring Cloud Services Circuit Breaker Dashboard para proveer capabilidades de monitorear "circuitos" entre nuestros microservicios

Los componentes de Spring Cloud/Netflix OSS son herramientas poderosas que soporten numerosas sistemas distribuidas críticas, y están aún más poderosos cuando desplegados, manejados, escalados, y segurados por PAS.

Queden atentos (y me sigan en Twitter) por actualizaciones futuros!

Enlaces útiles de referencia

Hogar de Spring Cloud Services

Documentación de Pivotal (incluyendo PCF/PAS)

Documentación de Cloud Foundry

Docs de Spring

Docs de Spring Cloud

Repositorio principal de config y microservicios dominios