Spring + Cloud Open Feign

Cover Image for 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

Возникли вопросы по статье, не работает код, хотелось бы больше информации - свяжитесь с нами и мы поможем