Обработка сбоев и запросов трассировки
🙌 Репозиторий Github для приложения: https://github.com/OmarElGabry/microservices-spring-boot
Гистрикс
Если у вас есть, скажем, 3 услуги: A вызывает → B, а B вызывает → C. Что, если в B произошел сбой? Ошибка перейдет в службу C, не так ли?
A -> B (failure) -> C
Другой пример, допустим, служба A вызывает удаленную службу R, и по какой-то причине удаленная служба не работает. Как мы можем справиться с такой ситуацией?
Что мы хотели бы сделать, так это остановить каскад отказов и предоставить способ самовосстановления, что повысит общую отказоустойчивость системы.
Hystrix - это реализация паттерна прерывателя цепи, который позволяет контролировать задержки и отказы между распределенными службами.
Основная идея состоит в том, чтобы остановить каскадные отказы за счет быстрого отказа и восстановить как можно скорее - Важные аспекты отказоустойчивых систем, которые самовосстанавливаются.
Итак, мы добавим Hystrix в сервис галереи и смоделируем сбой в сервисе изображений. В файле pom.xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
Весной загружаю основной класс
// ... @EnableCircuitBreaker // Enable circuit breakers public class SpringEurekaGalleryApp { public static void main(String[] args) { SpringApplication.run(SpringEurekaGalleryApp.class, args); } }
Spring ищет любой метод, помеченный аннотацией @HystrixCommand
, и обертывает этот метод, чтобы Hystrix мог его отслеживать.
Hystrix отслеживает сбои в этом методе, и если сбои достигают порогового значения (предела), Hystrix открывает цепь, чтобы последующие вызовы автоматически завершались ошибкой. Следовательно, пока цепь разомкнута, Hystrix перенаправляет вызовы резервному методу.
Итак, в классе контроллера обновите getGallery()
, добавьте аннотацию и резервный метод.
В классе контроллера службы изображений выбросить исключение в getImages()
throw new Exception("Images can't be fetched");
Теперь перейдите в браузер и нажмите localhost:8762/gallery/1
. У вас должен получиться пустой объект галереи (без изображений).
{ "id": 1, "images": null }
Сыщик
Если у вас есть, скажем, 3 службы: A, B и C. Мы сделали три разных запроса.
Один запрос пошел от A → B, другой от A → B → C, а последний - от B → C.
A -> B A -> B -> C B -> C
По мере роста количества микросервисов отслеживание запросов, которые передаются от одного микросервиса к другому, и выяснение того, как запросы проходят через приложение, может быть довольно сложной задачей.
Sleuth позволяет отслеживать запросы, добавляя уникальные идентификаторы в журналы.
trace id (1st) используется для отслеживания через микросервисы; представляет собой весь путь запроса через все микросервисы, в то время как span id (2nd) используется для отслеживания в рамках отдельного микросервиса.
Чтобы использовать Sleuth, добавьте зависимость к pom.xml
…
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
И в контроллере службы галереи (или изображения) используйте регистратор для регистрации некоторой информации.
import org.slf4j.Logger; import org.slf4j.LoggerFactory; // ... private static final Logger LOGGER = LoggerFactory.getLogger(HomeController.class); public Gallery getGallery(@PathVariable final int id) { LOGGER.info("Creating gallery object ... "); // ... LOGGER.info("Returning images ... "); return images; } // ...
Теперь, когда вы делаете запрос к службе галереи, вы должны увидеть идентификаторы трассировки и диапазона в журналах консоли.
INFO [gallery-service,adcd5217a36fe469,8639d164315daca9,false] ...
Спасибо за чтение! Если вам понравилось, пожалуйста, похлопайте 👏 в ладоши.