Рубрики
Без рубрики

Введение в Spring Cloud Openfeint

Притворство упрощает написание клиентов веб-служб с помощью подключаемой поддержки аннотаций, которая включает в себя аннотации притворства и аннотации JAX-RS.

Автор оригинала: baeldung.

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")
    List getPosts();

    @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 List getPosts() {
        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.