Рубрики
Без рубрики

Обратный путь для маршрута Куул

Узнайте, как настроить маршруты Зул с обратным вызовом.

Автор оригинала: Kamlesh Kumar.

1. Обзор

Зуул является краевой службой (или шлюзом API) от Netflix, которая обеспечивает динамическую маршрутизацию, мониторинг, устойчивость и безопасность.

В этом учебнике мы посмотрим, как настроить маршруты Зул с обратными .

2. Первоначальная настройка

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

2.1. Простое обслуживание REST

Допустим, наше приложение должно отображать сегодняшняя информация о погоде для пользователя. Таким образом, мы создадим приложение погодной службы на основе Spring Boot, используя весна-загрузка-стартер-веб- стартер:


    org.springframework.boot
    spring-boot-starter-web

Теперь мы создадим контроллер для нашей метеорологической службы:

@RestController
@RequestMapping("/weather")
public class WeatherController {

    @GetMapping("/today")
    public String getMessage() {
        return "It's a bright sunny day today!";
    }

}

Теперь давайте забудем метеорологическую службу и проверим API метеорологической службы:

$ curl -s localhost:8080/weather/today
It's a bright sunny day today!

2.2. Приложение шлюза API

Давайте создадим наше второе приложение Spring Boot, API Gateway. В этом приложении мы создадим маршрут Зуул для нашей метеорологической службы.

И так как и наша метеорологическая служба, и Зуул захотят использовать 8080 по умолчанию, мы настроили его для работы на другом порту, 7070.

Итак, давайте сначала добавим весна-облако-стартер-netflix-zuul в пом.xml:


    org.springframework.cloud
    spring-cloud-starter-netflix-zuul

Далее мы добавим @EnableZuulProxy аннотация к нашему классу приложений API Gateway:

@SpringBootApplication
@EnableZuulProxy
public class ApiGatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }

}

Наконец, мы настроили маршрут Зуул, используя ленту, для нашего API метеорологической службы в application.yml :

spring:
   application:
      name: api-gateway
server:
   port: 7070
  
zuul:
   igoredServices: '*'
   routes:
      weather-service:
         path: /weather/**
         serviceId: weather-service
         strip-prefix: false

ribbon:
   eureka:
      enabled: false

weather-service:
   ribbon:
      listOfServers: localhost:8080

2.3. Тестирование маршрута Куул

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

Итак, давайте забудем оба приложения и проверим API метеорологической службы через Зуул:

$ curl -s localhost:7070/weather/today
It's a bright sunny day today!

2.4. Тестирование провала маршрута Зуул без отката

Теперь, давайте остановим приложение метеорологической службы и проверить метеорологическую службу через Зул снова. В результате мы увидим сообщение об ошибке в ответе:

$ curl -s localhost:7070/weather/today
{"timestamp":"2019-10-08T12:42:09.479+0000","status":500,
"error":"Internal Server Error","message":"GENERAL"}

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

3. Обратный путь Зула для маршрута

Прокси-сервер Зуул использует ленту для балансировки нагрузки и выполнения запросов в команде Hystrix. В результате сбои в маршруте Зуула отображаются в матрице Hystrix .

Таким образом, чтобы создать пользовательский обратный вариант для маршрута Зуул, мы создадим фасоль типа Обратныйprovider .

3.1. Класс WeatherServiceFallback

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

@Component
class WeatherServiceFallback implements FallbackProvider {

    private static final String DEFAULT_MESSAGE = "Weather information is not available.";

    @Override
    public String getRoute() {
        return "weather-service";
    }

    @Override
    public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
        if (cause instanceof HystrixTimeoutException) {
            return new GatewayClientResponse(HttpStatus.GATEWAY_TIMEOUT, DEFAULT_MESSAGE);
        } else {
            return new GatewayClientResponse(HttpStatus.INTERNAL_SERVER_ERROR, DEFAULT_MESSAGE);
        }
    }

}

Как мы видим, мы переохотили методы, getRoute и обратный ответОтвет . getRoute метод возвращает Id маршрута для которых мы должны создать обратный вариант. В то время как обратный ответОтвет метод возвращает пользовательский обратный ответ , объект типа GatewayClientРеспонируется в нашем случае. GatewayClientРеспонируется является простой реализацией КлиентХтпРеспонс .

3.2. Тестирование обратного назад Зула

Давайте теперь тестируем обратный вариант, который мы создали для метеорологической службы. Поэтому мы забудем приложение API Gateway и убедитесь, что приложение метеорологической службы остановлено.

Теперь давайте получить доступ к API метеорологической службы по маршруту Зуул и посмотреть ответ на запас в действии:

$ curl -s localhost:7070/weather/today
Weather information is not available.

4. Откат для всех маршрутов

До сих пор мы видели, как создать обратный вариант для маршрута Зуул, используя свой маршрут Id . Однако, предположим, мы также хотим создать общий обратный вариант для всех других маршрутов в нашем приложении. Мы можем сделать это, создав еще одну реализацию Обратныйprovider и возвращение * или нулевой из getRoute метод , вместо маршрута Id :

@Override
public String getRoute() {
    return "*"; // or return null;
}

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

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

Как обычно, реализацию всех этих примеров и фрагментов кода можно найти более на GitHub .