"High Availability Series" - Sentinel, текущий ограничивающий артефакт, разве вы не знаете?

Java задняя часть
"High Availability Series" - Sentinel, текущий ограничивающий артефакт, разве вы не знаете?

Эта статья участвовала в приказе о созыве Haowen, нажмите, чтобы просмотреть:Двойные заявки на внутреннюю и внешнюю стороны, призовой фонд в 20 000 юаней ждет вас, чтобы бросить вызов!

Обзор

Книга с прошлого раза:Что вы имеете в виду под дросселированием?, общий обзор ограничения тока, описывает限流是什么,限流方式а также限流的实现. в конце статьи分布式限流, не стал слишком много вводить, решил поместить его в эту статью. Объясните это вам, ребятаSentinel

Поставляется с самой авторитетной официальной вики:«Alibaba-Sentinel, руководство для начинающих»

Адрес исходного кода этой статьи:GitHub.com/JayMeasurementon/SP…

Что такое Сентинел?

Traffic Guards для распределенных систем

Процитирую картинку, которую я нарисовал ранее:

image.png

流量防卫兵Какие у него возможности?

image.png

Экосистема Sentinel

вместе сAlibabaэкосистемы Java, включаяSpring Cloud Alibaba,Rocket,NacosВклад многих технологий с открытым исходным кодом и т. д. SentinelОн имеет хорошую поддержку и адаптацию для различных сценариев распределенных приложений, поэтому мы выбираемSentinelОдна из причин обучения (низкая стоимость обучения и множество сценариев применения)

image.png

Основные концепции 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";
    }
}

Использовать с консолью:

image.png

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см. следующий вывод:

image.png

➜  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)

GitHub.com/alibaba/s ru…

После компиляции запустите команду

java -Dserver.port=8000 -Dcsp.sentinel.dashboard.server=localhost:8000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.1.jar

8608912f0070c8c93df53f6c3cb21952.gif

войти в консоль

image.png

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>

Потом! ! ! А вот и место, которое утомляет меня весь день! ! В официальной документации указано, что необходимо ввести对应的依赖配置, Милый, у тебя голова болит, занижать такую ​​важную вещь! ! !

image.png

Соответствующие адаптационные зависимости

Молодец, практически все бизнес-сценарии рассмотрены! из-за моего 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образом, определить все запросы как ресурсы (/*), то наш процесс запроса станет таким:

image.png

2.4. Текущие результаты

Добавьте параметры запуска

-Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=jaycekon-sentinel

Описание параметра:

  • server.port: порт запуска службы
  • csp.sentinel.dashboard.server: IP-адрес машины для отчетов о состоянии: порт
  • project.name: Имя элемента мониторинга

image.png

результат операции:image.png

2.5 Конфигурация ограничения тока

image.png

Эффект управления потоком

  • 1. Потерпеть неудачу быстро: потерпеть неудачу сразу
  • 2. Прогрев: режим прогрева, в соответствии со значением codeFactory (по умолчанию 3), от порога / codeFactory, после времени прогрева достигается установленный порог QPS. Например, если QPS установлено на 90, а предварительный нагрев установлен на 10 секунд, начальный порог равен 90/3=30, и он достигнет 90 через 10 секунд.
  • 3. Ожидание в очереди: например, установите пороговое значение 10 и время ожидания 500 миллисекунд.Когда придет 11-й запрос, он не сообщит об ошибке напрямую, а подождет 500 миллисекунд.Если порог все еще превышает 10, текущий будет быть ограниченным. .

результат операции:

image.png

image.png

3. Ограничение тока кластера

После стольких разговоров я наконец добрался до сути集群限流план, в秒杀系统При проектировании мы говорили о том, что многие сценарии анализируются с одной машиной как частный случай.Если нашу систему нужно расширить, как это сделать хорошо限流方案. Предполагая, что в кластере 10 машин, мы устанавливаем порог ограничения тока для одной машины для каждой машины как 10 QPS, в идеале порог ограничения тока всего кластера равен 100 QPS. Однако на практике трафик к каждой машине может быть不均匀, что приведет к тому, что некоторые машины будут ограничивать ток до того, как будет достигнута общая сумма. Поэтому, если вы полагаетесь только на автономное измерение, чтобы ограничить его, вы не сможете精确ограничить общий поток. а также集群流控Общее количество вызовов всего кластера можно точно контролировать в сочетании с单机限流兜底, может лучше воспроизвести эффект управления потоком.

Представьте основные роли ограничения тока кластера:

  • Token Client: клиент управления потоком кластера, который используется для запроса токенов с сервера токенов, которому он принадлежит. Сервер ограничения тока кластера вернет результат клиенту, чтобы решить, ограничивать ли ток.
  • Token Server: то есть сервер управления потоком кластера, который обрабатывает запрос от Token Client и решает, следует ли выдавать токен (разрешено ли его прохождение) в соответствии с настроенными правилами кластера.

Структурная схема во встроенном режиме:

image.png

Структурная схема в автономном режиме:

image.png

内嵌模式, то есть операция выдачи Токена, одну из которых совершает один из экземпляров, а другие Клиенты получают разрешение на доступ, запрашивая Сервер.

独立模式, то есть он запускается как независимый процесс сервера токенов, развертывается независимо и имеет хорошую изоляцию, но требует дополнительных операций развертывания.

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

image.png

image.png

3.2. Откройте сервис Alibaba Cloud AHAS

Здесь есть официальные вступительные документы, поэтому я не буду вдаваться в подробности.адрес документа

Найдено в App Guard здесьLincense, а затем добавьте параметры запуска:

-Dserver.port=8092 -Dproject.name=jaycekon-sentinel -Dahas.license=d1e21b0c8f2e4d87b5ac460b118dc58d -Dcsp.sentinel.log.use.pid=true

image.png

Поскольку мы хотим запускать несколько экземпляров локально, нам нужно изменить несколько портов службы:

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

После генерации трафика доступа вы можете увидеть статус соединения машины на панели инструментов:

http://localhost:8092/index

image.png

3.3 Конфигурация правила управления потоком кластера

image.png

Здесь есть два понятия:

  • Порог кластера: относится к общему количеству посещений, которые может пройти наш кластер, которые могут быть распределены неравномерно (чтобы избежать ограничений на ошибки одной машины).
  • Устаревшая одиночная машина: когда истекает время доступа к серверу токенов, то есть когда токен не может быть получен с удаленного конца, возвращается к текущему ограничению для одной машины.

Ограничение тестового тока, только доступhttp://localhost:8092/index

Через ручную кисть (скорость руки слишком высока~) достигается критическое значение ограничения тока, и тогда общий предел тока соответствует нашим ожиданиям.

image.png

Ухудшенная одиночная машина

В управлении потоком кластера есть время ожидания запроса токена,ClientпроситьServer, затем возвращает результат данных. Весь процесс будет трудоемким для сетевых запросов.В приведенном выше тестовом процессе я увеличил время ожидания, и я могу получить токен для каждого запроса.Изменив время ожидания запроса, запускается деградация.单机限流.

image.png

результат операции:

image.png

3.4, Преобразование роли сервера

Во встроенном режиме через HTTP API роль преобразуется вServerилиclient

http://<ip>:<port>/setClusterMode?mode=<xxx>

где режим0представляет клиента,1представляет сервер,-1Представляет закрытый. Обратите внимание, что на стороне приложения необходимо ввести соответствующие зависимости клиента или сервера ограничения тока кластера.

В автономном режиме мы можем напрямую создать соответствующийClusterTokenServerэкземпляр и передать в основную функциюstartспособ запуска Token Server.

Страж взорван

существует秒杀系统В случае , полная ссылка может содержать下订单,支付а также物流对接Дождитесь нескольких сервисов (на самом деле больше). В полной ссылке каждая система взаимодействует в виде rpc/http, На приведенной ниже схеме связи, если пользователь выбирает способ оплаты, есть延时过高,服务不稳定,или服务异常В других случаях вся ссылка не может быть завершена. Конечным результатом является то, что пользователь явно схватил его, но не смог оплатить, что привело к потере заказа.

image.png

Современные микросервисные архитектуры分布式, очень многие服务сочинение. Различные сервисы звонят друг другу, образуя комплекс调用链路. Вышеупомянутые проблемы будут иметь увеличительный эффект в вызове ссылки. кольцо в сложном звене不稳定, может быть层层级联, что в итоге приводит к整个链路недоступны. Поэтому нам нужноСлабозависимые сервисные вызовыВыполните понижение версии предохранителя, временно отключите нестабильные вызовы,避免局部不稳定因素导致整体的雪崩.熔断降级как средство самозащиты, обычно客户端(调用端)настроить.

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秒, будет следовать стратегии перехода на более раннюю версию и вернется напрямую. Он может хорошо защитить сервер, чтобы избежать слишком большого количества исключений и занять ресурсы компьютера. При этом быстро реагировать на запросы пользователей.image.png

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

image.png

Обратите внимание, не потеряйтесь

Ладно, это все, что касается этой статьи. Каждую неделю я буду обновлять несколько высококачественных интервью с крупными фабриками и статьи, связанные с общими технологическими стеками. Спасибо за возможность видеть это, если эта статья хорошо написана, пожалуйста, попросите три подряд! ! ! Творить не просто, спасибо за поддержку и признание, увидимся в следующей статье!

я九灵, есть детская обувь, которую нужно сообщить, вы можете добавить меня wx,Jayce-K, обратите внимание на общедоступный номер:Java 补习课, осваивайте информацию из первых рук!

Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится!