Основное руководство по 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
Оригинал