1. Обзор
В этом уроке мы опишем Spring Cloud OpenFeign – декларативный клиент REST для приложений Spring Boot.
Притворство упрощает написание клиентов веб-служб с помощью подключаемой поддержки аннотаций, которая включает в себя аннотации притворства и аннотации JAX-RS.
Кроме того, Spring Cloud добавляет поддержку аннотаций Spring MVC и использования тех же HttpMessageConverters, что и в Spring Web.
Самое замечательное в использовании притворства заключается в том, что нам не нужно писать никакого кода для вызова службы, кроме определения интерфейса.
2. Зависимости
Во-первых, мы начнем с создания веб-проекта Spring Boot и добавления зависимости spring-cloud-starter-openfeign в наш pom.xml файл:
org.springframework.cloud spring-cloud-starter-openfeign
Кроме того, нам нужно будет добавить spring-cloud-зависимости :
org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import
Мы можем найти последние версии spring-cloud-starter-openfeint и spring-cloud-dependencies на Maven Central.
3. Симулируйте Клиента
Далее нам нужно добавить @EnableFeignClients в наш основной класс:
@SpringBootApplication @EnableFeignClients public class ExampleApplication { public static void main(String[] args) { SpringApplication.run(ExampleApplication.class, args); } }
С помощью этой аннотации мы включаем сканирование компонентов для интерфейсов, которые объявляют, что они являются поддельными клиентами.
Затем мы объявляем притворного клиента, используя аннотацию @FeignClient :
@FeignClient(value = "jplaceholder", url = "https://jsonplaceholder.typicode.com/") public interface JSONPlaceHolderClient { @RequestMapping(method = RequestMethod.GET, value = "/posts") ListgetPosts(); @RequestMapping(method = RequestMethod.GET, value = "/posts/{postId}", produces = "application/json") Post getPostById(@PathVariable("postId") Long postId); }
В этом примере мы настроили клиент для чтения из API JSONPlaceHolder .
Аргумент value , переданный в аннотации @FeignClient , является обязательным произвольным именем клиента, в то время как в аргументе url мы указываем базовый URL API.
Кроме того, поскольку этот интерфейс является фиктивным, мы можем использовать веб-аннотации Spring для объявления API, к которым мы хотим обратиться.
4. Конфигурация
Теперь очень важно понять, что каждый Feignclient состоит из набора настраиваемых компонентов.
Spring Cloud создает новый набор по умолчанию по требованию для каждого именованного клиента, используя класс Конфигурация Притворных клиентов, который мы можем настроить, как описано в следующем разделе.
Приведенный выше класс содержит эти бобы:
- Декодер – ResponseEntityDecoder , который обертывает SpringDecoder, используется для декодирования Ответа
- Encoder – SpringEncoder , используемый для кодирования RequestBody
- Logger – Slf4jLogger является регистратором по умолчанию, используемым компанией Feign
- Контракт – SpringMvcContract , который обеспечивает обработку аннотаций
- Фейн-строитель – HystrixFeign.Конструктор используется для построения компонентов
- Клиент – LoadBalancerFeignClient или Притворный клиент по умолчанию
4.1. Настройка пользовательских Бобов
Если мы хотим настроить один или несколько из этих компонентов, мы можем переопределить их с помощью класса @Configuration , который затем добавим в аннотацию FeignClient :
@FeignClient(value = "jplaceholder", url = "https://jsonplaceholder.typicode.com/", configuration = MyClientConfiguration.class)
@Configuration public class MyClientConfiguration { @Bean public OkHttpClient client() { return new OkHttpClient(); } }
В этом примере мы говорим симулировать использование OkHttpClient вместо стандартного для поддержки HTTP/2.
Feign поддерживает несколько клиентов для разных вариантов использования, включая ApacheHttpClient , который отправляет больше заголовков с запросом – например, Content-Length, который ожидают некоторые серверы.
Чтобы использовать эти клиенты, давайте не забудем добавить необходимые зависимости в ваш pom.xml файл, например:
io.github.openfeign feign-okhttp io.github.openfeign feign-httpclient
Мы можем найти последние версии feign-okhttp и feign-httpclient на Maven Central.
4.2. Настройка С Помощью Свойств
Вместо того, чтобы использовать @Configuration class, мы можем использовать свойства приложения для настройки притворных клиентов , как показано в этом приложении.yaml пример:
feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 loggerLevel: basic
В этой конфигурации мы устанавливаем тайм-ауты на 5 секунд, а уровень регистратора-на basic для каждого объявленного клиента в приложении.
Наконец, мы можем создать конфигурацию с default в качестве имени клиента, чтобы настроить все объекты @FeignClient , или мы можем объявить имя клиента для конфигурации:
feign: client: config: jplaceholder:
Если у нас есть как @Configuration bean, так и свойства конфигурации, свойства конфигурации переопределят значения @Configuration .
5. Перехватчики
Добавление перехватчиков-еще одна полезная функция, предоставляемая Feign.
Перехватчики могут выполнять различные неявные задачи, от аутентификации до ведения журнала, для каждого HTTP-запроса/ответа.
В этом разделе мы реализуем наш собственный перехватчик, а также используем тот, который предоставляется Spring Cloud OpenFeign из коробки. Оба будут добавлять базовый заголовок аутентификации к каждому запросу .
5.1. Реализация RequestInterceptor
Итак, в приведенном ниже фрагменте кода давайте реализуем наш пользовательский перехватчик запросов:
@Bean public RequestInterceptor requestInterceptor() { return requestTemplate -> { requestTemplate.header("user", username); requestTemplate.header("password", password); requestTemplate.header("Accept", ContentType.APPLICATION_JSON.getMimeType()); }; }
Кроме того, чтобы добавить перехватчик в цепочку запросов, нам просто нужно добавить этот компонент в наш класс @Configuration или, как мы видели ранее, объявить его в файле свойств:
feign: client: config: default: requestInterceptors: com.baeldung.cloud.openfeign.JSONPlaceHolderInterceptor
5.2. Использование Базового Перехватчика Запросов Аутентификации
В качестве альтернативы мы можем использовать перехватчик запросов BasicAuth класс, который предоставляет Spring Cloud OpenFeign:
@Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("username", "password"); }
Все очень просто! Теперь все запросы будут содержать базовый заголовок аутентификации.
6. Поддержка Hystrix
Притворство поддерживает Hystrix , поэтому, если мы включили его, мы можем реализовать резервный шаблон.
С помощью шаблона резервного копирования при сбое удаленного вызова службы вместо создания исключения потребитель службы выполнит альтернативный путь кода, чтобы попытаться выполнить действие с помощью другого средства.
Для достижения этой цели нам нужно включить Hystrix, добавив feign.hystrix.enabled=true в файл свойств.
Это позволяет нам реализовать резервные методы, которые вызываются при сбое службы:
@Component public class JSONPlaceHolderFallback implements JSONPlaceHolderClient { @Override public ListgetPosts() { return Collections.emptyList(); } @Override public Post getPostById(Long postId) { return null; } }
Чтобы сообщить Фейну, что были предоставлены резервные методы, нам также необходимо установить наш резервный класс в аннотации @FeignClient :
@FeignClient(value = "jplaceholder", url = "https://jsonplaceholder.typicode.com/", fallback = JSONPlaceHolderFallback.class) public interface JSONPlaceHolderClient { // APIs }
7. Ведение журнала
Для каждого притворного клиента по умолчанию создается регистратор.
Чтобы включить ведение журнала, мы должны объявить его в файле application.properties , используя имя пакета клиентских интерфейсов:
logging.level.com.baeldung.cloud.openfeign.client: DEBUG
Или, если мы хотим включить ведение журнала только для одного конкретного клиента в пакете, мы можем использовать полное имя класса:
logging.level.com.baeldung.cloud.openfeign.client.JSONPlaceHolderClient: DEBUG
Обратите внимание, что Притворное ведение журнала отвечает только на ОТЛАЖИВАТЬ уровень.
Регистратор .Уровень , который мы можем настроить для каждого клиента, указывает, сколько нужно регистрировать:
@Configuration public class ClientConfiguration { @Bean Logger.Level feignLoggerLevel() { return Logger.Level.BASIC; } }
Есть четыре уровня ведения журнала на выбор:
- НЕТ – нет ведения журнала, что является значением по умолчанию
- BASIC – регистрируйте только метод запроса, URL-адрес и статус ответа
- ЗАГОЛОВКИ – регистрируйте основную информацию вместе с заголовками запросов и ответов
- ПОЛНЫЙ – регистрируйте тело, заголовки и метаданные как для запроса, так и для ответа
8. Обработка ошибок
defaulterrorhandler Фейна, Декодер ошибок.default , всегда выдает Исключение Фейна .
Теперь это поведение не всегда самое полезное. Итак, чтобы настроить выданное исключение, мы можем использовать Пользовательский декодер ошибок :
public class CustomErrorDecoder implements ErrorDecoder { @Override public Exception decode(String methodKey, Response response) { switch (response.status()){ case 400: return new BadRequestException(); case 404: return new NotFoundException(); default: return new Exception("Generic error"); } } }
Затем, как мы делали ранее, мы должны заменить декодер ошибок по умолчанию |, добавив компонент в класс @Configuration :
@Configuration public class ClientConfiguration { @Bean public ErrorDecoder errorDecoder() { return new CustomErrorDecoder(); } }
9. Заключение
В этой статье мы обсудили Spring Cloud Openfeint и его реализацию в простом примере приложения.
Кроме того, мы видели, как настроить клиент, как добавить перехватчики в наши запросы и как обрабатывать ошибки с помощью Hystrix и ErrorDecoder.
Как обычно, все примеры кода, показанные в этом руководстве, доступны на GitHub.