Основное руководство по HTTP-клиентам и микросервисам Spring Boot

Основное руководство по HTTP-клиентам и микросервисам Spring Boot

4 марта 2023 г.

Привет! Меня зовут Вячеслав Аксенов, я backend-разработчик, специализирующийся на разработке сложных backend-систем на Java и Kotlin. Кроме того, у меня много небольших домашних проектов, которые вы можете найти на моем GitHub: https://github.com/v- Аксенов

Что такое микросервис?

Микрослужба – это небольшая независимая служба, предназначенная для выполнения определенной задачи или набора задач в более крупном приложении. Каждая микрослужба разрабатывается и развертывается независимо от других микрослужб в системе и взаимодействует с другими микрослужбами через API.

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

Однако микросервисы также создают некоторые проблемы, такие как необходимость надежного управления API, обнаружения сервисов и распределенной трассировки. Надлежащее проектирование и внедрение микросервисов требует тщательного планирования и координации всей команды разработчиков, а также глубокого понимания уникальных требований и ограничений разрабатываемой системы.

Когда для микросервисов требуются HTTP-клиенты?

Чтобы ответить на этот вопрос, нам нужно ответить на вопрос «За что отвечает эта текущая служба?»

Очень часто в бизнес-логике сервиса возникает ситуация, когда нам нужно получить ответ от стороннего API. Или, кроме того, у нас есть несколько микросервисов в цепочке для обработки нашего бизнес-процесса. В этих ситуациях мы должны реализовать HTTP-клиент в нашем микросервисе.

В архитектуре микрослужб HTTP-клиент — это программный компонент, который взаимодействует с другими микрослужбами по протоколу HTTP. HTTP-клиент отвечает за выполнение запросов к другим микрослужбам и получение ответов.

Когда микрослужбе необходимо связаться с другой микрослужбой, она обычно отправляет HTTP-запрос в соответствующую конечную точку другой микрослужбы. HTTP-запрос может включать полезные данные, например объект JSON или документ XML, которые принимающая микрослужба может использовать для выполнения своей задачи.

Как реализовать HTTP-клиент в микросервисе Spring Boot?

Существует несколько способов реализации HTTP-клиента в службе Spring Boot. В первую очередь нужно выбрать - это будет синхронный или асинхронный клиент?

Например, если у вас синхронная архитектура, вы можете выбрать одно из решений, предоставляемых Spring Boot.

В Spring Boot синхронный HTTP-клиент — это компонент, который используется для выполнения HTTP-запросов к другим службам или конечным точкам и блокирует текущий поток до тех пор, пока не будет получен ответ. Spring Boot предоставляет несколько вариантов реализации синхронных HTTP-клиентов, включая классы RestTemplate и WebClient.

RestTemplate — популярный выбор для реализации синхронных HTTP-клиентов в Spring Boot. Он предоставляет простой и интуитивно понятный API для выполнения HTTP-запросов и обработки ответов, а также поддерживает широкий спектр методов HTTP, типов запросов и ответов, а также преобразователей сообщений. Чтобы использовать RestTemplate, вам нужно настроить его как bean-компонент в контексте вашего приложения, а затем использовать его для выполнения HTTP-запросов, вызывая его различные методы.

Вот пример использования RestTemplate для POST HTTP-запроса:

public RegisterResponse registerUser(UserDto userDto) {
  HttpEntity<UserDto> requestEntity = new HttpEntity<>(user, headers);
  ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, RegisterResponse.class);

  if (responseEntity.getStatusCode() == HttpStatus.OK) {
    RegisterResponse response = responseEntity.getBody();
    // handle the response
  } else {
    // handle the error
  }
}

Другой вариант реализации синхронных HTTP-клиентов в Spring Boot — использование класса WebClient. WebClient — это реактивный HTTP-клиент, предоставляющий неблокирующий API для создания HTTP-запросов и обработки ответов и хорошо подходящий для приложений, требующих высокого уровня параллелизма или масштабируемости. Чтобы использовать WebClient, вам нужно настроить его как bean-компонент в контексте вашего приложения, а затем использовать его для отправки HTTP-запросов, вызывая его различные методы.

public RegisterResponse registerUser(UserDto userDto) {
  Mono<String> responseMono = webClient.post()
    .uri(endpointPath)
    .contentType(MediaType.APPLICATION_JSON)
    .body(Mono.just(user), UserDto.class)
    .retrieve()
    .bodyToMono(RegisterResponse.class);

  responseMono.subscribe(response -> {
      // handle the response
  }, error -> {
    // handle the error
  });
}

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

Есть несколько недостатков при использовании RestTemplate и WebClient:

  • вам нужно написать много шаблонной логики для обработки положительных и отрицательных сценариев
  • вам нужно настроить каждый клиент вручную
  • методы для обычного HTTP-запроса GET/POST имеют сложную семантику, и вам нужно ее запомнить

Как сделать это проще?

Короткий ответ: вы можете использовать библиотеку Feign. Что это?

Feign — это библиотека Java, которая позволяет разработчикам легко создавать HTTP-клиенты, специально предназначенные для создания микросервисов RESTful. Он предоставляет декларативный способ определения API-интерфейсов HTTP, которые можно вызывать из кода, как если бы они были вызовами локальных методов, что упрощает работу с API и использование ресурсов в разных микросервисах.

С помощью Feign вы можете легко создавать интерфейсы, определяющие методы HTTP, параметры запросов и типы ответов для конечных точек RESTful. Затем Feign позаботится обо всем остальном, включая сериализацию и десериализацию запросов и ответов, кодирование URL-адресов, обработку ошибок и управление соединениями.

Вот пример запроса POST для регистрации пользователя с помощью Feign:

// Client describes as interface with configuration:

@FeignClient(name = "exampleRegisterClient")
public interface RegisterClient {

    @PostMapping("/register")
    RegisterResponse registerUser(@RequestBody UserDto user);
}

// Bean creation in Spring configuration:
@Bean
public RegisterClient registerUserApi() {
    return Feign.builder().target(RegisterClient.class, "https://localhost:9090/api);
}

Feign предоставляет простой и декларативный способ взаимодействия с HTTP API, позволяя разработчикам сосредоточиться на бизнес-логике своих микросервисов, а не на деталях выполнения HTTP-запросов.

Вывод.

В заключение, Spring Boot предоставляет несколько вариантов реализации HTTP-клиентов в микрослужбах, включая RestTemplate, WebClient и Feign. RestTemplate — это простой и широко используемый клиент, обеспечивающий синхронную HTTP-связь. WebClient — это более современная и реактивная альтернатива, которая обеспечивает неблокирующую HTTP-связь с функциональным API. Feign – это декларативный и типобезопасный клиент, который генерирует код на основе определений API и предоставляет простой в использовании интерфейс для микрослужб RESTful.

При выборе HTTP-клиента важно учитывать требования микрослужбы, такие как производительность, масштабируемость и простота использования. RestTemplate — хороший выбор для простых случаев использования, требующих синхронной связи. WebClient — хороший выбор для реактивных и неблокирующих вариантов использования, требующих высокой производительности и масштабируемости. Feign — хороший выбор для декларативных и типобезопасных сценариев использования, требующих упрощенного API и улучшенного взаимодействия с разработчиком.

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

Вы можете найти мои примеры реализации различных способов написания HTTP-клиентов на моем GitHub: https://github.com/v-aksenov

Фото ThisisEngineering RAEng на Unsplash


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE