Помните яму Фейна

Java Spring Cloud

обзор событий

причина

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

    1. Внедрите пакеты Jar сторонних сервисов.
    1. @EnableFeignClientsКомпонент инъекции аннотаций.
    1. @AutowiredФасоль импортная.

Тогда я не заметил, что у Idea было предупреждение, и запустил службу напрямую. Затем возникает следующая ошибка:

Description:

Field api in com.xxx.service.impl.ServiceImpl required a bean of type 'com.xxx.api.Api' that could not be found.

The injection point has the following annotations:
	- @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean of type 'com.xxx.api.Api' in your configuration.

PS: тревога идеиCould not autowire. No beans of 'Api' type found.

проходить через

Затем настройте параметры Autowired напрямую в сочетании с предупреждениями и журналами Idea.@Autowired(required = false)Это временное решение с предупреждением о том, что проект может быть запущен и Идея.

но. . . но. . . но. . .

image.png

Я получил странную ошибку при отладке кода, импортируемый bean-компонент был на самом деле пустым, что меня очень смутило, и я не очень хорошо знал Spring, что заставило меня чувствовать себя неловко.

Baidu, отладка точек останова Google, один из них имеет смысл

  • EnableFeignClients путь сканирования сComponentScanКонфликт сканирования

После проверки конфигурации обнаруживается, что проблемы нет.

Я не нашел подсказки, пока не посмотрел на импорт двух Feigns в коде.

  • import org.springframework.cloud.openfeign.EnableFeignClients;
  • import org.springframework.cloud.netflix.feign.FeignClient;

Наконец-то причина проблемы была найдена в проектеFeignClientиEnableFeignClientsВнедрение бина завершается неудачно из-за несовместимости версий.@Autowired(required = false)Инъекция бина игнорируется. в конечном итоге привести кNullPointerException.

результат

Я думал, что проблема может быть решена, но в условиях сторонних Jar-пакетов явно невозможно модифицировать код напрямую.

А если заменить на свой?

Это тоже не работает, потому что служба четвертой стороны и служба пятой стороны являются аннотациями openfeign.

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

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@FeignClient( name = "service",
        path = "/api/v1")
public interface ApiFeignClient {
    @RequestMapping(
            method = {RequestMethod.POST},
            value = {"/query"},
            consumes = {"application/json"}
    )
    ResponseBody query(@RequestBody RequestDto reqDto);

    @RequestMapping(
            method = {RequestMethod.GET},
            value = {"/list"},
            consumes = {"application/json"}
    )
    ResponseBody list(@RequestParam("name") String name);
}

Затем используйте наш собственный bean-компонент в коде, например:

@Autowired
private ApiFeignClient api;

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

Резюме притворства

После этого я также проверил много информации и прочитал много блогов. Вот краткое изложение точек знаний о Feign.

Что такое Файн?

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

В двух словах Feign работает, обрабатывая аннотации в шаблонных запросах. Параметры применяются непосредственно к этим шаблонам перед выводом.

Разница между Netflixfeign и Openfeign

Spring Cloud Feign реализован на основе feign Netflix и объединяет Spring Cloud Ribbon и Spring Cloud Hystrix.Помимо предоставления мощных функций двух, он также предоставляет декларативный способ определения клиента веб-службы.

Конкретный может относиться кstackoverflowобсуждение.

Аннотированные параметры

основное описаниеEnableFeignClientsиFeignClient.

  • EnableFeignClientsПараметры аннотации
название объяснять
value Псевдоним для свойства basePackages, позволяющий использовать более краткие обозначения.
basePackages Настройте автоматическое сканирование путей к базовым пакетам с аннотацией @FeignClient.
basePackageClasses Безопасная альтернатива свойству basePackages. Сканируйте классы, украшенные @FeignClient.
defaultConfiguration Это свойство используется для настройки конфигурации всех клиентов Feign и настраивается с помощью @Configuration.
clients Задает список классов, украшенных аннотацией @FeignClient. Обратите внимание, что client не является пустым массивом, FeignClient не будет загружаться через функцию автоматического сканирования пути к классам.
  • FeignClientПараметры аннотации
название объяснять
имя, значение, идентификатор службы Эти три функции в основном одинаковы. name указывает имя FeignClient. Если проект использует ленту, атрибут name будет использоваться как имя микрослужбы для обнаружения служб. идентификатор службы устарел.
qualifier Указанный псевдоним не используется. Соответствует аннотации @Qualifier
url Указывает адрес, вызываемый FeignClient, который обычно используется для отладки программ.
decode404 Если в вызове есть ошибка http404 и бит поля истинен, декодер будет вызван для декодирования, иначе будет выброшено исключение
configuration Feign, вы можете настроить Feign Encoder, Decoder, LogLevel и Contract.
fallback Определить отказоустойчивый класс обработки. При вызове исключения удаленного интерфейса будет вызываться логика исключения соответствующего интерфейса. Обратите внимание, что класс, указанный в fallback, должен реализовывать интерфейс, помеченный @FeignClient
fallbackFactory Используется для создания примеров резервных классов, реализации общей отказоустойчивой логики для каждого интерфейса и сокращения повторяющегося кода.
path Определяет юниформ-префикс текущего FeignClient.
primary Следует ли помечать псевдопрокси как основной компонент, значение по умолчанию — true.

использованная литература