Spring + Cloud Open Feign
- Введение в Feign
- Начало работы с Spring Boot Feign
- Feign клиент
- Определение клиентского интерфейса Feign
- Конфигурирование Feign
Содержание
Feign client
Feign — это HTTP-клиент на основе Java, упрощающий вызов RESTful API. Spring Boot — это популярная среда Java для создания веб-приложений, которая включает поддержку Feign из коробки.
Предисловие
Прежде чем приступить к работе с Spring Boot Feign, вы должны иметь общее представление о следующих концепциях:
- Язык программирования Java
- Spring фреймворк
- RESTful веб-сервисы
- Инструмент сборки Maven
1. Введение в Feign
Feign — это декларативный HTTP-клиент для создания веб-сервисов RESTful. Он упрощает процесс вызова служб RESTful за счет создания динамической реализации интерфейса с использованием аннотаций. Feign построен на основе ленты Netflix и Spring Cloud и обеспечивает функции балансировки нагрузки и отказоустойчивости.
2. Начало работы с Spring Boot Feign
Чтобы начать работу с Spring Boot Feign, вам нужно добавить следующие зависимости в ваш pom.xml
файл Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Также нам понадобятся следующие зависимости:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
3. Определение клиентского интерфейса Feign
Первым шагом в использовании Feign является определение интерфейса, представляющего службу RESTful. Интерфейс должен использовать аннотации Spring для определения конечных точек, заголовков и параметров службы RESTful. Для примера, обратимся к внешнему сервису погоды, и узнаем текущую температуру. Для начала сделаем запрос, к примеру при помощи средств браузера, и узнаем формат ответа open-meteo.com
{
"latitude": 51.5,
"longitude": -0.120000124,
"generationtime_ms": 0.5279779434204102,
"utc_offset_seconds": 0,
"timezone": "GMT",
"timezone_abbreviation": "GMT",
"elevation": 29.0,
"current_weather": {
"temperature": 9.1,
"windspeed": 11.6,
"winddirection": 300.0,
"weathercode": 1,
"time": "2023-02-19T10:00"
}
}
Исходя из этого ответа от сервиса, сформируем свой вариант ответа, который будет отображаться конечному пользователю
public record CurrentWeather(double temperature, @JsonProperty("windspeed") double windSpeed,
@JsonProperty("winddirection") double windDirection,
@JsonProperty("weathercode") int weatherCode,
String time) {
}
public record WeatherInfoResponse(double latitude, double longitude,
double elevation, CurrentWeather current_weather) {
}
Следующим этапом реализуем Feign клиент, при помощи которого будем ходить на внешний сервис и получать от него ответ
@FeignClient(name = "${feign.client.weather.name}", url = "${feign.client.weather.url}")
public interface WeatherClient {
@GetMapping(path = "/forecast")
WeatherInfoResponse getWeather(@RequestParam("latitude") double latitude,
@RequestParam("longitude") double longitude,
@RequestParam("current_weather") boolean currentWeather);
}
Теперь мы можем реализовать сервисный слой по работе с клиентским слоем WeatherClient
@Service
@RequiredArgsConstructor
public class WeatherService {
private final WeatherClient weatherClient;
public WeatherInfoResponse getWeatherInfo(final double lat, final double lon) {
return weatherClient.getWeather(lat, lon, true);
}
}
Настало время заняться нашим собственным сервисом, который будет по координатам отдавать текущую погоду пользователю.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class WeatherController {
private final WeatherService weatherService;
@GetMapping("/weather")
public WeatherInfoResponse getWeather(@RequestParam final double lat, @RequestParam final double lon) {
return weatherService.getWeatherInfo(lat, lon);
}
}
4. Конфигурирование Feign
Минимальная конфигурация выглядит так
@SpringBootApplication
@EnableFeignClients
public class OpenfeignApplication {
public static void main(String[] args) {
SpringApplication.run(OpenfeignApplication.class, args);
}
}
И примерная конфигурация в application.yml
feign:
client:
weather:
name: weather
url: https://api.open-meteo.com/v1
Как проверить работу нашего сервиса -
http://localhost:8080/api/weather?lat=51.50888695067576&lon=-0.1282857227967236