1. Обзор
Как следует из названия, Sentinel — это мощная защита для микросервисов. Он предлагает такие функции, как управление потоком, ограничение параллелизма, разрыв цепи и адаптивную защиту системы, чтобы гарантировать их надежность. Это компонент с открытым исходным кодом, активно поддерживаемый Alibaba Group. Кроме того, он официально является частью Spring Cloud Circuit Breaker .
В этом уроке мы рассмотрим некоторые основные функции Sentinel. Далее мы увидим пример того, как его использовать, его поддержку аннотаций и панель мониторинга.
2. Особенности
2.1. Управление потоком
Sentinel контролирует скорость случайных входящих запросов, чтобы избежать перегрузки микросервисов. Это гарантирует, что наш сервис не будет убит всплеском трафика. Он поддерживает различные стратегии формирования трафика. Эти стратегии автоматически приспосабливают трафик к соответствующей форме , когда количество запросов в секунду (QPS) слишком велико.
Вот некоторые из этих стратегий формирования трафика:
- Режим прямого отклонения — когда количество запросов в секунду превышает установленный порог, дальнейшие запросы автоматически отклоняются.
- Режим прогрева с медленным запуском — если происходит внезапный всплеск трафика, этот режим обеспечивает постепенное увеличение количества запросов, пока не будет достигнут верхний предел.
2.2. Разрыв цепи и понижение версии
Когда одна служба синхронно вызывает другую, есть вероятность, что другая служба по какой-то причине не работает. В таком случае потоки блокируются, поскольку они продолжают ждать ответа от другого сервиса. Это может привести к исчерпанию ресурсов, и вызывающая служба также не сможет обрабатывать дальнейшие запросы. Это называется каскадным эффектом и может разрушить всю нашу архитектуру микросервисов .
Чтобы предотвратить такие сценарии, на сцену выходит автоматический выключатель. Он немедленно заблокирует все последующие вызовы другой службы. По истечении тайм-аута некоторые запросы пропускаются. Если им это удается, автоматический выключатель возобновляет нормальный поток. В противном случае период ожидания начинается снова.
Sentinel использует принцип максимального ограничения параллелизма для реализации разрыва цепи. Это снижает влияние нестабильных ресурсов за счет ограничения количества одновременных потоков.
Sentinel также снижает рейтинг нестабильных ресурсов. Все обращения к ресурсу будут отклонены в указанном временном окне, если время отклика ресурса слишком велико. Это предотвращает ситуации, когда вызовы становятся очень медленными, что приводит к каскадному эффекту.
2.3. Адаптивная защита системы
Sentinel защищает наш сервер в случае чрезмерной нагрузки на систему . Он использует load1
(загрузка системы) в качестве метрики для запуска управления трафиком. Запрос будет заблокирован при следующих условиях:
- Текущая загрузка системы (
load1
) > порог (highestSystemLoad
); - Текущие одновременные запросы (количество потоков) > расчетная емкость (минимальное время ответа * максимальное количество запросов в секунду)
3. Как использовать
3.1. Добавить зависимость Maven
В нашем проекте Maven нам нужно добавить зависимость дозорного ядра
в pom.xml
:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>
3.2. Определить ресурс
Давайте определим наш ресурс с соответствующей бизнес-логикой внутри блока try-catch
с помощью Sentinel API:
try (Entry entry = SphU.entry("HelloWorld")) {
// Our business logic here.
System.out.println("hello world");
} catch (BlockException e) {
// Handle rejected request.
}
Этот блок try-catch
с именем ресурса «HelloWorld» служит точкой входа в нашу бизнес-логику, охраняемую Sentinel.
3.3. Определить правила управления потоком
Эти правила контролируют поток к нашим ресурсам, такие как пороговое значение или поведение управления — например, прямой отказ или медленный запуск. Давайте используем FlowRuleManager.loadRules()
для настройки правил потока:
List<FlowRule> flowRules = new ArrayList<>();
FlowRule flowRule = new FlowRule();
flowRule.setResource(RESOURCE_NAME);
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRule.setCount(1);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);
Это правило определяет, что наш ресурс «RESOURCE_NAME» может отвечать максимум на один запрос в секунду.
3.4. Определение правил деградации
Используя правила деградации, мы можем настроить пороговое количество запросов прерывателя цепи, время ожидания восстановления и другие параметры.
Давайте настроим правила деградации с помощью DegradeRuleManager.loadRules()
:
List<DegradeRule> rules = new ArrayList<DegradeRule>();
DegradeRule rule = new DegradeRule();
rule.setResource(RESOURCE_NAME);
rule.setCount(10);
rule.setTimeWindow(10);
rules.add(rule);
DegradeRuleManager.loadRules(rules);
Это правило указывает, что когда наш ресурс RESOURCE_NAME
не сможет обслужить 10 запросов (пороговое значение), цепь разорвется. Все последующие запросы к ресурсу будут заблокированы Sentinel на 10 секунд (временное окно).
3.5. Определение правил защиты системы
Используя правила защиты системы, мы можем настроить и обеспечить адаптивную защиту системы (порог нагрузки1
, среднее время отклика, количество одновременных потоков). Настроим системные правила с помощью метода SystemRuleManager.loadRules()
:
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10);
rules.add(rule);
SystemRuleManager.loadRules(rules);
Это правило указывает, что для нашей системы максимальная загрузка системы составляет 10 запросов в секунду. Все дальнейшие запросы будут заблокированы, если текущая нагрузка превысит этот порог.
4. Поддержка аннотаций
Sentinel также предоставляет поддержку аспектно-ориентированных аннотаций для определения ресурса .
Во-первых, мы добавим зависимость Maven для sentinel-annotation-aspectj
:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.0</version>
</dependency>
Затем мы добавляем @Configuration
в наш класс конфигурации, чтобы зарегистрировать дозорный аспект как компонент Spring:
@Configuration
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
@SentinelResource
указывает определение ресурса. У него есть такие атрибуты, как value
, определяющее имя ресурса. Резервный
атрибут атрибута — это имя резервного метода. Когда цепь разорвана, этот резервный метод определяет альтернативный поток нашей программы. Давайте определим ресурс, используя аннотацию @SentinelResource
:
@SentinelResource(value = "resource_name", fallback = "doFallback")
public String doSomething(long i) {
return "Hello " + i;
}
public String doFallback(long i, Throwable t) {
// Return fallback value.
return "fallback";
}
Это определяет ресурс с именем имя_ресурса
, а также резервный метод.
5. Панель мониторинга
Sentinel также предоставляет панель мониторинга. Благодаря этому мы можем отслеживать клиентов и динамически настраивать правила. Мы можем видеть объем входящего трафика к нашим определенным ресурсам в режиме реального времени.
5.1. Запуск информационной панели
Во-первых, нам нужно скачать jar-файл Sentinel Dashboard . И затем мы можем запустить панель управления с помощью команды:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
После запуска приложения панели управления мы можем подключить наше приложение, выполнив действия, описанные в следующих разделах.
5.2. Подготовка нашего приложения
Давайте добавим зависимость sentinel-transport-simple-http
к нашему pom.xml
:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.0</version>
</dependency>
5.3. Подключение нашего приложения к панели инструментов
При запуске приложения нам нужно добавить IP-адрес панели управления:
-Dcsp.sentinel.dashboard.server=consoleIp:port
Теперь всякий раз, когда вызывается ресурс, панель мониторинга будет получать пульс от нашего приложения:
Мы также можем динамически управлять потоком, деградацией и системными правилами с помощью панели управления.
6. Заключение
В этой статье мы рассмотрели основные функции управления потоком, автоматическим выключателем и адаптивной защитой системы Alibaba Sentinel.
Соответствующие примеры можно найти на GitHub .