Рубрики
Без рубрики

Руководство по задаче Spring Cloud: Микросервисы с короткой загрузкой Spring

В этой статье мы погрузимся в задачу Spring Cloud, используемую для создания недолговечных микросервисов в экосистеме Java/Spring.

Автор оригинала: Guest Contributor.

Вступление

В настоящее время микросервисы развиваются повсюду вокруг нас. Многие из этих услуг недолговечны . Запланированные задачи, синхронизация данных, агрегирование данных, создание отчетов и аналогичные услуги являются недолговечными. Обычно ожидается, что они начнутся, завершатся и завершатся.

Для этой цели было создано множество внешних приложений и планировщиков, однако иногда вам требуется пользовательская задача, требующая глубокой интеграции с приложением вашей организации.

Платформа Spring Boot делает эту функциональность доступной для разработчиков через API задач Spring Cloud .

Что такое задача Spring Cloud?

Обычно ожидается, что службы будут работать в течение длительного времени. Средняя служба весенней загрузки включает встроенный веб-сервер, такой как Tomcat, Jetty или Undertow. Служба завершается, потому что она специально остановлена или произошла ошибка во время выполнения, такая как OOM ( OutOfMemoryError ).

Spring Boot был построен таким образом, но по мере того, как парадигмы менялись и архитектура микросервисов становилась популярной, многие сервисы стали недолговечными. Это было излишним, так как служба кратковременных уведомлений не нуждается во встроенном сервере и может быть намного более легкой.

Задача Spring Cloud – это ответ Spring на проблему недолговечных микросервисов в Spring Boot.

С помощью Spring Cloud Task вы получаете процесс JVM по требованию, который выполняет задачу и немедленно завершается.

В этой статье мы будем много ссылаться на официальный проект Spring Cloud Task, доступный на Github .

Техническая архитектура задачи Spring Cloud

Задача Spring Cloud использует несколько аннотаций для настройки системы и базы данных (по крайней мере, для производства) для записи результата каждого вызова.

Чтобы сделать приложение Spring Boot облачной задачей, вам необходимо аннотировать один из классов конфигурации вашего приложения с помощью @EnableTask .

Эта аннотация импортирует конфигурацию жизненного цикла задачи в ваш проект. Класс Конфигурация жизненного цикла задачи – это класс конфигурации для TaskLifecycleListener , Репозитория задач и других полезных классов, необходимых для реализации всех функций задачи Spring Cloud.

Реализация

Инициализация Пружины

Хороший способ начальной загрузки вашего проекта загрузки каркасной пружины-использовать Spring Initializr . Выберите предпочитаемую зависимость от базы данных, зависимость от задачи Spring Cloud и зависимость JPA для данных Spring:

Если у вас уже запущен проект с использованием Maven, добавьте соответствующие зависимости:


     org.springframework.cloud
     spring-cloud-starter-task
     ${version}



    org.springframework.boot
    spring-boot-starter-data-jpa
    ${version}



    org.postgresql
    postgresql
    ${version}

Зависимость spring-cloud-starter-task включает spring-boot-starter , spring-cloud-ядро задачи , пакет задач spring-cloud- и поток задач spring-cloud -|/.

Зависимость spring-cloud-task-core является основной, которую мы будем использовать – вы можете импортировать spring-boot-starter и предыдущую зависимость отдельно.

В качестве альтернативы, если вы используете Gradle:

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

Настройка приложения

Чтобы зарегистрировать приложение в качестве задачи Spring Cloud, вам необходимо аннотировать один из классов конфигурации с помощью @EnableTask :

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

Поскольку @SpringBootApplication аннотация представляет собой комбинацию @EnableAutoConfiguration , @Конфигурации и @ComponentScan , совершенно нормально аннотировать основной класс с помощью @EnableTask аннотации.

Хранилище задач

Задача может быть создана без базы данных. В этом случае он использует экземпляр H2 в памяти для управления событиями репозитория задач. Это хорошо для разработки, но не для производства. Для производства рекомендуется использовать источник данных. Он сохраняет все записи о выполнении ваших задач и ошибках.

Все события задачи сохраняются с помощью Репозитория задач .

В проекте с одним источником данных задача Spring Cloud создает таблицы задач в указанной базе данных.

Однако в проекте с несколькими источниками данных вам необходимо выбрать источник данных для использования с задачей Spring Cloud. Пример проекта с несколькими источниками данных можно найти в примерах проектов Spring Cloud Task|/.

В примере 2 источника данных указаны в классе Конфигурация источника данных :

@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();
    }
}

Чтобы указать источник данных, который будет использоваться задачей Spring Cloud, создается Настраиваемая задача, настроенная компонентом. Он расширяет конфигуратор задач по умолчанию , передавая квалифицированный источник данных в конструктор:

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

Если пользовательское Хранилище задач не указано путем расширения Репозитория простых задач , репозиторий Простых задач является хранилищем задач по умолчанию , используемым задачей Spring Cloud.

Настройка задачи

Настроенная задача используется для настройки конфигураций задач Spring Cloud. Конфигурация задачи по умолчанию используется конфигурация по умолчанию, если не предусмотрен пользовательский конфигуратор задач, реализующий интерфейс TaskConfigurer .

Конфигурация задачи по умолчанию предоставляет компоненты на основе карт, если источник данных недоступен, и компоненты JDBC, если источник данных предоставлен.

Обозреватель задач

