Статьи

Облегчение REST-общения с притворными клиентами

В этом примере мы покажем вам, как разработать простое приложение Spring Boot с клиентом Feign для использования службы Weather REST.

Spring Boot — это основанная на Java инфраструктура, которая упрощает создание веб-приложений и приложений для предприятий. Spring Boot имеет встроенный Tomcat, предоставляет «начальные» зависимости и не требует настройки XML.

Feign — это декларативная структура, разработанная Netflix для реализации клиентов REST API . Feign позволяет создавать клиенты REST, объявляющие и аннотирующие интерфейс, фактическая реализация предоставляется во время выполнения.

1. Проектная среда

Этот пример будет реализован с использованием следующих инструментов:

  1. JDK 1.8.81
  2. IntelliJ 2018.2.2
  3. Spring Boot 2.0.4
  4. Gradle 4.10
  5. Весеннее Облако Финчли.SR1

С этой информацией, начнем!

2. Создайте приложение Spring Boot

Нажмите Файл -> Создать -> Проект

Feign Client - создание приложения Spring Boot

Создание приложения Spring Boot — Шаг 1

Выберите Spring Initializr и выберите правильную версию JDK.

Feign Client - создание приложения Spring Boot - шаг 2

Создание приложения Spring Boot — Шаг 2

Добавьте имя группы и артефакта . Выберите Gradle Project и введите версию для своего проекта.

Feign Client - создание приложения Spring Boot - шаг 3

Создание приложения Spring Boot — Шаг 3

В следующем окне выберите параметры:

  • Core -> DevTools
  • Сеть -> Сеть
  • Облако -> Облако Bootstrap
Feign Client - создание приложения Spring Boot - шаг 4

Создание приложения Spring Boot — Шаг 4

Выберите место для проекта и нажмите кнопку Готово .

Feign Client - создание приложения Spring Boot - шаг 5

Создание приложения Spring Boot — Шаг 5

И вуаля! У вас есть приложение Spring Boot.

Feign Client - создание приложения Spring Boot - шаг 6

Создание приложения Spring Boot — Шаг 6

3. Создайте контроллер и запустите приложение

Создайте один класс с именем FeignController . Аннотируйте Java-класс как Controller и реализуйте метод GET который возвращает ResponseEntity с фиктивными данными. После этого я собираюсь дополнить карту реальной информацией.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package com.example.feign.controller;
 
@RestController
public class FeignController {
 
    private final IWeatherClient weatherClient;
 
    @Autowired
    public FeignController(IWeatherClient weatherClient) {
        this.weatherClient = weatherClient;
    }
 
    @GetMapping(path = "/weather")
    ResponseEntity<Map> getWeather() {
        return ResponseEntity.ok(weatherClient.getWeather().getBody());
    }
}

Отредактируйте файл application.properties с портом для развертывания приложения.

1
server.port=9090

Наконец, запустите и протестируйте первую версию приложения.

Feign Client - протестировать приложение

Протестируйте приложение

4. Фальсификация реализации клиента

Отредактируйте файл сборки .gradle и включите следующие зависимости:

1
2
3
compile('org.springframework.boot:spring-boot-starter-web-services')
compile('org.springframework.cloud:spring-cloud-starter-openfeign')
compile('org.springframework.cloud:spring-cloud-starter-config')

Не забудьте запустить задачу сборки Gradle.

Feign Client - запустить задачу сборки Gradle

Запустите задачу сборки Gradle

Создайте один пакет и один интерфейс. Это будет наш клиент. Я назвал это IWeatherClient

Feign Client - Создать новый класс

Создать новый класс

Аннотируйте интерфейс как FeignClient и добавьте один метод для получения погоды. Аннотация @FeignClient требует, чтобы вы @FeignClient имя и URL-адрес службы. В этом случае я выбрал данные, такие как имя, и использовал свойство для URL.

1
2
3
4
5
6
7
8
9
package com.example.feign.feign;
 
@FeignClient(name = "data", url = "${feign.client.url}")
public interface IWeatherClient {
 
    @RequestMapping(method = RequestMethod.GET)
    ResponseEntity<Map> getWeather();
 
}

Добавьте одну реализацию для интерфейса. Это будет запасной вариант, если что-то пойдет не так, вызывая сервис. В этом случае у меня нет запасного варианта, поэтому я возвращаю ноль.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
package com.example.feign.feign.imp;
 
@Component
public class WeatherFallback implements IWeatherClient {
 
    @Override
    public ResponseEntity
 
 
 
<map> getWeather() {
        return null;
    }
 
}
</map>

Аннотируйте основной класс, чтобы включить Feign Clients. Аннотация @EnableFeignClients требует, чтобы вы включили базовые пакеты.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package com.example.feign;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
 
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.example.feign.feign",
        "com.example.feign.controller"})
public class FeignApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(FeignApplication.class, args);
    }
}

Наконец, используйте клиент feign в контроллере и снова запустите приложение.

Feign Client - Результат создания Feign Client

Результат создания Feign Client

5. Заключение

В этой записи объясняется, как создать декларативный HTTP-клиент, использующий Feign для использования Weather API. Цель Feign — уменьшить сложность равномерного связывания знаменателя с HTTP APIS, независимо от успокоенности.

6. Скачать проект

Скачать
Вы можете скачать полный исходный код этого примера здесь: Пример Feign