обзор событий
причина
Дело в том, что в последнее время в коде Feign нужно использовать для вызова сторонних сервисов. Итак, стандартный набор операций:
-
- Внедрите пакеты Jar сторонних сервисов.
-
-
@EnableFeignClients
Компонент инъекции аннотаций.
-
-
-
@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)
Это временное решение с предупреждением о том, что проект может быть запущен и Идея.
но. . . но. . . но. . .
Я получил странную ошибку при отладке кода, импортируемый 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. |