¿Qué es Spring? El Spring Framework (abreviado Spring) es un framework de código abierto para la plataforma Java. El objetivo de Spring es simplificar el desarrollo con Java/Java EE y promover buenas prácticas de programación. Spring ofrece, con un amplio espectro de funcionalidades, una solución integral para el desarrollo de aplicaciones y sus lógicas de negocio; en ello, la desacoplo de los componentes de la aplicación ocupa un lugar central. [wikipedia]

Entre los proyectos principales de Spring se encuentran:

  • Spring Boot
  • Spring Framework
  • Spring Cloud Date Flow
  • Spring Cloud
  • Spring Data
  • Spring Integration
  • Spring Batch
  • Spring Security
  • Spring HATEOAS
  • spring REST Docs
  • Spring AMQP
  • Spring Mobile
  • Spring for Android
  • Spring Web Flow
  • Spring Web Services
  • Spring LDAP
  • Spring Session
  • Spring Shell
  • Spring Flo
  • Spring Kafka
  • Spring Statemachine
  • Sprin IO Platform

Adicionalmente, Spring incluye los dos proyectos comunitarios:

  • Spring Roo
  • Spring SCALA

Los distintos proyectos de Spring como, p. ej. Spring Cloud consisten también en subproyectos individuales:

  • Spring Cloud Config
  • Spring Cloud Netflix
  • Spring Cloud Bus
  • Spring Cloud for Cloud Foundry
  • Spring Cloud Open Service Broker
  • Spring Cloud Cluster
  • Spring Cloud Consul
  • Spring Cloud Security
  • Spring Cloud Sleuth
  • Spring Cloud Data Flow
  • Spring Cloud Stream
  • Spring Cloud Stream App Starters
  • Spring Cloud Task
  • Spring Cloud Task App Starters
  • Spring Cloud Zookeeper
  • Spring Cloud for Amazon Web Services
  • Spring Cloud Connectors
  • Spring Cloud Starters
  • Spring Cloud CLI
  • Spring Cloud Contract
  • Spring Cloud Gateway
  • Spring Cloud OpenFeign
  • Spring Cloud Pipelines
  • Spring Cloud Function

En Spring Cloud, todos los proyectos se basan en Spring Boot.

Spring Cloud Config Si se quiere usar una configuración dentro de la aplicación, existen diferentes posibilidades:

  • Usar la configuración dentro de las variables de entorno. Inconveniente: se trata de forma distinta en sistemas diferentes.
  • Configuración dentro de la aplicación. Inconveniente: tras cada cambio, la aplicación debe recompilarse y reiniciarse.
  • Configuración en el sistema de archivos. Inconveniente: en aplicaciones en la nube no es accesible desde fuera.
  • Configuración dentro de la infraestructura de un proveedor de nube. Inconveniente: dependencia de un proveedor de nube.

Por tanto, Spring Cloud Config ofrece una solución alternativa.

La gestión de los archivos de configuración de los distintos microservicios se realiza a través del microservicio central de Spring Cloud. La persistencia puede llevarse a cabo en un sistema de control de versiones, como por ejemplo Git. El acceso a los archivos de configuración por parte de los microservicios (clientes) se realiza mediante REST. La transmisión de parámetros puede cifrarse de forma simétrica o asimétrica.

Spring Cloud Netflix (Eureka) Eureka es un servidor de descubrimiento de servicios.

Service-Discovery se refiere al reconocimiento automático de servicios en una red de ordenadores. En este caso, se utilizan protocolos de comunicación que describen cómo los servicios se encuentran para poder comunicarse entre sí. Fundamentalmente, se diferencian dos grupos de protocolos de descubrimiento de servicios (SDP):

  • Los servicios se registran en un servicio central (un Registro) y pueden encontrarse a través de éste.
  • Los servicios interrogan mediante difusión (broadcasting) toda la red en busca de un servicio determinado y el servicio buscado o un Registro responde.

[Fuente: Wikipedia]

Dentro de una región (p. ej. Eureka Cluster DE) los microservicios pueden registrarse en el servidor Eureka (Register). Eureka conoce a continuación todos los servicios dentro de su región. Después del registro, los servicios envían cada x segundos un ‘heartbeat’ a Eureka (Renew). En caso de que Eureka no reciba un ‘Renew’, elimina el servicio correspondiente del Registery. Los servidores Eureka replican entre sí la información del (Registery) y del (Renew). De este modo, los servicios pueden consultar información sobre otros servicios en una región remota y realizar una solicitud correspondiente al servicio remoto (Remote Call).

Frente a Eureka, el Spring Cloud Config Server actúa como cliente.

Spring Cloud Netflix (Ribbon) A diferencia de los balanceadores de carga clásicos basados en servidor, Ribbon es un balanceador de carga del lado del cliente que, de acuerdo con el Round Robin y otros parámetros, gestiona la comunicación con los servidores o balanceadores de carga en el servidor.

