Серия микросервисов: понижение версии предохранителя шлюза служб Spring Cloud Gateway

Микросервисы Spring Cloud
Серия микросервисов: понижение версии предохранителя шлюза служб Spring Cloud Gateway

Продолжайте учиться сегодняSpring Cloud Gatewayпредохранитель и понижение.

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

Введение концепции

Деградация сервиса: разумная координация ограниченных ресурсов системы

  • Концепция: Деградация службы обычно означает, что когда нагрузка на сервер резко возрастает, в соответствии с фактическим использованием бизнеса и трафиком, некоторые службы и страницы стратегически не обрабатываются или обрабатываются простым способом, таким образомОсвободите ресурсы серверных ресурсов, чтобы обеспечить нормальную и эффективную работу основного бизнеса.
  • Причина: Ресурсы сервера ограничены, а запросы не ограничены. В пиковый период использования пользователями это повлияет на производительность всей службы, а в тяжелых случаях приведет к простою, так что некоторые важные службы будут недоступны. Поэтому, чтобы обеспечить доступность основных функциональных сервисов в пиковые периоды, необходимо понизить некоторые сервисы. Его можно понимать как отказ от малого и защита большого.
  • Сценарий приложения: в основном используется в микросервисной архитектуре.Как правило, когда общая нагрузка всей микросервисной архитектуры превышает заданный верхний порог (связанный с производительностью конфигурации сервера) или ожидается, что предстоящий трафик превысит заданный порог ( Например, двойные 11, 6.18 и другие действия или пиковые действия)
  • Деградация сервиса основана на нагрузке всей системы.В некоторых случаях, когда нагрузка относительно высока, чтобы предотвратить перегрузку некоторых функций (бизнес-сценариев) или медленное реагирование, временно отказываются от некоторых второстепенных функций внутри. интерфейс и запрос данных, а также прямой возврат подготовленного заранееfallback(запасной вариант) Информация об обработке ошибок. Таким образом, несмотря на то, что предоставляется услуга с потерями, гарантируется стабильность и доступность всей системы.
  • Вопросы для рассмотрения:
    • Различать, какие услуги являются основными, а какие неосновными.
    • Стратегия перехода на более раннюю версию (метод обработки, как правило, относится к тому, как давать удобные подсказки или операции)
    • Автоматический даунгрейд или ручной даунгрейд

Микросервисная архитектура — деградация сервисаЭта статья очень подробная.

Service Meltdown: Механизм самозащиты канала для борьбы с лавинными эффектами. Может рассматриваться как частный случай понижения рейтинга

  • Концепция: механизм защиты ссылок для борьбы с лавинным эффектом микросервисов, аналогичный фондовому рынку и предохранителю.
  • Причина: взаимодействие данных между микросервисами осуществляется посредством удаленных вызовов. Служба A вызывает службу, а служба B вызывает службу C. В определенное время время ответа на вызов службы C по ссылке слишком велико или служба C недоступна. С увеличением времени звонков становится все больше и больше к сервису C, а затем к сервису C происходит сбой, но вызовы по ссылке все еще есть, а вызовы к сервису B продолжают увеличиваться, а затем происходит сбой сервиса B, за которым следует сбой A, что приводит к лавинному эффекту
  • Сервисный автоматический выключатель — это механизм защиты канала микросервиса для борьбы с лавинным эффектом. Например, в высоковольтной цепи, если напряжение где-то слишком высокое, предохранитель перегорает, чтобы защитить цепь. Точно так же в микросервисной архитектуре механизм прерывателя цепи также играет аналогичную роль. Когда микросервис вызывающего звена недоступен или время отклика слишком велико, сервис будет взорван, вызовов к микросервису узла больше не будет, и будет быстро возвращена неверная ответная информация. Когда обнаруживается, что ответ узла на вызов микрослужбы нормальный, связь вызова возобновляется.
  • Функционал сервисного предохранителя аналогичен предохранителю в нашем доме: когда сервис недоступен или истекает время отклика, чтобы предотвратить лавину всей системы, вызов сервиса временно прекращается.

существуетSpring CloudВ рамках механизм взрывателя продет черезHystrixвыполнить.HystrixСтатус вызовов между микросервисами будет контролироваться.Когда количество неудачных вызовов достигнет определенного порога, по умолчанию это 20 неудачных вызовов в течение 5 секунд, и будет активирован механизм прерывателя цепи.

  • Сценарий приложения: в микросервисной архитектуре используется несколько микросервисов, где они вызывают друг друга.

  • Вопросы для рассмотрения:

    • Почему зависимый объект службы нестабилен
    • Как быстро восстановить зависимые объекты после сбоя и как определить, восстановлены ли зависимые объекты

Разница между служебной деградацией и сервисным предохранителем

  • Причины срабатывания разные: перегорание службы вызвано службой на канале, а ухудшение службы связано с общей нагрузкой.
  • Целевые уровни управления различаются: Service Fuse — это процесс уровня инфраструктуры, а понижение уровня обслуживания — это процесс бизнес-уровня.
  • Методы реализации различны.Служебный предохранитель, как правило, представляет собой самовосстановление предохранителя, а снижение качества обслуживания эквивалентно ручному управлению.
  • Различные причины срабатывания Служебный предохранитель обычно вызывается сбоем службы (нисходящей службы), а ухудшение службы обычно рассматривается исходя из общей нагрузки;

