Spring Boot Circuit Breaker — Пишем свой Hystrix

Привет! Как думаете, в названии статьи я поместил достаточно Buzzwords, для того, чтобы вы кликнули? Ох, о чём это я. Вы ведь уже открыли этот блог пост, значит я сделал всё верно!

Итак, 2017 год, в трендах Спринг Бут, Спринг, а ещё — Spring Cloud — http://projects.spring.io/spring-cloud/. Если кто не в курсе, Облачный Спринг — это набор разных проектов, которые обязаны помочь вам развернуть свои микросервисы в Клауде. Это и Сервис Дескавери, это и Трейсинг (Зипкин), это и Spring Cloud Config, решающий задачу конфигурирования всех сервисов.

Но сегодня речь пойдёт не про эти приложения. Тут бы хотелось отдельно сказать про один из проектов Netflix, который реализует Circuit Breaker паттерн проектирования системы — Spring Cloud Netflix Hystrix.

Circuit Breaker пришёл в мир программирования из электроники и электротехники. Шаблон проектирования систем — Автоматический выключатель (именно так переводит этот термин Википедия) — выступает своего рода предохранителем. Когда вся система функционирует корректно, этот элемент системы успешно проводит ток. Как только происходит короткое замыкание, Circuit Breaker размыкает электрическую цепь, не допуская распространение проблемы по всей системе.

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

По моим ощущеняим, все заговорили про Circuit Breaker во время расвета RxJava. Именно у этой технологии был один из sale point — поддержка Backpressure. Именно тут большинство разработчиков познакомились с такой идеей проектирования систем, как предотвращение распространения ошибок из одной части системы во все остальные части.

Приведу простой прктический пример, когда Circuit Breaker отлично подойдёт для использования. Собственно, этот пример описан в официальном Get Started. У вас есть система — книжный магазин. Главная страница сайта требует вывода книжных категорий, а также персональных рекомендаций для клиента на основе его статичесеской модели. Конечно же, рекомендательный сервис пилится отдельной командой разработчиков на отдельном языке программирования в отдельном офисе. В общем, это типичный микро-сервис. В том случае, если этот сервис вышел из строя, возможна 2 сценария: показать клиенту 500 ошибку, либо показать страницу с рекомендациями, полученными из других мест, либо вообще без рекоменадций.

В случае использования Hystrix от Нетфликса, вы можете описать fallback-метод, который автоматически исполнится в случае достижения некоторых условий (например, внешний сервис вернул 404/500, или вообще мы схватили тайм-аут ошибку). Всё это происходит крайне прозрачно для вас, вашей кодовой базы и ваших коллег. Слава богам, в Спринге есть отличная AOP реализация.

Вот, кусок кода, показывающий вызов внешнего сервиса и фолбэк. Код нагло взят тут — http://www.baeldung.com/spring-cloud-netflix-hystrix.

@Service
public class GreetingService {
    @HystrixCommand(fallbackMethod = "defaultGreeting")
    public String getGreeting(String username) {
        return new RestTemplate()
          .getForObject("http://localhost:9090/greeting/{username}", 
          String.class, username);
    }
 
    private String defaultGreeting(String username) {
        return "Hello User!";
    }
}

Как вы можете видеть, использовать Hystrix благодаря Спринг Буту — крайне просто. Поэтому, каждый из нас точно должен присмотреться к такому шаблону проектирования, а также стараться использовать его там, где это разумно.

Категории: Программирование