Spring Cloud Netflix (Feign) Feign tiene como objetivo simplificar la creación de clientes HTTP API. Para ello, basta con declarar y anotar una interfaz. Al usar Feign, Ribbon y Eureka se importan automáticamente.

Spring Cloud Netflix (Hystrix) Hystrix es un ‘Circuit Breaker’.

Una protección (en inglés: circuit breaker) es un patrón de diseño en el desarrollo de software. Sirve para detectar errores de conexión recurrentes a un recurso, como por ejemplo una base de datos o un servicio web, y bloquear el acceso al recurso durante un tiempo determinado.

Supongamos que una base de datos está sobrecargada debido a demasiadas solicitudes y se producen timeouts. Esto provoca que los usuarios, por razones psicológicas, intenten de nuevo la última acción realizada. Dado que la aplicación, sin una protección, espera en una tarea independiente hasta el timeout de cada solicitud a la base de datos, el pool de hilos se agota y la aplicación también falla.

Para evitar esto, se integra una protección en la aplicación. Esta detecta cuando se produce un gran número de errores de conexión e impide el acceso a la base de datos. En lugar de esperar hasta un timeout en la base de datos, la aplicación puede devolver inmediatamente un error o desactivar partes de su funcionalidad, evitando así el consumo de hilos adicionales del pool. De este modo, la aplicación puede funcionar con funcionalidad limitada incluso sin la base de datos. Además, se le da la oportunidad a la base de datos de ‘recuperarse’.

Tras un tiempo determinado, la protección se cierra y se reintenta la conexión con la base de datos. Si este intento falla, la protección se abre de nuevo de inmediato. De lo contrario, se restaura la funcionalidad de la aplicación. [Fuente: Wikipedia]

La figura anterior muestra primero una solicitud exitosa por parte del cliente, que a través del ‘Circuit Breaker’ o Hystrix se reenvía al servidor o base de datos. La segunda solicitud produce un timeout, por ejemplo porque la BD no está disponible. Las dos solicitudes siguientes son interceptadas y respondidas por Hystrix. Aquí también puede utilizarse una ruta alternativa. En la última consulta no existen problemas de conexión con el servidor, por lo que la solicitud se reenvía de nuevo al servidor.

Spring Cloud Netflix (Zuul) Zuul es un API-Gateway. Para entender Zuul, deben conocerse los siguientes términos: SOP y CORS.

SOP La política de mismo origen (Same-Origin-Policy, SOP) es un concepto de seguridad que prohíbe a los lenguajes de secuencias del lado del cliente, como JavaScript y ActionScript, pero también a las hojas de estilo en cascada (Cascading Style Sheets), acceder a objetos (por ejemplo, imágenes) que provengan de otra página web o cuyo lugar de almacenamiento no corresponda al origen. Constituye un elemento de seguridad esencial en todos los navegadores y aplicaciones web modernas para proteger contra ataques. [Fuente: Wikipedia]

CORS Los accesos de una página web o aplicación web a recursos de otro servidor o dominio se denominan Cross-Origin-Requests. Estos accesos se han impedido desde 1996 por la Same-Origin-Policy (SOP) de los navegadores. Sin embargo, el W3C define el método Cross-Origin Resource Sharing (CORS), que permite de nuevo a navegadores y clientes acceder a recursos de origen distinto. [Fuente: Wikipedia]

Una forma de permitir el acceso de clientes externos a recursos internos sin CORS es habilitar el acceso interno a través de un API-Gateway (Zuul).

Entre otras, Zuul cumple las siguientes tareas:

  • Autenticación y seguridad: autenticación de un cliente al acceder a los distintos recursos
  • Insights and Monitoring: seguimiento y generación de estadísticas sobre el uso de los datos.
  • Enrutamiento dinámico: enrutamiento de las solicitudes a los diferentes servicios de backend
  • Pruebas de estrés: aumenta progresivamente el tráfico a un sistema para medir el rendimiento.
  • Supresión de carga: gestión de las solicitudes reservando recursos adecuados para cada una y rechazando las solicitudes en caso de timeout.
  • Manejo de respuestas estáticas: ciertas respuestas se atienden directamente en el edge en lugar de reenviarlas a los clústeres para su procesamiento.
  • Resiliencia multiregión: ….

Spring Cloud Bus Esta característica sirve principalmente para emitir información centralizada de configuración y gestión. Como se describe en ‘Cloud Config Server’, los distintos servicios pueden solicitar información de configuración. Dado que una configuración por lo general cambia con poca frecuencia, esto puede generar tráfico de red innecesario. Spring Cloud Bus utiliza un Message Broker para publicar todos los cambios que recibe del ‘Cloud Config Server’. Todos los servicios registrados (suscriptores) son informados de una modificación y solo entonces pueden solicitar al ‘Cloud Config Server’ la configuración actualizada. Por defecto se admite el broker AMQP. Sin embargo, también se pueden usar otros brokers, como Apache Kafka o RabbitMQ. La figura anterior muestra cómo los microservicios 1 y 3, tras suscribirse al Spring Cloud Bus (Broker), son informados sobre un cambio.