Как справиться с проблемой повторной попытки Feign
Как справиться с проблемой повторной попытки Feign

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

Механизм повторных попыток Feign в основном включает в себя следующие аспекты:

  1. Настройте количество повторов и интервал повторов.
  2. Настройте условия повтора и стратегии повтора.
  3. Внедрить резервный механизм повторной попытки

Ниже мы подробно представим эти три аспекта и приведем соответствующие примеры кода.

Настройте количество повторов и интервал повторов.

В Feign мы можем использовать следующие два свойства для настройки количества повторов и интервала повторов:

  • feign.client.config.<clientName>.retryer:Используется для настройки повторителя
  • feign.client.config.<clientName>.retryable:Используется для настройки условий повтора

Среди них clientName — это имя клиента Feign. Мы можем использовать аннотацию @FeignClient в клиентском интерфейсе Feign, чтобы указать имя клиента, как показано ниже:

Язык кода:javascript
копировать
@FeignClient(name = "user-service")
public interface UserClient {

    // ...
}

Далее нам нужно добавить следующие свойства в файл application.yml или application.properties. Например:

Язык кода:javascript
копировать
feign:
  client:
    config:
      user-service:
        retryer: Retryer.Default # Повторитель по умолчанию
        retryable: true # Включить условия повтора
      another-service:
        retryer: Retryer.NEVER_RETRY # Отключить повторные попытки
        retryable: false # Отключить условия повтора

В приведенном выше примере мы использовали программу повтора по умолчанию Retryer.Default и включили условия повтора. Это означает, что в случае сбоя запроса Feign автоматически повторит попытку до 5 раз, а интервал повтора по умолчанию составляет 100 миллисекунд. Если нам нужно настроить количество повторов и интервал повторов, мы можем сделать соответствующие настройки в файле конфигурации, например:

Язык кода:javascript
копировать
feign:
  client:
    config:
      user-service:
        retryer: Retryer.Default
        retryable: true
        maxAttempts: 10 # Повторите попытку до 10 раз.
        backoff:
          enabled: true # Включить алгоритм отсрочки
          delay: 1000 # Начальный интервал повтора составляет 1 секунду.
          maxDelay: 5000 # Максимальный интервал повтора — 5 секунд.
          multiplier: 2.0 # Интервал повтора увеличивается экспоненциально на 2

В приведенном выше примере мы использовали алгоритм отсрочки по умолчанию, то есть начальный интервал повтора составляет 1 секунду, максимальный интервал повтора составляет 5 секунд, а интервал повтора увеличивается экспоненциально на 2, максимум 10 повторений.

Настройте условия повтора и стратегии повтора.

Кроме Настройте количество повторов и интервал Помимо повторов, мы также можем Настроить условия повтора и стратегии повтора.. В Feign мы можем использовать аннотацию @Retryable, чтобы указать условия повтора и стратегии повтора.

Условия повторной попытки обычно включают следующее:

  • IOException: тип исключения, возникающего при сбое запроса, обычно включая сетевые исключения, исключения тайм-аута и т. д.
  • HttpStatus: повторите попытку, когда код ответа станет указанным значением.
  • Throwable: все типы исключений, возникающие при сбое запроса.

Мы можем использовать аннотацию @Retryable в методах клиентского интерфейса Feign, чтобы указать условия повтора и стратегии повтора. Например:

Язык кода:javascript
копировать
@FeignClient(name = "user-service")
public interface UserClient {

    @RequestMapping(method = RequestMethod.GET, value = "/users/{id}")
    @Retryable(value = {IOException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000, maxDelay = 5000, multiplier = 2))
    User getUser(@PathVariable("id") Long id);
}

В приведенном выше примере мы использовали аннотацию @Retryable, чтобы указать условия повтора и стратегию повтора. В частности, мы указали повторную попытку при возникновении исключения IOException при сбое запроса, до 3 повторов, интервал повтора по умолчанию составляет 1000 миллисекунд, максимальный интервал повтора составляет 5000 миллисекунд, а интервал повтора составляет 2 экспоненциальных роста.

Внедрить резервный механизм повторной попытки

При повторной попытке,Иногда все запросы терпят неудачу. Чтобы этого не произошло,Нам нужно повторить попытку, когда Внедрить резервный механизм повторной попытки,То есть после того, как запрос не выполнен,Постепенно снижайте интенсивность запросов,Избегайте чрезмерной нагрузки на сервис.

В притворстве,Для этого мы можем использовать аннотацию @Fallback. Конкретно,Нам нужно написать резервный класс, реализующий клиентский интерфейс Feign.,Используется для обработки ситуаций, когда запрос не удается. Например:

Язык кода:javascript
копировать
@FeignClient(name = "user-service", fallback = UserClientFallback.class)
public interface UserClient {

    @RequestMapping(method = RequestMethod.GET, value = "/users/{id}")
    @Retryable(value = {IOException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000, maxDelay = 5000, multiplier = 2))
    User getUser(@PathVariable("id") Long id);
}

@Component
class UserClientFallback implements UserClient {

    @Override
    public User getUser(Long id) {
        // Логика обработки после неудачной попытки
        return null;
    }
}

В приведенном выше примере мы использовали аннотацию @Fallback, чтобы указать резервный класс UserClientFallback. Если запрос не выполнен, Feign автоматически вызовет метод getUser класса UserClientFallback для обработки. В методе getUser мы можем написать соответствующую логику для обработки ситуации, когда запрос не выполнен, например, возврат значения по умолчанию, ведение журнала и т. д.

Следует отметить, что при использовании аннотации @Fallback мы должны написать запасной класс, реализующий клиентский интерфейс Feign, и реализовать в нем все методы. Это связано с тем, что в Feign каждый метод интерфейса соответствует HTTP-запросу. В случае сбоя запроса Feign необходимо знать, как повторить попытку и отступить. Поэтому мы должны предоставить конкретную реализацию, чтобы сообщить Feign, как выполнять обработку отката.

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

Язык кода:javascript
копировать
@FeignClient(name = "user-service", fallbackFactory = UserClientFallbackFactory.class)
public interface UserClient {

    @RequestMapping(method = RequestMethod.GET, value = "/users/{id}")
    @Retryable(value = {IOException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000, maxDelay = 5000, multiplier = 2))
    User getUser(@PathVariable("id") Long id);
}

@Component
class UserClientFallbackFactory implements FallbackFactory<UserClient> {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public UserClient create(Throwable throwable) {
        return new UserClient() {

            @Override
            public User getUser(Long id) {
                // Выберите другую логику обработки в зависимости от типа исключения.
                if (throwable instanceof IOException) {
                    // Обработка IOException
                } else {
                    // Обработка других исключений
                }

                // Получить клиентские экземпляры других сервисов
                OtherServiceClient otherServiceClient = applicationContext.getBean(OtherServiceClient.class);

                // Как позвонить в другие службы
                otherServiceClient.otherMethod();

                // Вернуться к значению по умолчанию
                return null;
            }
        };
    }
}

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose