Эта статья участвовала в приказе о созыве Haowen, нажмите, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!
Обзор
Книга с прошлого раза:Что вы имеете в виду под дросселированием?, общий обзор ограничения тока, описывает限流是什么
,限流方式
а также限流的实现
. в конце статьи分布式限流
, не стал слишком много вводить, решил поместить его в эту статью. Объясните это вам, ребятаSentinel
Поставляется с самой авторитетной официальной вики:«Alibaba-Sentinel, руководство для начинающих»
Адрес исходного кода этой статьи:GitHub.com/JayMeasurementon/SP…
Что такое Сентинел?
Traffic Guards для распределенных систем
Процитирую картинку, которую я нарисовал ранее:
流量防卫兵
Какие у него возможности?
Экосистема Sentinel
вместе сAlibaba
экосистемы Java, включаяSpring Cloud Alibaba
,Rocket
,Nacos
Вклад многих технологий с открытым исходным кодом и т. д. Sentinel
Он имеет хорошую поддержку и адаптацию для различных сценариев распределенных приложений, поэтому мы выбираемSentinel
Одна из причин обучения (низкая стоимость обучения и множество сценариев применения)
Основные концепции Sentinel
1. Ресурсы
资源
даSentinel
серединаодно из основных понятий. Наиболее часто используемые ресурсы находятся в нашем кодеJava 方法
,一段代码
,или一个接口
.
Java-метод:
@SentinelResource("HelloWorld")
public void helloWorld() {
// 资源中的逻辑
System.out.println("hello world");
}
Кусок кода:
// 1.5.0 版本开始可以直接利用 try-with-resources 特性,自动 exit entry
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
интерфейс:
@RestController
public class TestController {
@GetMapping("/test")
public String test(){
return "test";
}
}
Использовать с консолью:
2. Правила
Sentinel
середина规则
Предоставьте пользователям различные действия защиты для разных сценариев.Типы правил включают:
-
流量
правила контроля -
熔断
правила перехода на более раннюю версию -
系统保护
правило - Правила контроля доступа к источнику
- Правила параметров точки доступа
Эта статья в основном объяснит流量
,熔断
а также系统保护
эти три правила.
Определите правила:
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
//绑定资源
rule.setResource("HelloWorld");
//限流阈值类型
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//数量级别
rule.setCount(20);
//添加到本地内存
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
限流规则
Важное описание недвижимости:
Field | иллюстрировать | По умолчанию |
---|---|---|
resource | Имя ресурса, имя ресурса является объектом текущего правила ограничения | |
count | Порог ограничения тока | |
grade | Тип порога ограничения тока, режим QPS (1) или режим подсчета параллельных потоков (0) | Режим запросов в секунду |
limitApp | Источник вызова для управления потоком |
default , что означает, что источник вызова не различается |
strategy | Вызов текущей ограничивающей стратегии отношений: прямая, ссылка, ассоциация | По самому ресурсу (напрямую) |
controlBehavior | Эффект управления потоком (прямое отклонение/прогрев/постоянная скорость + очередь), не поддерживает текущее ограничение путем вызова отношения | полный отказ |
clusterMode | Ограничение тока кластера | нет |
Sentinel регулирование
1. Автономное ограничение тока
1.1. Введение зависимостей
В предыдущей статье упоминалосьRateLimiter
Здесь вводится ограничение тока для одной машины с использованиемSentinel
Реализовано автономное ограничение тока
//项目中引入 sentinel-core 依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.1</version>
</dependency>
1.2. Определить действующие правила ограничения
Определить правила защиты:
private static void initFlowRules(){
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
//绑定资源
rule.setResource("HelloWorld");
//限流阈值类型
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//数量级别
rule.setCount(20);
//添加到本地内存
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
1.3. Определить ресурсы, ограничивающие ток
Согласно вышеизложенному资源
подразделение, мы будем в основном代码块
Определяется как ресурс.
public static void main(String[] args) {
// 配置规则.
initFlowRules();
while (true) {
// 1.5.0 版本开始可以直接利用 try-with-resources 特性,自动 exit entry
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("hello world");
} catch (BlockException ex) {
// 处理被流控的逻辑
System.out.println("blocked!");
}
}
}
1.4. Текущие результаты
После запуска демо мы можем войти в систему
~/logs/csp/${appName}-metrics.log.xxx
см. следующий вывод:
➜ csp cat com-jaycekon-sentinel-demo-FlowRuleDemo-metrics.log.2021-07-03
|--timestamp-|------date time----|-resource-|p |block|s |e|rt
1625294582000|2021-07-03 14:43:02|HelloWorld|20|1720|20|0|2|0|0|0
1625294583000|2021-07-03 14:43:03|HelloWorld|20|5072|20|0|0|0|0|0
1625294584000|2021-07-03 14:43:04|HelloWorld|20|6925|20|0|0|0|0|0
-
p
Запросы, переданные от имени -
block
Представляет заблокированный запрос -
s
Представляет количество успешно выполненных запросов -
e
Представляет определяемое пользователем исключение -
rt
представляет среднее время отклика
Sentinel
Автономный текущий предел , иRateLimiter
какие отличия есть?
Field | Сложность реализации в распределенной среде | космическая сложность | временная сложность | Ограничить пакетный трафик | Плавное ограничение тока |
---|---|---|---|---|---|
ведро с жетонами | высокий | Низкий О (1) | Высокий О(Н) | да | да |
раздвижное окно | середина | Высокий О(Н) | Средний O(N) | да | Относительная реализация |
приложение:«Sentinel — принцип реализации скользящего окна»
2. Ограничение тока консоли
2.1. Консоль клиентского доступа
Для получения более подробной документации см.:Страж — Консоль
Sentinel предоставляет облегченную консоль с открытым исходным кодом, которая обеспечивает обнаружение компьютеров и управление их работоспособностью, мониторинг (отдельных компьютеров и кластеров), управление правилами и функции отправки.
скачатьJar 包(21M)
, или скачать源码(4M)
Затем скомпилируйте его самостоятельно (не рекомендуется, компиляция занимает больше времени, чем прямая загрузка пакета jar)
После компиляции запустите команду
java -Dserver.port=8000 -Dcsp.sentinel.dashboard.server=localhost:8000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar
войти в консоль
2.2. Введение зависимостей
Клиент должен импортироватьTransport
модули поставляются сSentinel
консоль для общения. ты можешь пройтиpom.xml
Импортируйте JAR-пакет
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.1</version>
</dependency>
//重要的依赖,还是提前先写上吧,避免小伙伴找不到了
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>1.8.1</version>
</dependency>
Потом! ! ! А вот и место, которое утомляет меня весь день! ! В официальной документации указано, что необходимо ввести对应的依赖配置
, Милый, у тебя голова болит, занижать такую важную вещь! ! !
Соответствующие адаптационные зависимости
- Облачная микросервисная система
- Веб-адаптация
- Адаптация RPC
- Адаптация HTTP-клиента
- Реактивная адаптация
- Реактивная адаптация
- Apache RocketMQ
Молодец, практически все бизнес-сценарии рассмотрены! из-за моего Demo
проект основан наSpringBoot
, а потом хотите посмотреть видео под нативной облачной микросервисной системой, молодец, пользуйтесьSpringCloud
, Для получения дополнительной информации см.:"Весна-Облако-Страж"
2.3. Определить ресурсы
@SpringBootApplication
@Configuration
@RestController
public class SpringBootSentinelApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootSentinelApplication.class, args);
}
@Bean
public FilterRegistrationBean sentinelFilterRegistration() {
FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<>();
registration.setFilter(new CommonFilter());
registration.addUrlPatterns("/*");
registration.setName("sentinelFilter");
registration.setOrder(1);
return registration;
}
@RequestMapping("/index")
public String index(){
return "hello index";
}
}
В обзоре мы упомянули, что ресурсы, которые необходимо защитить, могут быть一个代码块
,一个方法
или一个接口
. здесь черезFilter
образом, определить все запросы как ресурсы (/*
), то наш процесс запроса станет таким:
2.4. Текущие результаты
Добавьте параметры запуска
-Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=jaycekon-sentinel
Описание параметра:
-
server.port
: порт запуска службы -
csp.sentinel.dashboard.server
: IP-адрес машины для отчетов о состоянии: порт -
project.name
: Имя элемента мониторинга
результат операции:
2.5 Конфигурация ограничения тока
Эффект управления потоком
- 1. Потерпеть неудачу быстро: потерпеть неудачу сразу
- 2. Прогрев: режим прогрева, в соответствии со значением codeFactory (по умолчанию 3), от порога / codeFactory, после времени прогрева достигается установленный порог QPS. Например, если QPS установлено на 90, а предварительный нагрев установлен на 10 секунд, начальный порог равен 90/3=30, и он достигнет 90 через 10 секунд.
- 3. Ожидание в очереди: например, установите пороговое значение 10 и время ожидания 500 миллисекунд.Когда придет 11-й запрос, он не сообщит об ошибке напрямую, а подождет 500 миллисекунд.Если порог все еще превышает 10, текущий будет быть ограниченным. .
результат операции:
3. Ограничение тока кластера
После стольких разговоров я наконец добрался до сути集群限流
план, в秒杀系统
При проектировании мы говорили о том, что многие сценарии анализируются с одной машиной как частный случай.Если нашу систему нужно расширить, как это сделать хорошо限流方案
. Предполагая, что в кластере 10 машин, мы устанавливаем порог ограничения тока для одной машины для каждой машины как 10 QPS
, в идеале порог ограничения тока всего кластера равен 100 QPS
. Однако на практике трафик к каждой машине может быть不均匀
, что приведет к тому, что некоторые машины будут ограничивать ток до того, как будет достигнута общая сумма. Поэтому, если вы полагаетесь только на автономное измерение, чтобы ограничить его, вы не сможете精确
ограничить общий поток. а также集群流控
Общее количество вызовов всего кластера можно точно контролировать в сочетании с单机限流兜底
, может лучше воспроизвести эффект управления потоком.
Представьте основные роли ограничения тока кластера:
-
Token Client
: клиент управления потоком кластера, который используется для запроса токенов с сервера токенов, которому он принадлежит. Сервер ограничения тока кластера вернет результат клиенту, чтобы решить, ограничивать ли ток. -
Token Server
: то есть сервер управления потоком кластера, который обрабатывает запрос от Token Client и решает, следует ли выдавать токен (разрешено ли его прохождение) в соответствии с настроенными правилами кластера.
Структурная схема во встроенном режиме:
Структурная схема в автономном режиме:
内嵌模式
, то есть операция выдачи Токена, одну из которых совершает один из экземпляров, а другие Клиенты получают разрешение на доступ, запрашивая Сервер.
独立模式
, то есть он запускается как независимый процесс сервера токенов, развертывается независимо и имеет хорошую изоляцию, но требует дополнительных операций развертывания.
3.1 Облако Alibaba AHAS
В приведенном выше примере кода локальный режимDemo
, В сценарии ограничения тока кластера вот использование, предоставляемое Alibaba CloudAHAS
Служить.
Адрес консоли:ahas.console.aliyun.com/index?Вы =...
Импорт зависимостей:
//sentinel ahas 依赖,包括了sentinel的使用依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>ahas-sentinel-client</artifactId>
<version>1.8.8</version>
</dependency>
Здесь есть что отметить,AHAS
зависимости, в том числеSentinel
, зависимости, которые вам нужно использовать, в том числеsentinel-core
,sentinel-web-servlet
а такжеsentinel-transport-simple-http
.
В противном случае появитсяSpi
исключение, если правильноSpi
Я мало что знаю, предлагаю добавить группу, чтобы задавать вопросы, хе-хе~
com.alibaba.csp.sentinel.spi.SpiLoaderException
3.2. Откройте сервис Alibaba Cloud AHAS
Здесь есть официальные вступительные документы, поэтому я не буду вдаваться в подробности.адрес документа
Найдено в App Guard здесьLincense
, а затем добавьте параметры запуска:
-Dserver.port=8092 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true
Поскольку мы хотим запускать несколько экземпляров локально, нам нужно изменить несколько портов службы:
java -Dserver.port=8090 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true -jar sentinel-ahas-0.0.1-SNAPSHOT.jar
java -Dserver.port=8091 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true -jar sentinel-ahas-0.0.1-SNAPSHOT.jar
java -Dserver.port=8092 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true -jar sentinel-ahas-0.0.1-SNAPSHOT.jar
После генерации трафика доступа вы можете увидеть статус соединения машины на панели инструментов:
3.3 Конфигурация правила управления потоком кластера
Здесь есть два понятия:
- Порог кластера: относится к общему количеству посещений, которые может пройти наш кластер, которые могут быть распределены неравномерно (чтобы избежать ограничений на ошибки одной машины).
- Устаревшая одиночная машина: когда истекает время доступа к серверу токенов, то есть когда токен не может быть получен с удаленного конца, возвращается к текущему ограничению для одной машины.
Ограничение тестового тока, только доступhttp://localhost:8092/index
Через ручную кисть (скорость руки слишком высока~) достигается критическое значение ограничения тока, и тогда общий предел тока соответствует нашим ожиданиям.
Ухудшенная одиночная машина
В управлении потоком кластера есть время ожидания запроса токена,Client
проситьServer
, затем возвращает результат данных. Весь процесс будет трудоемким для сетевых запросов.В приведенном выше тестовом процессе я увеличил время ожидания, и я могу получить токен для каждого запроса.Изменив время ожидания запроса, запускается деградация.单机限流
.
результат операции:
3.4, Преобразование роли сервера
Во встроенном режиме через HTTP API роль преобразуется вServer
илиclient
http://<ip>:<port>/setClusterMode?mode=<xxx>
где режим0
представляет клиента,1
представляет сервер,-1
Представляет закрытый. Обратите внимание, что на стороне приложения необходимо ввести соответствующие зависимости клиента или сервера ограничения тока кластера.
В автономном режиме мы можем напрямую создать соответствующийClusterTokenServer
экземпляр и передать в основную функциюstart
способ запуска Token Server.
Страж взорван
существует秒杀系统
В случае , полная ссылка может содержать下订单
,支付
а также物流对接
Дождитесь нескольких сервисов (на самом деле больше). В полной ссылке каждая система взаимодействует в виде rpc/http, На приведенной ниже схеме связи, если пользователь выбирает способ оплаты, есть延时过高
,服务不稳定
,или服务异常
В других случаях вся ссылка не может быть завершена. Конечным результатом является то, что пользователь явно схватил его, но не смог оплатить, что привело к потере заказа.
Современные микросервисные архитектуры分布式
, очень многие服务
сочинение. Различные сервисы звонят друг другу, образуя комплекс调用链路
. Вышеупомянутые проблемы будут иметь увеличительный эффект в вызове ссылки. кольцо в сложном звене不稳定
, может быть层层级联
, что в итоге приводит к整个链路
недоступны. Поэтому нам нужноСлабозависимые сервисные вызовыВыполните понижение версии предохранителя, временно отключите нестабильные вызовы,避免局部不稳定因素导致整体的雪崩
.熔断降级
как средство самозащиты, обычно客户端(调用端)
настроить.
1. Понижение предохранителя
добавить тестовый код
@RequestMapping("/myError")
public String error(){
if (true){
throw new RuntimeException("sentinel run error");
}
return "error";
}
существуетSentinel-Dashboard
Настройте правила перехода на более раннюю версию в
![image-20210706005136317](/Users/huangweijie/Library/Application Support/typora-user-images/image-20210706005136317.png)
![image-20210706005159415](/Users/huangweijie/Library/Application Support/typora-user-images/image-20210706005159415.png)
Эффект защиты от понижения версии:
пользователь через интерфейс доступа/myError
, после возникновения исключения, в следующем10秒
, будет следовать стратегии перехода на более раннюю версию и вернется напрямую. Он может хорошо защитить сервер, чтобы избежать слишком большого количества исключений и занять ресурсы компьютера. При этом быстро реагировать на запросы пользователей.
2. Стратегия слияния
Sentinel предлагает следующие стратегии автоматического выключателя:
- Коэффициент медленного колла (
SLOW_REQUEST_RATIO
): В качестве порога выберите коэффициент медленных вызовов. Вам необходимо установить разрешенный медленный вызов RT (то есть максимальное время ответа). Если время ответа запроса больше этого значения, он будет считаться медленным вызов. Когда время статистики устройства (statIntervalMs
) превышает установленное минимальное количество запросов, а доля медленных вызовов превышает пороговое значение, запросы будут автоматически сброшены в течение следующего срока действия фьюза. По истечении времени действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние). Если время ответа на следующий запрос меньше установленного медленного вызова RT, предохранитель прекращает работу. Если оно больше, чем установите медленный вызов RT, он снова будет взорван. - Неправильная пропорция (
ERROR_RATIO
): Когда время статистики устройства (statIntervalMs
) превышает установленное минимальное количество запросов, а доля исключений превышает пороговое значение, то запросы будут автоматически сброшены в течение следующего срока действия предохранителя. По истечении срока действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние). Пороговый диапазон для отношения аномалий составляет[0.0, 1.0]
, представляющий 0% - 100%. - Количество исключений (
ERROR_COUNT
): Когда количество исключений в единице статистического времени превышает пороговое значение, оно автоматически сливается. По истечении срока действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние).
Суммировать
В этой статье в основном подробно объясняется, как на самом деле связаться с ограничением тока и слиянием через Sentinel.Для базовой реализации ограничения тока в будущем будет специальная статья с анализом исходного кода. Что касается предохранителя, в этой статье мы не будем вдаваться в подробности, в следующей статье вы узнаете, что такое предохранитель, как он на самом деле используется в системе и каковы общие стратегии использования предохранителей.
Адрес исходного кода проекта:GitHub.com/JayMeasurementon/SP…Добро пожаловатьStar
а такжеFork
Обратите внимание, не потеряйтесь
Ладно, это все, что касается этой статьи. Каждую неделю я буду обновлять несколько высококачественных интервью с крупными фабриками и статьи, связанные с общими технологическими стеками. Спасибо за возможность видеть это, если эта статья хорошо написана, пожалуйста, попросите три подряд! ! ! Творить не просто, спасибо за поддержку и признание, увидимся в следующей статье!
я九灵
, есть детская обувь, которую нужно сообщить, вы можете добавить меня wx,Jayce-K
, обратите внимание на общедоступный номер:Java 补习课
, осваивайте информацию из первых рук!
Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!