резюме в одном предложении

Автоматический выключатель обслуживания является страховой мерой для борьбы с лавинами системного обслуживания, специальной мерой понижения. Ухудшение качества обслуживания — более широкое понятие, в основном для разумного распределения общих ресурсов системы, чтобы справиться с нагрузкой.

Автоматический выключатель обслуживания — это частный случай ухудшения обслуживания, который является мерой, принимаемой для предотвращения лавин обслуживания. Если система работает ненормально или с задержкой, или трафик слишком велик, сработают предохранительные меры службы, связь будет разорвана, и метод вернется к конечному результату. Это местная страховая мера.

Снижение качества обслуживания — это разумное распределение общих системных ресурсов. Различают основные и дополнительные услуги. Оцените время задержки доступа, аномалии и т. д. услуги и предоставьте восходящий метод. Это глобальное соображение, которое управляет общей нагрузкой системы.

Кодовый бой

Вышеупомянутые родственные концепции исходят из:Разница между сервисным понижением и сервисным предохранителем - Zhihu (zhihu.com)

Поняв соответствующие концепции, давайте посмотрим, какSpring Cloud GatewayВ реальном бою настройте автоматический выключатель и понизьте рейтинг.

1,pom.xmlфайл добавленHystrixполагаться

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

Здесь следует отметить, что существует проблема с версией Spring Cloud, разные версии могут быть неуспешно внедрены. я здесьHoxton.SR6Версия

2,application.ymlнастроить

server:
  port: 8080

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      routes:
        - id: cloud-gateway
          uri: http://localhost:8080
          predicates:
            - Path=/ytb/**
          filters:
            - StripPrefix=1
            # 降级配置
            - name: Hystrix
              args:
                name: testOne
                # 降级接口的地址
                fallbackUri: forward:/fallback
# 针对全局配置
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 3000
    # 对单独的 Hystrix 的 commandKey 设置超时时间
    testOne:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000

В конфиге есть необязательный параметрfallbackUri, в настоящее время поддерживает толькоforwardмодальныйURI. В случае срабатывания автоматического выключателя запрос будет перенаправлен на этотURIсоответствующий контроллер. Контроллеры могут быть индивидуальнымиfallbackИнтерфейс; также может быть настраиваемымHandler, нужно реализовать интерфейсorg.springframework.web.reactive.function.server.HandlerFunction<T extends ServerResponse>.

Также задается время таймаута интерфейса, то есть если ответ интерфейса превысит это время, сработает фьюз.

3.fallbackUriНастроенный адресный интерфейс пониженной версии

@RestController
public class FallbackController {

    @GetMapping("/fallback")
    public Map<String, Object> fallback() {
        Map<String, Object> map = new HashMap<>();
        map.put("code", "error");
        map.put("msg", "服务暂时不可用");
        return map;
    }
}

4. Тестовый интерфейс

@RestController
public class TestController {

    @GetMapping("/timeout")
    public String timeout(){
        try {
            Thread.sleep(5000);
            System.out.println("模拟接口超时");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "请求成功";
    }
}

Thread.sleep(5000)Используется для имитации времени ожидания вызова интерфейса.

Тогда вы можете начать проект и посетить этот адресlocalhost:8080/ytb/timeout

Получаются следующие результаты возврата:

image.png

Поскольку тайм-аут, который мы установили, составляет 3 секунды, а интерфейс спит в течение 5 секунд, срабатывает предохранитель понижения версии.

В это время мыapplication.ymlИзмените период ожидания на 6 секунд и зайдите снова.

image.png

На этот раз предохранитель понижения не сработал.

5. НастроитьHandlerСпособ

Как упоминалось ранее, контроллер может быть кастомным.fallbackИнтерфейс; также может быть настраиваемымHandler. буду вставлять сноваHandlerкод пути

Конфигурация маршрутизации:

@Configuration
public class RouterFunctionConfiguration
{
    @Autowired
    private HystrixFallbackHandler hystrixFallbackHandler;

    @SuppressWarnings("rawtypes")
    @Bean
    public RouterFunction routerFunction()
    {
        return RouterFunctions
                .route(RequestPredicates.path("/fallback").and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        hystrixFallbackHandler);
    }
}

настроитьHandler:

@Component
public class HystrixFallbackHandler implements HandlerFunction<ServerResponse>
{
    private static final Logger log = LoggerFactory.getLogger(HystrixFallbackHandler.class);

    @Override
    public Mono<ServerResponse> handle(ServerRequest serverRequest)
    {
        Optional<Object> originalUris = serverRequest.attribute(GATEWAY_ORIGINAL_REQUEST_URL_ATTR);
        originalUris.ifPresent(originalUri -> log.error("网关执行请求:{}失败,hystrix服务降级处理", originalUri));
        return ServerResponse.status(HttpStatus.INTERNAL_SERVER_ERROR.value()).contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(JSON.toJSONString("{"error":"服务已被降级熔断"}")));
    }
}

Запустите службу шлюзаGatewayApplication.java,доступlocalhost:8080/ytb/timeoutПроверьте еще раз, и вы обнаружите, что возврат服务已被降级熔断.

На этом статья заканчивается. В будущем могут быть дополнения