Продолжайте учиться сегодня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
Получаются следующие результаты возврата:
Поскольку тайм-аут, который мы установили, составляет 3 секунды, а интерфейс спит в течение 5 секунд, срабатывает предохранитель понижения версии.
В это время мыapplication.yml
Измените период ожидания на 6 секунд и зайдите снова.
На этот раз предохранитель понижения не сработал.
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
Проверьте еще раз, и вы обнаружите, что возврат服务已被降级熔断
.
На этом статья заканчивается. В будущем могут быть дополнения