Как решить проблему тайм-аута Feign
Как решить проблему тайм-аута Feign

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

Настройте период ожидания Feign

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

Язык кода:javascript
копировать
feign.client.config.default.connectTimeout=5000
feign.client.config.default.readTimeout=5000

В приведенной выше конфигурации мы установили таймаут соединения и таймаут чтения на 5 секунд. Вы также можете использовать аннотацию @FeignClient в классе конфигурации Java приложения, чтобы настроить тайм-аут клиента Feign:

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

    @GetMapping("/users/{id}")
    User getUser(@PathVariable int id);

    @PostMapping("/users")
    User createUser(@RequestBody User user);

    @PutMapping("/users/{id}")
    User updateUser(@PathVariable int id, @RequestBody User user);

    @DeleteMapping("/users/{id}")
    void deleteUser(@PathVariable int id);
}

В приведенном выше примере мы используем атрибут конфигурации в аннотации @FeignClient, чтобы указать класс UserClientConfiguration, который содержит конфигурацию тайм-аута клиента Feign:

Язык кода:javascript
копировать
@Configuration
public class UserClientConfiguration {

    @Bean
    public Request.Options requestOptions() {
        return new Request.Options(5000, 5000);
    }
}

В приведенном выше примере мы используем аннотацию @Configuration для обозначения класса UserClientConfiguration, указывая, что это класс конфигурации Spring. Затем мы используем аннотацию @Bean, чтобы отметить метод requestOptions, который возвращает объект Request.Options, содержащий тайм-аут соединения и тайм-аут чтения, оба из которых установлены на 5 секунд.

Обработка исключений тайм-аута

Когда время запроса истечет, Feign выдаст FeignException. Мы можем использовать блок try-catch, чтобы перехватить это исключение и предпринять соответствующие действия. Например, мы можем использовать механизм повтора для повторного выполнения запроса или возврата значения по умолчанию или сообщения об ошибке.

Вот пример:

Язык кода:javascript
копировать
@RestController
public class UserController {

    private final UserClient userClient;

    public UserController(UserClient userClient) {
        this.userClient = userClient;
    }

    @GetMapping("/users/{id}")
    public User getUser(@PathVariable int id) {
        try {
            return userClient.getUser(id);
        } catch (FeignException e) {
            throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to get user", e);
        }
    }
}

В приведенном выше примере мы используем блок try-catch в методе getUser, чтобы перехватить исключение FeignException. Если время запроса истечет, будет выдано это исключение. В блоке catch мы используем класс ResponseStatusException для выдачи ошибки HTTP 500, указывающей на невозможность получения информации о пользователе. В то же время мы передаем исходное исключение FeignException в качестве параметра классу ResponseStatusException, чтобы его можно было записать в журнал.

Обработка отката тайм-аута Feign

Помимо использования механизма повтора и возврата значения по умолчанию или сообщения об ошибке в Обработку исключений тайм-аутаснаружи,Feign также предоставляет механизм для решения проблем с тайм-аутом.,То есть откат таймаута. Откат по тайм-ауту относится к моменту истечения времени ожидания запроса.,Feign будет использовать указанный резервный метод или резервный класс для обработки запроса. Это гарантирует, что даже если время запроса истечет,Приложение все еще может продолжать работать,без сбоев.

Вот пример использования механизма возврата по тайм-ауту:

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

    @GetMapping("/users/{id}")
    User getUser(@PathVariable int id);

    @PostMapping("/users")
    User createUser(@RequestBody User user);

    @PutMapping("/users/{id}")
    User updateUser(@PathVariable int id, @RequestBody User user);

    @DeleteMapping("/users/{id}")
    void deleteUser(@PathVariable int id);
}

@Component
public class UserClientFallback implements UserClient {

    @Override
    public User getUser(int id) {
        return new User(id, "Fallback User");
    }

    @Override
    public User createUser(User user) {
        return new User(-1, "Fallback User");
    }

    @Override
    public User updateUser(int id, User user) {
        return new User(id, "Fallback User");
    }

    @Override
    public void deleteUser(int id) {
        // Do nothing
    }
}

В приведенном выше примере мы определили класс UserClientFallback, который реализует интерфейс UserClient и обеспечивает механизм возврата по истечении времени ожидания. В аннотации @FeignClient мы используем запасной атрибут, чтобы указать класс UserClientFallback в качестве резервного класса по тайм-ауту.

По истечении времени ожидания запроса Feign автоматически использует соответствующий метод класса UserClientFallback для обработки запроса. В методе getUser мы возвращаем объект Fallback User, указывающий на невозможность получить информацию о пользователе, но при этом возвращаем объект, чтобы приложение могло продолжить работу. В других методах мы возвращаем аналогичный объект Fallback User или ничего не делаем, в зависимости от реальной ситуации.

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

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