Проводник задач , как следует из его названия, является проводником для выполнения задач. Это полезно для сбора фактической информации о задачах из хранилища задач.

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

По умолчанию в задачах Spring Cloud используется Простой обозреватель задач .

Из Обозревателя задач вы можете запросить много полезной информации о выполнении задач , например , общее количество задач , выполняемых в данный момент задач , поиск всех задач и т. Д.

Выполнение задачи

Выполнение задачи – это состояние Задачи для каждого Выполнения . Вся информация, хранящаяся в репозитории Задач , моделируется в этом классе. Это базовая единица для каждой задачи.

Часть хранящейся информации является

  • идентификатор выполнения – Уникальный идентификатор, связанный с выполнением задачи.
  • код выхода – Записанный код выхода для задачи.
  • имя задачи – определяемое пользователем имя задачи.
  • время начала – Время начала задачи.
  • Время окончания – Метка времени завершения задачи.
Выполнение задачи

Чтобы выполнить нашу задачу, мы должны реализовать интерфейс Runner и предоставить его в качестве компонента в нашем классе конфигурации.

Обычно реализуется Запуск командной строки или Запуск приложения :

@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();
     }
}

И с помощью этого, используя метод main , мы можем вызвать Пример выполнения командной строки :

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

Список задач

Все Выполнение задач имеют жизненный цикл. Задача Spring Cloud записывает эти события. В начале задачи, перед запуском любых реализаций Runner интерфейса, создается запись в репозитории Задач , в которой записывается событие запуска.

Когда задача выполнена или выполнена неудачно, генерируется другое событие. TaskExecutionListener позволяет регистрировать слушателей для прослушивания этого события на протяжении всего жизненного цикла.

Вы можете указать столько слушателей, сколько захотите, для одного и того же события.

Spring предоставляет два подхода для этого – с использованием интерфейса TaskExecutionListener или подхода к аннотации компонента метода.

Для первого вы предоставляете компонент, реализующий интерфейс TaskExecutionListener и его три метода:

void  onTaskStartup(TaskExecution  taskExecution);
void  onTaskEnd(TaskExecution  taskExecution);
void  onTaskFailed(TaskExecution  taskExecution, Throwable  throwable);
  • при запуске задачи() – Вызывается после того, как Выполнение задачи было сохранено в Хранилище задач .

  • onTaskEnd() – Вызывается после того , как Выполнение задачи было обновлено в Хранилище задач по завершении задачи.

  • onTaskFailed() – Вызывается, если во время выполнения задачи возникает неперехваченное исключение.

С другой стороны, используя метод аннотации компонента, вы создаете компонент и предоставляете его в качестве компонента в конфигурации 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 аналогичен при запуске задачи() .
  • @AfterTask аналогичен onTaskEnd() .
  • @FailedTask аналогичен onTaskFailed() .

Сообщения о выходе из задачи

Хотя вы можете указать любое количество прослушивателей для конкретного события, если обработчик событий TaskExecutionListener создает исключение, вся обработка прослушивателя для этого обработчика событий останавливается.

Например, если три |/при запуске задачи() прослушиватели запущены и первый при запуске задачи() обработчик событий выдает исключение, другие два | onTaskStartup методы не вызываются.

Однако вызываются другие обработчики событий ( onTaskEnd() и onTaskFailed() ) для прослушивателей Выполнения задач .

При возникновении исключений TaskExecutionListener возвращает код выхода и сообщение о выходе. Аннотирование метода с помощью @Aftertax позволит нам установить сообщение о выходе:

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

Сообщение о выходе может быть задано в любом из событий прослушивателя, хотя будут заданы только соответствующие сообщения. Если задача выполняется успешно, событие onTaskFailed() не сработает. Когда задача завершается, устанавливается сообщение от события onTaskEnd () .

Настройка Облачной Задачи

Многие свойства могут быть переопределены Заданной задачей путем указания пользовательских значений в applications.properties или приложениях.yaml файл.

Свойства задачи Spring cloud имеют префикс spring.cloud.задача в файле applications.properties .

Некоторые из свойств, которые можно переопределить, следующие:

  • Префикс spring.cloud.task.table – Это префикс таблицы для таблиц задач для Репозитория задач . Префикс таблицы по умолчанию – ” TASK_" .
  • spring.cloud.task.initialize-включено=false – Используется для включения или отключения создания таблиц задач при запуске задачи. По умолчанию установлено значение true.
  • идентификатор spring.cloud.task.execution=идентификатор вашей задачи – Используется для настройки задачи Spring Cloud для использования вашего пользовательского идентификатора задачи. По умолчанию spring генерирует идентификатор выполнения задачи для каждого выполнения задачи.

Чтобы просмотреть дополнительные настраиваемые свойства, проверьте задать свойства .

Регистрация Событий Облачных Задач

Обычно во время разработки полезно просматривать журналы отладки приложений. Чтобы изменить уровень ведения журнала для задачи Spring Cloud, добавьте это в свой файл applications.properties :

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

Вывод

В этой статье мы представили задачу Spring Cloud, что это такое и какие проблемы она решает. Мы также рассмотрели примеры того, как настроить его с источником данных и запустить задачу с помощью интерфейсов Runner .

Кроме того, мы объяснили архитектуру задач Spring Cloud и все модели предметной области, такие как Выполнение задач , Список задач и т.д., Используемые для достижения всех функциональных возможностей.