Gu铆a para la tarea de Spring Cloud: microservicios de Spring Boot de corta duraci贸n

    Introducci贸n

    Los microservicios se est谩n desarrollando a nuestro alrededor hoy en d铆a. Muchos de estos servicios son de corta duraci贸n. Las tareas programadas, la sincronizaci贸n de datos, la agregaci贸n de datos, la generaci贸n de informes y servicios similares son de corta duraci贸n. Por lo general, se espera que comiencen, se ejecuten hasta su finalizaci贸n y finalicen.

    Se han creado muchas aplicaciones y programadores externos para cumplir con este prop贸sito; sin embargo, a veces necesita una tarea personalizada que requiere una integraci贸n profunda con la aplicaci贸n de su organizaci贸n.

    La plataforma Spring Boot pone esta funcionalidad a disposici贸n de los desarrolladores a trav茅s de Spring Cloud Task API.

    驴Qu茅 es Spring Cloud Task?

    Normalmente, se espera que los servicios sean de larga duraci贸n. Un servicio Spring Boot promedio incluye un servidor web integrado como Tomcat, Jetty o Undertow. Un servicio finaliza porque se detiene a prop贸sito o por un error de tiempo de ejecuci贸n como un OOM (OutOfMemoryError) ocurri贸.

    Spring Boot se cre贸 de esta manera, pero a medida que los paradigmas cambiaron y la arquitectura de microservicios se hizo popular, muchos servicios se volvieron ef铆meros. Esto fue excesivo ya que un servicio de notificaci贸n de corta duraci贸n no necesita tener un servidor integrado y podr铆a ser mucho m谩s liviano.

    Tarea de Spring Cloud es la respuesta de Spring al problema de los microservicios de corta duraci贸n en Spring Boot.

    Con Spring Cloud Task, obtiene un proceso JVM bajo demanda que realiza una tarea y finaliza de inmediato.

    En este art铆culo, enlazaremos mucho con el proyecto oficial Spring Cloud Task disponible en Github.

    Arquitectura t茅cnica de Spring Cloud Task

    Spring Cloud Task usa algunas anotaciones para configurar el sistema y una base de datos (al menos para producci贸n) para registrar el resultado de cada invocaci贸n.

    Para que su aplicaci贸n Spring Boot sea una tarea en la nube, debe anotar una de las clases de configuraci贸n de su aplicaci贸n con @EnableTask.

    Esta anotaci贸n importa el TaskLifecycleConfiguration en su proyecto. los TaskLifecycleConfiguration class es la clase de configuraci贸n para el TaskLifecycleListener, TaskRepository y otras clases 煤tiles necesarias para dar vida a todas las funcionalidades de Spring Cloud Task.

    Implementaci贸n

    Spring Initializr

    Una buena manera de arrancar su proyecto esqueleto Spring Boot es usar Spring Initializr. Seleccione su dependencia de base de datos preferida, la dependencia de Spring Cloud Task y la dependencia de Spring Data JPA:

    Si ya tiene un proyecto en ejecuci贸n, con Maven, agregue las dependencias adecuadas:

    <dependency>
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-task</artifactId>
         <version>${version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>${version}</version>
    </dependency>
    
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${version}</version>
    </dependency>
    

    los spring-cloud-starter-task la dependencia incluye spring-boot-starter, spring-cloud-task-core, spring-cloud-task-batch y spring-cloud-task-stream.

    los spring-cloud-task-core la dependencia es la principal que usaremos; puede importar el spring-boot-starter y la antigua dependencia por separado.

    Alternativamente, si est谩 usando Gradle:

    compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-task', version: '2.2.3.RELEASE'
    

    Configurar la aplicaci贸n

    Para registrar una aplicaci贸n como Spring Cloud Task, debe anotar una de las clases de configuraci贸n con @EnableTask:

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

    Desde el @SpringBootApplication la anotaci贸n es una combinaci贸n de @EnableAutoConfiguration, @Configuration y @ComponentScan, est谩 perfectamente bien anotar la clase principal con el @EnableTask anotaci贸n.

    TaskRepository

    Se puede crear una tarea sin una base de datos. En ese caso, utiliza una instancia en memoria de H2 para administrar los eventos del repositorio de tareas. Esto est谩 bien para el desarrollo, pero no para la producci贸n. Para producci贸n, se recomienda una fuente de datos. Conserva todos los registros de sus ejecuciones de tareas y errores.

    Todos los eventos de tareas se conservan mediante el TaskRepository.

    En un proyecto de fuente de datos 煤nica, Spring Cloud Task crea las tablas de tareas en la base de datos especificada.

    Sin embargo, en un proyecto de m煤ltiples fuentes de datos, debe elegir la fuente de datos para usar con Spring Cloud Task. Puede encontrar un ejemplo de un proyecto de m煤ltiples fuentes de datos en el Proyectos de muestra de Spring Cloud Task.

    En el ejemplo, se especifican 2 fuentes de datos en el DataSoureConfiguration clase:

    @Configuration
    public class DataSourceConfiguration {
    
        @Bean
        public DataSource dataSource() {
            return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.HSQL)
                .build();
        }
    
        @Bean
        public DataSource secondDataSource() {
            return new EmbeddedDatabaseBuilder()
                .setType(EmbeddedDatabaseType.H2)
                .build();
        }
    }
    

    Para especificar la fuente de datos que utilizar谩 Spring Cloud Task, un CustomTaskConfigurer se crea el componente. Eso extends DefaultTaskConfigurer, pasando la fuente de datos calificada en el constructor:

    @Component
    public class CustomTaskConfigurer extends DefaultTaskConfigurer {
        @Autowired
        public CustomTaskConfigurer(@Qualifier("secondDataSource") DataSource dataSource)  {
            super(dataSource);
        }
    }
    

    A menos que sea una costumbre TaskRepository se especifica extendiendo el SimpleTaskRepository, la SimpleTaskRepository es el predeterminado TaskRepository utilizado por Spring Cloud Task.

    TaskConfigurer

    los TaskConfigurer se utiliza para personalizar las configuraciones de Spring Cloud Task. DefaultTaskConfigurer es el configurador predeterminado que se utiliza si no hay un configurador de tareas personalizado que implemente el TaskConfigurer se proporciona la interfaz.

    DefaultTaskConfigurer proporciona componentes basados 鈥嬧媏n mapas si no hay una fuente de datos disponible y componentes JDBC si se proporciona una fuente de datos.

    TaskExplorer

    los TaskExplorer, como su nombre indica, es un explorador de ejecuciones de tareas. Es 煤til para recopilar informaci贸n real de tareas del repositorio de tareas.

    De forma predeterminada, Spring Cloud Tasks usa el SimpleTaskExplorer.

    Desde el TaskExplorer, puede consultar mucha informaci贸n 煤til sobre las ejecuciones de tareas, como el recuento total de TaskExecutions, actualmente en ejecuci贸n TaskExecutions , encontrando todo TaskExecutionsetc.

    Tarea Ejecuci贸n

    TaskExecution es el estado de la tarea para cada ejecuci贸n. Toda la informaci贸n almacenada en el TaskRepository se modela en esta clase. Es la unidad b谩sica para cada tarea.

    Parte de la informaci贸n almacenada es

    • executionId – Id 煤nico asociado a la ejecuci贸n de la tarea.
    • exitcode – C贸digo de salida grabado para la tarea.
    • taskName – Nombre definido por el usuario para la tarea.
    • startTime – Hora de inicio de la tarea.
    • endTime – Marca de tiempo de finalizaci贸n de la tarea.
    Ejecutando una tarea

    Para ejecutar nuestra tarea, tenemos que implementar el Runner interfaz y proporcionarlo como un bean en nuestra clase de configuraci贸n.

    Generalmente, CommandLineRunner o ApplicationRunner est谩 implementado:

    @Component
    public class SampleCommandLineRunner implements CommandLineRunner {
        @Override
         public void run(String...args) throws Exception {
             System.out.println("Specified Task");
         }
    }
    
        @Configuration
        public class TaskConfiguration {
         @Bean
         public SampleCommandLineRunner sampleCommandLineRunner() {
              return new SampleCommandLineRunner();
         }
    }
    

    Y con eso, de un main m茅todo, podemos llamar al SampleCommandLineRunner:

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

    TaskExecutionListener

    Todas TaskExecutions tienen un ciclo de vida. Spring Cloud Task registra estos eventos. Al comienzo de una tarea, antes de cualquier Runner se han ejecutado implementaciones de interfaz, una entrada en el TaskRepository que registra el evento de inicio.

    Cuando una tarea se completa o falla, se emite otro evento. TaskExecutionListener le permite registrar oyentes para escuchar este evento durante todo el ciclo de vida.

    Puede especificar tantos oyentes como desee para el mismo evento.

    Spring proporciona dos enfoques para hacer esto: usar el TaskExecutionListener interfaz o el m茅todo de anotaci贸n de bean.

    Para el primero, proporciona un componente que implementa el TaskExecutionListener interfaz y sus tres m茅todos:

    void  onTaskStartup(TaskExecution  taskExecution);
    void  onTaskEnd(TaskExecution  taskExecution);
    void  onTaskFailed(TaskExecution  taskExecution, Throwable  throwable);
    
    • onTaskStartup() – Invocado despu茅s del TaskExecution ha sido almacenado en el TaskRepository.
    • onTaskEnd() – Invocado despu茅s del TaskExecution ha sido actualizado en el TaskRepository, al finalizar la tarea.
    • onTaskFailed() – Se invoca si se produce una excepci贸n no detectada durante la ejecuci贸n de la tarea.

    Por otro lado, utilizando el m茅todo de anotaci贸n de bean, crea un componente y lo suministra como un bean en su configuraci贸n de Spring:

    @Configuration
    public class AppConfigurtion {
    
        @Bean
        public AppTaskListener appTaskListener() {
            return new AppTaskListener();
        }
    }
    
    @Component
    class AppTaskListener {
        @BeforeTask
        public void beforeTaskInvocation(TaskExecution taskExecution) {
            System.out.println("Before task");
        }
    
        @AfterTask
        public void afterTaskInvocation(TaskExecution taskExecution) {
            System.out.println("After task");
        }
    
        @FailedTask
        public void afterFailedTaskInvocation(TaskExecution taskExecution, Throwable throwable) {
            System.out.println("Failed task");
        }
    }
    
    • @BeforeTask es an谩logo a onTaskStartup().
    • @AfterTask es an谩logo a onTaskEnd().
    • @FailedTask es an谩logo a onTaskFailed().

    Mensajes de salida de tareas

    Aunque puede especificar cualquier n煤mero de oyentes para un evento en particular, si una excepci贸n es lanzada por un TaskExecutionListener controlador de eventos, se detiene todo el procesamiento de escucha para ese controlador de eventos.

    Por ejemplo, si tres onTaskStartup() los oyentes han comenzado y el primero onTaskStartup() El controlador de eventos lanza una excepci贸n, los otros dos onTaskStartup los m茅todos no se llaman.

    Sin embargo, los otros controladores de eventos (onTaskEnd() y onTaskFailed()) Para el TaskExecutionListeners son llamados.

    Cuando ocurren excepciones, el TaskExecutionListener devuelve un c贸digo de salida y un mensaje de salida. Anotar un m茅todo con @AfterTask nos permitir谩 configurar el mensaje de salida:

        @AfterTask
        public void afterError(TaskExecution taskExecution) {
            taskExecution.setExitMessage("Custom Exit Message");
        }
    

    Se puede establecer un mensaje de salida en cualquiera de los eventos de escucha, aunque solo se establecer谩n los mensajes relevantes. Si una tarea se ejecuta correctamente, onTaskFailed() el evento no disparar谩. Cuando finaliza la tarea, el mensaje del onTaskEnd() El evento est谩 configurado.

    Personalizaci贸n de tareas en la nube

    Muchas propiedades pueden ser anuladas por el TaskConfigurer especificando valores personalizados en el applications.properties o applications.yaml archivo.

    Las propiedades de la tarea de la nube de Spring tienen el prefijo spring.cloud.task en el applications.properties archivo.

    Algunas de las propiedades que pueden anularse son:

    • spring.cloud.task.tablePrefix – Este es el prefijo de tabla para las tablas de tareas para TaskRepository. El prefijo de tabla predeterminado es “TASK_".
    • spring.cloud.task.initialize-enabled=false – Se utiliza para habilitar o deshabilitar la creaci贸n de tablas de tareas al inicio de la tarea. Por defecto es verdadero.
    • spring.cloud.task.executionid=yourtaskId – Esto se usa para configurar Spring Cloud Task para usar su identificaci贸n de tarea personalizada. De forma predeterminada, Spring genera un Id. De ejecuci贸n de tarea para cada ejecuci贸n de tarea.

    Para ver m谩s propiedades personalizables, consulte askProperties.

    Registro de eventos de tareas en la nube

    Por lo general, es 煤til durante el desarrollo ver los registros de depuraci贸n de la aplicaci贸n. Para cambiar el nivel de registro para una tarea de Spring Cloud, agregue esto a su applications.properties archivo:

    logging.level.org.springframework.cloud.task=DEBUG
    

    Conclusi贸n

    En este art铆culo, presentamos Spring Cloud Task, qu茅 es y los problemas que resuelve. Tambi茅n cubrimos ejemplos de c贸mo configurarlo con una fuente de datos y ejecutar una tarea con el Runner interfaces.

    Adem谩s, explicamos la arquitectura Spring Cloud Task y todos los modelos de dominio como TaskExecution, TaskExecutionListener, etc. utilizado para lograr todas las funcionalidades.

    Etiquetas:

    Deja una respuesta

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