Notas de Spring: Spring Cloud

    Introducci贸n

    Spring Framework es un marco muy robusto, lanzado en 2002. Sus caracter铆sticas principales pueden aplicarse a aplicaciones Java simples o ampliarse a aplicaciones web modernas y complejas.

    Dado que se actualiza constantemente y sigue nuevos paradigmas de arquitectura y programaci贸n, ofrece soporte para muchos otros marcos que trabajan de la mano con 茅l.

    Con una gama tan amplia de funcionalidades, es normal que nos presente algunas anotaciones nuevas, que son una parte clave del desarrollo de aplicaciones Spring.

    La configuraci贸n de Spring es totalmente personalizable, lo que originalmente se hizo a trav茅s de archivos de configuraci贸n XML. Sin embargo, este enfoque se ha quedado obsoleto y la mayor铆a de las personas hoy en d铆a recurren a la configuraci贸n de anotaciones.

    Dicho esto, esta serie de art铆culos tiene como objetivo desentra帽ar las opciones que usted, como desarrollador, tiene para configurar y usar el marco Spring:

    • Anotaciones de Spring: @RequestMapping y sus variantes
    • Spring Annotations: anotaciones principales
    • Notas de Spring: Spring Cloud
    • Spring Annotations: Prueba de anotaciones

    Anotaciones de Spring Cloud

    Nube de Spring es una gran extensi贸n del ya robusto Spring Framework. Permite a los desarrolladores crear patrones comunes sin esfuerzo y sin dolor cuando se trata de arquitectura basada en la nube, como la configuraci贸n de disyuntores, descubrimiento de clientes, enrutamiento, etc.

    Ya hemos publicado varios art铆culos que cubren algunos de estos temas, por lo que si desea ver estas anotaciones sobre ejemplos pr谩cticos, estos son un gran comienzo:

    • Spring Cloud: descubrimiento de servicios con Eureka
    • Spring Cloud: enrutamiento con Zuul y Gateway
    • Nube de Spring: Hystrix
    • Spring Cloud: Turbina
    • Spring Cloud Stream con RabbitMQ: microservicios basados 鈥嬧媏n mensajes

    @EnableConfigServer

    Spring Cloud nos presenta varias herramientas 煤tiles, cada una de las cuales necesita alg煤n tipo de configuraci贸n.

    Si usamos varias herramientas, ser铆a l贸gico almacenar todos los detalles de configuraci贸n en un solo lugar, similar a un application.properties archivo.

    Para hacer esto, anotamos una clase con el @EnableConfigServer anotaci贸n, aplicada a nivel de clase:

    @SpringBootApplication
    @EnableConfigServer
    public class SomeApplication {
        public static void main(String[] args) {
            SpringApplication.run(SomeApplication.class, args);
        }
    }
    

    Esta anotaci贸n le dice a Spring d贸nde buscar configuraciones y al crear una configuraci贸n de servidor centralizada como esta, otras aplicaciones pueden comunicarse con 茅l a trav茅s de su puerto, que por defecto es 8080.

    @EnableEurekaServer

    Al desarrollar un proyecto con una arquitectura de microservicio, especialmente cuando hay numerosos servicios que deber铆an funcionar juntos, nos enfrentamos a un problema. La forma en que estos servicios se comunican entre s铆.

    Podr铆amos codificar todos los nombres y puertos en un archivo de propiedad, pero esta es una mala pr谩ctica y no es escalable en absoluto. Incluso si lo hici茅ramos, 驴qu茅 sucede cuando hay varias instancias de un servicio? 驴Cu谩l responde a la solicitud?

    Para resolverlos, podemos confiar en Service Discovery a trav茅s de Eureka.

    Muy similar al @EnableConfigServer anotaci贸n, crearemos un servidor Eureka anotando una clase con @EnableEurekaServer, que ahora se puede usar para buscar otros servicios registrados y administrarlos:

    @SpringBootApplication
    @EnableEurekaServer
    public class SomeApplication {
        public static void main(String[] args) {
            SpringApplication.run(SomeApplication.class, args);
        }
    }
    

    @HabilitarEurekaClient

    Un servidor Eureka no es nada sin sus servicios. Cada servicio que queramos poner en el radar de nuestro servidor debe estar anotado con el @EnableEurekaClient anotaci贸n.

    Como alternativa, podr铆amos utilizar el @EnableDiscoveryClient anotaci贸n, que proviene de spring-cloud-commons. Sin embargo, si conoce la implementaci贸n espec铆fica que utilizar谩, es mejor ser espec铆fico. Si est谩 usando el m谩s gen茅tico @EnableDiscoveryClient anotaci贸n, Spring elegir谩 la implementaci贸n en funci贸n de la .jars presentes en la ruta de clases.

    @SpringBootApplication
    @EnableEurekaClient
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
            }
    }
    

    @EnableDiscoveryClient

    La anotaci贸n de cliente de descubrimiento predeterminada que marca una clase como un servicio que se debe poner en el radar de un servidor.

    @EnableCircuitBreaker

    Una vez m谩s, cuando trabajamos con microservicios, nos enfrentamos a un gran problema. Es com煤n que los servicios trabajen con otros servicios para completar ciertas solicitudes.

    Digamos que el Servicio A llama al Servicio B, que depende del Servicio C para completar una solicitud. Ahora digamos que el servicio C falla completamente debido a un error de red o una sobrecarga. Lo que sucede a continuaci贸n es un error en cascada en el flujo de l贸gica que regresa al Servicio A.

    Lo que podemos hacer para corregir esto es implementar interruptores autom谩ticos. Cada servicio debe tener un punto de ruptura de circuito, y si ocurre algo malo, “abren sus circuitos” para que el problema no se transponga a otros servicios. En este caso, el disyuntor de nuestra elecci贸n a铆sla el servicio que falla para que otros servicios no puedan llamarlo y fallar tambi茅n.

    los @EnableCircuitBreaker La anotaci贸n se aplica a nivel de clase, para todos y cada uno de los servicios en nuestra arquitectura de microservicio:

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    public class ServiceA {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceA.class, args);
        }
    }
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    public class ServiceB {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceB.class, args);
        }
    }
    
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableCircuitBreaker
    public class ServiceC {
    
        public static void main(String[] args) {
            SpringApplication.run(ServiceC.class, args);
        }
    }
    

    El patr贸n de disyuntor en Spring se implementa a trav茅s de Spring Cloud: Hystrix.

    @HystrixCommand

    Para que el patr贸n del disyuntor funcione completamente, no podemos solo anotar clases. Dado que en casi todas las situaciones podemos “esperar” que un m茅todo pueda ser riesgoso, en el sentido de que podr铆a fallar cuando se llama, lo marcamos con @HystrixCommand. Junto a la anotaci贸n, tambi茅n podemos agregar una bandera que apunte a un m茅todo diferente para ejecutar si el original falla:

    @GetMapping(value = "/personalized/{id}")
    @HystrixCommand(fallbackMethod = "recommendationFallback")
    public Product[] personalized(@PathVariable int id) {
        Product[] result = restTemplate.getForObject("http://recommendation-service/recommendations", Product[].class);
        return result;
    }
    
    public Product[] recommendationFallback(int id) {
        System.out.println("=======recommendationFallback=========" + id);
        return new Product[0];
    }
    

    @RibbonClient

    Cinta funciona como un equilibrador de carga en el lado del cliente y le da control sobre los clientes HTTP y TCP.

    En la mayor铆a de los casos, cuando se utiliza un cliente de descubrimiento como Eureka, no es necesario utilizar esta anotaci贸n, ya que se aplica de forma predeterminada. En la gran mayor铆a de los casos, las opciones predeterminadas son lo suficientemente buenas como para encargarse del equilibrio de carga, pero si necesita modificarlas, puede hacerlo:

    @Configuration
    @RibbonClient(name = "custom", configuration = CustomConfiguration.class)
    public class SomeConfiguration {
    
    }
    

    los CustomConfiguration la clase tambi茅n debe ser una @Configuration clase anotada con la configuraci贸n de cinta personalizada configurada como beans.

    @LoadBalanced

    los @LoadBalanced la anotaci贸n se usa para marcar RestTemplates que deber铆an funcionar con el RibbonLoadBalancerClient al interactuar con sus servicios:

    @RestController
    @RibbonClient(name = "custom", configuration = CustomConfiguration.class)
    public class SomeApplication {
    
        @LoadBalanced
        @Bean
        RestTemplate restTemplate(){
            return new RestTemplate();
        }
        // ...
    }
    

    Esta anotaci贸n b谩sicamente permite RestTemplate para aprovechar su soporte integrado para el equilibrio de carga.

    Conclusi贸n

    El marco de Spring es un marco poderoso y robusto que realmente cambi贸 el juego cuando se trata de desarrollar aplicaciones web. Entre su gran cantidad de proyectos, el m贸dulo Spring Cloud es una gran extensi贸n del marco original.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *