Наиболее полное объяснение SpringCloudAlibaba 6️⃣ Sentinel (рекомендуемая коллекция)

Микросервисы Spring Cloud
Наиболее полное объяснение SpringCloudAlibaba 6️⃣ Sentinel (рекомендуемая коллекция)

Это 28-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

🌈 Введение в колонку

    Спасибо за чтение, я надеюсь, что это может быть полезно для вас.Если есть какие-либо недостатки в сообщении в блоге, пожалуйста, оставьте сообщение в области комментариев или добавьте меня в личное представление на главной странице, чтобы пообщаться со мной в частном порядке. Я XiaoLin, мальчик, который может писать ошибки и петь рэп, В этой колонке в основном представлено самое распространенное решение для микросервисов, SpringCloudAlibaba, которое будет представлено в компонентах. Адрес столбца: SpringCloudAlibaba.

Восемь, защита трафика: Sentinel

8.1. Проблемы, вызванные высокой степенью параллелизма

В микросервисной архитектуре мы разделяем бизнес на сервисы один за другим, и сервисы могут звонить друг другу.Однако по сетевым причинам или по своим собственным причинам сервисы не могут гарантировать 100% доступность сервисов.Если есть проблема при одиночной услуге будет сетевая задержка при вызове этой службы.Если в это время будет большой наплыв сети, то будет формироваться скопление задач, и в итоге услуга будет парализована.

8.2 Моделирование высокого уровня параллелизма

8.2.1 Написание SentinelController

@RestController
public class SentinelController {

  @RequestMapping("/sentinel1")
  public String sentinel1(){
    //模拟一次网络延时
    try {
      TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return "sentinel1";
  }
  @RequestMapping("/sentinel2")
  public String sentinel2(){
    return "测试高并发下的问题";
  }
}	

8.2.2, количество одновременной модификации Tomcat

  tomcat:
    threads:
      max: 10 #tomcat的最大并发值修改为10,

8.2.3. Используйте стресс-тест для имитации высокого параллелизма

ссылка на скачиваниеjmeter.apache.org/

Измените конфигурацию, поддержите китайский язык

Войдите в каталог bin и измените языковую поддержку в файле jmeter.properties на language=zh_CN.

image-20210505214428132

Затем щелкните jmeter.bat, чтобы запустить программное обеспечение.

image-20210505214459838

Добавить группу потоков

image-20201029120234401

image-20201029124003847

добавить http запрос

image-20201029122851926

image-20210505214830428

доступ

мы идем в гостиhttp://localhost:8082/sentinel2, вы обнаружите, что он вращается по кругу, что является прототипом серверной лавины.

8.3 Лавина серверов

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

Из-за зависимости между службами сбои будут распространяться и вызывать катастрофические серьезные последствия для всей микросервисной системы — это «сбой службы».Лавинный эффект".

Процесс лавины сервера пошагово выглядит следующим образом:

image-20210506110941736

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

Лавины могут возникать по разным причинам, например, из-за неразумного проектирования емкости, медленного отклика определенного метода при высокой степени параллелизма или исчерпания ресурсов определенной машины. Мы не можем полностью предотвратить возникновение лавинных источников, мы можем только сделать достаточную отказоустойчивость, чтобы проблема в одном сервисе не повлияла на нормальную работу других сервисов.

Лавины могут возникать по разным причинам, например, из-за неразумного проектирования емкости, медленного отклика определенного метода при высокой степени параллелизма или исчерпания ресурсов определенной машины. Мы не можем полностью предотвратить возникновение лавинных источников, мы можем только сделать достаточную отказоустойчивость, чтобы проблема в одном сервисе не повлияла на нормальную работу других сервисов. То есть "снег идет, а не лавина".

8.4 Общие решения

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

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

8.4.1 Механизм изоляции

Например, в службе A всего 100 потоков, и теперь служба A может вызывать службу B, службу C и службу D. Когда мы делаем удаленные вызовы службы A, мы назначаем фиксированные потоки разным службам и не будем использовать все потоки. Выделить микрослужбе. Например, вызовите службу B, чтобы выделить 30 потоков, вызовите службу C, чтобы выделить 30 потоков, и вызовите службу D, чтобы выделить 40 потоков. Это изолирует ресурсы, чтобы гарантировать, что даже если нижестоящая служба зависнет, это не будет Поток службы A исчерпан. Например, если служба B зависнет, в это время будет занято не более 30 потоков службы A, а еще есть 70 потоков службы A, которые могут вызвать службу C и службу D.

image-20201029142100450

8.4.2. Механизм тайм-аута

Когда вышестоящая служба вызывает нижестоящую службу, установите максимальное время ответа. Если нижестоящая служба не отвечает по истечении этого времени, запрос будет отключен, а поток будет освобожден.

image-20201029143237828

8.4.3 Механизм ограничения тока

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

image-20201029143206491

8.4.4 Механизм взрывателя

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

Обычно существует три состояния рабочего предохранителя:

  1. Замкнутое состояние прерывателя цепи (закрыто): если служба не неисправна, прерыватель цепи находится в состоянии без каких-либо ограничений на вызов вызывающего абонента.
  2. Открытое состояние предохранителя (Open): последующие вызовы интерфейса службы больше не проходят через сеть, а локальный резервный метод выполняется напрямую.
  3. Половина открытой: попробуйте возобновить вызовы сервисов, позволяют ограничить трафик, чтобы позвонить в службу и контролировать скорость успеха вызова. Если скорость успеха достигает ожидания, это означает, что служба была восстановлена ​​и входит в состояние предохранителя; если скорость успеха все еще очень низкая, он повторно входит в состояние предохранителя.

image-20201029143128555

8.4.5. Механизм перехода на более раннюю версию

Даунгрейд на самом деле предназначен для предоставления восходящего решения для службы.Если служба не может быть вызвана нормально, используется итоговое решение.

image-20201029143456888

8.5 Общие компоненты предохранителей

8.5.1. Хайстрикс

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

8.5.2. Устойчивость4J

Resilicence4J — это очень легкий, простой и хорошо документированный инструмент для предохранителей, который также является альтернативным продуктом, официально рекомендованным Hystrix. Мало того, Resilince4j поддерживает Spring Boot 1.x/2.x, мониторинг также поддерживает интеграцию со многими основными продуктами, такими как prometheus.

8.5.3. Страж

Sentinel — это реализация автоматического выключателя с открытым исходным кодом от Alibaba, которая получила широкое распространение в Alibaba и очень стабильна.

8.6 Стражевой бой

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

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

Sentinel обладает следующими характеристиками:

  1. Богатые сценарии приложений: Sentinel выполнял основные сценарии Double Eleven от Alibaba за последние 10 лет, такие как всплески (то есть контроль всплесков трафика в пределах диапазона, который может выдержать пропускная способность системы), сглаживание пиков сообщений и заполнение промежутков, управление кластерным трафиком. , а также плавкие предохранители в реальном времени ниже по течению Недоступные приложения и т. д.

  2. Полный мониторинг в режиме реального времени: Sentinel предоставляет возможности мониторинга в реальном времени. Через консоль можно увидеть данные второго уровня одной машины, подключенной к приложению, и даже агрегированную работу кластера менее чем из 500 машин.

  3. Обширная экосистема с открытым исходным кодом: Sentinel предоставляет готовые модули интеграции с другими платформами/библиотеками с открытым исходным кодом, такие как интеграция со SpringCloud, Dubbo, gRPC. Вам нужно только ввести соответствующие зависимости и выполнить простую настройку для быстрого доступа к Sentinel.

8.6.2, Компоненты Sentinel

Sentinel разделен на две части:

  1. Базовая библиотека (клиент Java) не зависит ни от какой платформы/библиотеки, может работать во всех средах выполнения Java, а также имеет хорошую поддержку для Dubbo/Spring Cloud и других платформ.
  2. Консоль (Dashboard) разработана на основе Spring Boot и может запускаться сразу после упаковки без дополнительных контейнеров приложений, таких как Tomcat.

8.7 Интеграция Sentinel

Micro Integration Services Sentinel очень прост и требует только добавления Sentinel, на который можно положиться.

8.7.1 Добавление зависимостей

<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

8.7.2, записать контроллер

@RestController
public class SentinelController {

  @RequestMapping("/sentinel1")
  public String sentinel1(){
    //模拟一次网络延时
    try {
      TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return "sentinel1";
  }
  @RequestMapping("/sentinel2")
  public String sentinel2(){
    return "测试高并发下的问题";
  }
}

8.7.3 Установка консоли Sentinel

Загрузите пакет jar

Sentinel предоставляет облегченную консоль, которая предоставляет такие функции, как обнаружение компьютеров, мониторинг ресурсов одного компьютера в реальном времени и управление правилами. Нам нужно идтиЗагрузите пакет jar консоли Sentinel.

Изменить application.yml

spring:
  cloud:
    sentinel: 
      transport: 
        port: 9999 #跟控制台交流的端口,随意指定一个未使用的端口即可 
        dashboard: localhost:8080 # 指定控制台服务的地址

запустить консоль

# 直接使用jar命令启动项目(控制台本身是一个SpringBoot项目) 
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar

тестовое задание

Получите доступ к localhost:8080 через браузер, чтобы войти в консоль (имя пользователя и пароль по умолчанию sentinel/sentinel )

image-20210506114024909

8.7.4, принцип работы консоли

Консоль Sentinel на самом деле является программой, написанной SpringBoot. Нам нужно зарегистрировать нашу микросервисную программу на консоли, то есть указать адрес консоли в микросервисе, а также открыть порт для передачи данных на консоль, консоль также может вызывать микросервис через этот порт. получает различную информацию о микросервисе.

image-20210506113704987

8.8. Реализуйте ограничение тока интерфейса

Нажмите на ссылку точки кластера -> управление потоком

image-20210506114220936

Запишите значение в автономный порог

Введите значение порога для одной машины, указав максимальное количество запросов в секунду.

image-20210506114332147

тестовое задание

После нескольких быстрых посещений вы можете обнаружить, что что-то пошло не так.

image-20210506114408464

8.9, Основные понятия и функции Sentinel

8.9.1 Основные понятия

8.9.1.1 Ресурсы

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

Метод sentinel2 в нашем примере выше — это ресурс.

8.9.1.2 Правила

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

В нашем примере выше правила управления потоком добавляются к sentinel2, ограничивая поток sentinel2.

8.9.2 Важные функции

image-20210506115159276

Основная функция Sentinel отказоустойчива, в основном для следующих трех:

  • управление потоком

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

  • Слияние понижения

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

    Sentinel использует два подхода к этой проблеме:

    • Ограничение по количеству одновременных потоков: Sentinel уменьшает влияние нестабильных ресурсов на другие ресурсы, ограничивая количество одновременных потоков ресурсов. Когда ресурс нестабилен, например, при более длительном времени отклика, прямым воздействием на ресурс является постепенное накопление количества потоков. Когда количество потоков на конкретном ресурсе достигает определенного числа, новые запросы к этому ресурсу отклоняются. Накопленные потоки не продолжают получать запросы, пока не завершат свои задачи.
    • Понижение ресурсов по времени отклика. В дополнение к управлению количеством одновременных потоков Sentinel также может быстро снижать нестабильные ресурсы по времени отклика. Когда время отклика зависимого ресурса слишком велико, любой доступ к ресурсу будет напрямую запрещен и не будет восстановлен до тех пор, пока не пройдет указанное временное окно.
  • Защита от нагрузки на систему

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

    Резюме: нам нужно настроить различные правила для ресурсов Sentinel для реализации различных отказоустойчивых функций.

8.10 Правила управления Sentinel-потоком

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

image-20210506140317192

Имя ресурса: уникальное имя, по умолчанию используется путь запроса, который можно настроить.

Для источника: Укажите, для какого микросервиса ограничить поток.По умолчанию используется значение по умолчанию, что означает, что источник не выделяется и накладываются все ограничения.

Тип порога/порог для одной машины:

  • QPS (запросов в секунду): Когда QPS вызова этого интерфейса достигает порогового значения, выполняется текущее ограничение.
  • Количество потоков: когда количество потоков, вызывающих этот интерфейс, достигает порогового значения, выполняется текущее ограничение.

8.10.1 Ограничение количества потоков

Ранее мы тестировали текущее ограничение QPS, поэтому теперь мы меняем количество потоков на текущее ограничение.

8.10.1.1 Добавление правил управления потоком

image-20210506141529265

8.10.1.2 Новый поток в Jmeter

image-20210506141801025

image-20210506141733911

8.10.1.3 Испытание

image-20210506141941996

8.10.2, режим управления потоком

Нажмите, чтобы установить правила управления потоком вышередактироватькнопку, затем нажмите на страницу редактированияРасширенные опции, вы увидите столбец с режимом управления потоком.

image-20210506142200222

У него есть три режима управления потоком:

  1. Прямое (по умолчанию): Включить ограничение тока, когда интерфейс достигает условия ограничения тока.
  2. Ассоциация: когда связанный ресурс достигает текущего состояния ограничения, включите текущее ограничение [подходит для концессии приложения].
  3. Ссылка: когда ресурс из интерфейса достигает состояния текущего ограничения, включите текущее ограничение

8.10.2.1 Режим управления потоком ассоциации

Связанный режим управления потоком означает, что когда интерфейс, связанный с указанным интерфейсом, достигает состояния ограничения тока, включается ограничение тока на указанном интерфейсе.

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

Когда мы тестируем, мы можем связать ресурс sentinel1.

image-20210506142740700

Мы используем программное обеспечение Jmeter для непрерывной отправки запросов на /sentinel1.Обратите внимание, что количество запросов в секунду должно быть больше 2. Когда мы посещаем /sentinel2, мы обнаруживаем, что ток ограничен.

image-20210506143303102

8.10.2.2, режим управления потоком данных

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

Изменить application.yml

spring:
  cloud:
    sentinel:
      web-context-unify: false

TraceServiceImpl

@Service
@Slf4j
public class TraceServiceImpl {
    @SentinelResource(value = "tranceService")
    public void tranceService(){
        log.info("调用tranceService方法");
    }
}

Добавлен TraceController

@RestController
public class TraceController {
    @Autowired
    private TraceServiceImpl traceService;
    @RequestMapping("/trace1")
    public String trace1(){
        traceService.tranceService();
        return "trace1";
    }
    @RequestMapping("/trace2")
    public String trace2(){
        traceService.tranceService();
        return "trace2";
    }
}

Перезапустите службу заказов и добавьте правила управления потоком ссылок.

image-20210506144520611

тестовое задание

Мы посетили /trace1 и /trace2 и обнаружили, что с /trace2 все в порядке, но ток /trace1 ограничен.

image-20210506144645394

image-20210506144629866

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

  1. Быстрый сбой (по умолчанию): прямой сбой, создание исключения без какой-либо дополнительной обработки — это самый простой эффект.
  2. Разминка: у него будет этап буфера от начального порога до максимального порога QPS, а начальным порогом является максимальный порог QPS. 1/3, а затем медленно увеличивать до максимального порога, который подходит для преобразования внезапного увеличения трафика в постепенное увеличение.
  3. Ожидание в очереди: пусть запросы проходят с равномерной скоростью, порог для одной машины — это количество проходов в секунду, а остальные помещаются в очередь; Установите период ожидания, когда запрос превышает период ожидания и не был обработан, он будет отклонен.

8.11. Правила перехода на более раннюю версию Sentinel

Правило перехода на более раннюю версию заключается в установке понижения версии службы при выполнении условий. Sentinel предлагает три критерия измерения:

  • медленное соотношение коллов: Выберите коэффициент медленных вызовов в качестве порога. Вам необходимо установить разрешенный медленный вызов RT (то есть максимальное время ответа). Если время ответа запроса больше этого значения, он будет считаться медленным вызовом . Когда количество запросов в течение единичной статистической длительности превышает установленное минимальное количество запросов, а доля медленных вызовов превышает пороговое значение, запросы будут автоматически сброшены в течение следующей продолжительности сбрасывания. По истечении времени действия предохранителя предохранитель перейдет в состояние восстановления обнаружения (состояние ПОЛУОТКРЫТИЕ).Если время ответа на следующий запрос меньше установленного медленного вызова RT, предохранитель закончится.Если оно больше, чем установите медленный вызов RT, он снова будет взорван.
  • ненормальная пропорция: когда количество запросов в течение единичной статистической длительности превышает установленное минимальное количество запросов, а доля исключений превышает пороговое значение, запросы будут автоматически сброшены в течение следующей продолжительности сбрасывания. По истечении срока действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние). Пороговый диапазон для отношения аномалий составляет[0.0, 1.0], представляющий 0% - 100%.
  • Количество исключений: когда количество исключений во время статистики устройства превышает пороговое значение, оно автоматически сливается. По истечении срока действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние).

8.11.1 Соотношение медленных коллов

Добавлен FallBackController

@RestController
@Slf4j
public class FallBackController {
    @RequestMapping("/fallBack1")
    public String fallBack1(){
        try {
            log.info("fallBack1执行业务逻辑");
            //模拟业务耗时
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "fallBack1";
    }
}

Добавить правила перехода на более раннюю версию

image-20210506150006903

Приведенная выше конфигурация указывает, что если в течение 1 с поступает [более 1 запроса] и [время ответа > максимальное время отклика] этих запросов [соотношение количества запросов > 10 %], срабатывает предохранитель, и в течение следующих 10 с реальный метод не будет вызываться, и будет напрямую использоваться ухудшенный метод.

Например: максимальное RT=900, пропорциональный порог=0,1, продолжительность предохранителя=10, минимальное количество запросов=10.

  • Случай 1: 20 запросов в течение 1 секунды, и только 10 запросов имеют время ответа > 900 мс, а коэффициент медленных вызовов = 0,5, что приведет к срабатыванию прерывателя цепи.

  • Случай 2: 20 запросов в течение 1 секунды, и только 1 запрос имеет время ответа > 900 мс, а коэффициент медленных вызовов = 0,05, что не приведет к срабатыванию автоматического выключателя.

  • Случай 3: Есть 8 запросов в течение 1 секунды, и только 6 запросов имеют время ответа> 900 мс, и коэффициент медленных вызовов = 0,75, В этом случае автоматический выключатель не сработает, потому что условие минимального количества запросы не выполняются.

    Когда мы делаем эксперимент, мы устанавливаем минимальное количество запросов на 1, потому что сложно отправить два запроса в течение 1 секунды вручную, поэтому для получения эффекта лучше всего установить минимальное количество запросов на 1.

8.11.2 Количество исключений

Добавьте исключение в метод

Добавьте метод fallBack3 в класс FallBackController.java проекта Shop-order-server.

  @RequestMapping("/fallBack3")
  public String fallBack3(String name){
    log.info("fallBack3执行业务逻辑");
    if("xiaolin".equals(name)){
      throw new RuntimeException();
    }
    return "fallBack3";
  }

Настройка правил перехода на более ранние версии

image-20210506150810028

В течение 1 с, если есть [более 3 запросов], если более 2 запросов в запросе являются ненормальными, предохранитель сработает, и продолжительность предохранителя составляет 10 с.

тестовое задание

image-20210506150845623

8.12. Правила точки доступа Sentinel

Горячие точки — это данные, к которым часто обращаются. Во многих случаях мы хотим подсчитать данные Top K с наибольшей частотой доступа в данных точки доступа и ограничить их доступ. Например:

  • Идентификатор продукта — это параметр, который подсчитывает наиболее часто покупаемые идентификаторы продуктов за определенный период времени и накладывает ограничения.
  • Идентификатор пользователя — это параметр для ограничения идентификаторов пользователей, к которым часто обращаются в течение определенного периода времени.

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

Добавлен HotSpotController

Аннотация @SentinelResource должна быть размещена в методе запроса, иначе правило точки доступа будет недействительным.

@RestController
@Slf4j
public class HotSpotController {
    @RequestMapping("/hotSpot1")
    @SentinelResource(value = "hotSpot1")
    public String hotSpot1(Long productId){
        log.info("访问编号为:{}的商品",productId);
        return "hotSpot1";
    }
}

Добавить правило точки доступа

Поскольку у нас есть только один параметр, индекс параметра равен 0.

image-20210506152252494

Посетите /hotSpot1 и измените правило точки доступа.

    После добавления перейдите к правилу хотспота для редактирования правил.Обязательно зайдите в /Hotspot1 перед редактированием, иначе правила параметра не могут быть добавлены.

image-20210506152452142

Добавить правила параметра

image-20210506153033157

image-20210506153054676

тестовое задание

Посещение:http://localhost:8082/hotSpot1?productId=2, как ни заходи, не помогает.

Посещение:http://localhost:8082/hotSpot1?productId=1, который будет понижен после нескольких посещений.

image-20210506153210123

8.13 Правила авторизации Sentinel

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

  1. Если настроен белый список, запрос может быть передан только в том случае, если источник запроса находится в белом списке;
  2. Если настроен черный список, если источник запроса находится в черном списке, то он не пройдет, а остальные запросы пройдут.

Добавьте новый класс инструмента, чтобы определить, как получить источник запроса.

@Component
public class RequestOriginParserDefinition implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        /**
         *  定义从请求的什么地方获取来源信息
         *  比如我们可以要求所有的客户端需要在请求头中携带来源信息
         */
        String serviceName = request.getParameter("serviceName");
        return serviceName;
    }
}

Добавлен AuthController

@RestController
@Slf4j
public class AuthController {
    @RequestMapping("/auth1")
  public String auth1(String serviceName){
    log.info("应用:{},访问接口",serviceName);
    return "auth1";
  }
}

Добавить новые правила

image-20210506155905910

тестовое задание

доступhttp://localhost:8082/auth1?serviceName=pc недоступен

доступhttp://localhost:8082/auth1?serviceName=app можно получить доступ

image-20210506160038198

8.14 Правила системы

Правила защиты системы контролируются входящим трафиком на уровне приложений, а данные приложений отслеживаются по пяти параметрам: общая нагрузка, RT, входящее количество запросов в секунду, использование ЦП и количество потоков на одном компьютере, так что система может работать с максимальной пропускной способностью в максимально возможной степени Обеспечьте общую стабильность системы.

Правило защиты системы должно применять общее измерение, а не измерение ресурсов, и действовать только на входящий трафик (трафик к приложению).

  • Загрузка (действительно только для Linux/Unix-подобных машин): Запускается, когда загрузка системы1 превышает пороговое значение, а текущее количество одновременных потоков в системе превышает емкость системы.
  • Защита системы. Емкость системы рассчитывается исходя из maxQps системы * minRt. Эталонное значение параметра обычно равно ядрам ЦП * 2,5.
  • RT: защита системы срабатывает, когда среднее значение RT всего входящего трафика на одном компьютере достигает порогового значения в миллисекундах.
  • Количество потоков: когда количество одновременных потоков всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы.
  • Ingress QPS: Когда количество запросов в секунду всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы.
  • Использование ЦП: Когда использование ЦП для всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы.

8.15, пользовательский ненормальный возврат

Общие исключения условно делятся на следующие категории:

  1. FlowException: Текущее ограничение ограничения.
  2. DegradeException: исключение деградации.
  3. ParamFlowException: исключение ограничения потока параметров.
  4. AuthorityException: Исключение авторизации.
  5. SystemBlockException: ненормальная загрузка системы.

Определите класс обработки возврата исключений в проекте Shop-order-server.

@Component
public class ExceptionHandlerPage implements BlockExceptionHandler {
  @Override
  public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
    response.setContentType("application/json;charset=utf-8");
    ResultData data = null;
    if (e instanceof FlowException) {
      data = new ResultData(-1, "接口被限流了");
    } else if (e instanceof DegradeException) {
      data = new ResultData(-2, "接口被降级了");
    }else if (e instanceof ParamFlowException) {
      data = new ResultData(-3, "参数限流异常");
    }else if (e instanceof AuthorityException) {
      data = new ResultData(-4, "授权异常");
    }else if (e instanceof SystemBlockException) {
      data = new ResultData(-5, "接口被降级了...");
    }
    response.getWriter().write(JSON.toJSONString(data));
  }
}
@Data
@AllArgsConstructor//全参构造
@NoArgsConstructor
//无参构造
class ResultData {
  private int code;
  private String message;
}

image-20210506171904602

8.16. Использование @SentinelResource

@SentinelResource используется для определения ресурсов и предоставления дополнительной обработки исключений и резервных элементов конфигурации. Основные параметры следующие:

Атрибуты эффект
value имя ресурса, обязательное (не может быть пустым)
entryType Тип входа, необязательный (по умолчаниюEntryType.OUT)
blockHandler/blockHandlerClass blockHandlerСоответствующая обработкаBlockExceptionИмя функции, необязательно. Область доступа к функции blockHandler должна бытьpublic, тип возвращаемого значения должен соответствовать исходному методу, тип параметра должен соответствовать исходному методу, а в конце добавляется дополнительный параметр, типBlockException. Функция blockHandler должна быть в том же классе, что и исходный метод по умолчанию. Если вы хотите использовать функции других классов, вы можете указатьblockHandlerClassдля соответствующего классаClassОбъект, обратите внимание, что соответствующая функция должна быть статической функцией, иначе она не может быть разрешена.
fallback/fallbackClass Имя функции Foxback, варианты для обеспечения логики обработки отставания при броске исключения. Функция Foxback может нацелить все типы исключений (кромеexceptionsToIgnoreИсключенные в нем типы исключений) обрабатываются. Требования к сигнатуре и местоположению резервной функции:
1. Тип возвращаемого значения должен совпадать с типом возвращаемого значения исходной функции;
2. Список параметров метода должен быть таким же, как и исходная функция, или вы можете добавить еще одинThrowableПараметр типа используется для получения соответствующего исключения.
3. Резервная функция должна быть в том же классе, что и исходный метод по умолчанию. Если вы хотите использовать функции других классов, вы можете указатьfallbackClassдля соответствующего классаClassОбъект, обратите внимание, что соответствующая функция должна быть статической функцией, иначе она не может быть разрешена.
defaultFallback Имя функции Fanceback по умолчанию, необязательно, обычно используется для общей логики Fackback (I.E. Может использоваться для многих услуг или методов). Функция отклонения по умолчанию может использоваться для всех типов исключений (кромеexceptionsToIgnoreИсключенные в нем типы исключений) обрабатываются. Если настроены и резервный вариант, и defaultFallback, вступит в силу только резервный вариант. Сигнатура функции defaultFallback требует:
1. Тип возвращаемого значения должен совпадать с типом возвращаемого значения исходной функции;
2. Список параметров метода должен быть пустым, или вы можете добавить еще одинThrowableПараметр типа используется для получения соответствующего исключения.
3. Функция defaultFallback по умолчанию должна принадлежать тому же классу, что и исходный метод. Если вы хотите использовать функции других классов, вы можете указатьfallbackClassдля соответствующего классаClassОбъект, обратите внимание, что соответствующая функция должна быть статической функцией, иначе она не может быть разрешена.
exceptionsToIgnore Он используется для указания исключаемых исключений.Они не будут учитываться в статистике исключений и не будут включены в резервную логику, а будут генерироваться как есть.

Метод, который будет выполняться сразу после текущего ограничения или перехода на более раннюю версию.

image-20210506173330519

8.17, Постоянство правила Sentinel

По предыдущему объяснению мы уже знаем, что для каждого клиента Sentinel через Dashboard можно задавать различные правила, но тут есть проблема, то есть эти правила по умолчанию хранятся в памяти, которая крайне нестабильна, поэтому необходимо установить правила для каждого клиента Sentinel, его постоянство.

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

image-20201030135911029

Сначала консоль Sentinel передает правила клиенту через API и обновляет их в памяти, а затем зарегистрированный источник данных записи сохраняет новые правила в локальный файл.

написать класс обработки

public class FilePersistence implements InitFunc {
    @Value("${spring.application.name}")
    private String appcationName;

    @Override
    public void init() throws Exception {
        String ruleDir = System.getProperty("user.home") + "/sentinel-rules/" + appcationName;
        String flowRulePath = ruleDir + "/flow-rule.json";
        String degradeRulePath = ruleDir + "/degrade-rule.json";
        String systemRulePath = ruleDir + "/system-rule.json";
        String authorityRulePath = ruleDir + "/authority-rule.json";
        String paramFlowRulePath = ruleDir + "/param-flow-rule.json";

        this.mkdirIfNotExits(ruleDir);
        this.createFileIfNotExits(flowRulePath);
        this.createFileIfNotExits(degradeRulePath);
        this.createFileIfNotExits(systemRulePath);
        this.createFileIfNotExits(authorityRulePath);
        this.createFileIfNotExits(paramFlowRulePath);

        // 流控规则
        ReadableDataSource<String, List<FlowRule>> flowRuleRDS = new FileRefreshableDataSource<>(
                flowRulePath,
                flowRuleListParser
        );
        FlowRuleManager.register2Property(flowRuleRDS.getProperty());
        WritableDataSource<List<FlowRule>> flowRuleWDS = new FileWritableDataSource<>(
                flowRulePath,
                this::encodeJson
        );
        WritableDataSourceRegistry.registerFlowDataSource(flowRuleWDS);

        // 降级规则
        ReadableDataSource<String, List<DegradeRule>> degradeRuleRDS = new FileRefreshableDataSource<>(
                degradeRulePath,
                degradeRuleListParser
        );
        DegradeRuleManager.register2Property(degradeRuleRDS.getProperty());
        WritableDataSource<List<DegradeRule>> degradeRuleWDS = new FileWritableDataSource<>(
                degradeRulePath,
                this::encodeJson
        );
        WritableDataSourceRegistry.registerDegradeDataSource(degradeRuleWDS);

        // 系统规则
        ReadableDataSource<String, List<SystemRule>> systemRuleRDS = new FileRefreshableDataSource<>(
                systemRulePath,
                systemRuleListParser
        );
        SystemRuleManager.register2Property(systemRuleRDS.getProperty());
        WritableDataSource<List<SystemRule>> systemRuleWDS = new FileWritableDataSource<>(
                systemRulePath,
                this::encodeJson
        );
        WritableDataSourceRegistry.registerSystemDataSource(systemRuleWDS);

        // 授权规则
        ReadableDataSource<String, List<AuthorityRule>> authorityRuleRDS = new FileRefreshableDataSource<>(
                authorityRulePath,
                authorityRuleListParser
        );
        AuthorityRuleManager.register2Property(authorityRuleRDS.getProperty());
        WritableDataSource<List<AuthorityRule>> authorityRuleWDS = new FileWritableDataSource<>(
                authorityRulePath,
                this::encodeJson
        );
        WritableDataSourceRegistry.registerAuthorityDataSource(authorityRuleWDS);

        // 热点参数规则
        ReadableDataSource<String, List<ParamFlowRule>> paramFlowRuleRDS = new FileRefreshableDataSource<>(
                paramFlowRulePath,
                paramFlowRuleListParser
        );
        ParamFlowRuleManager.register2Property(paramFlowRuleRDS.getProperty());
        WritableDataSource<List<ParamFlowRule>> paramFlowRuleWDS = new FileWritableDataSource<>(
                paramFlowRulePath,
                this::encodeJson
        );
        ModifyParamFlowRulesCommandHandler.setWritableDataSource(paramFlowRuleWDS);
    }

    private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(
            source,
            new TypeReference<List<FlowRule>>() {
            }
    );
    private Converter<String, List<DegradeRule>> degradeRuleListParser = source -> JSON.parseObject(
            source,
            new TypeReference<List<DegradeRule>>() {
            }
    );
    private Converter<String, List<SystemRule>> systemRuleListParser = source -> JSON.parseObject(
            source,
            new TypeReference<List<SystemRule>>() {
            }
    );

    private Converter<String, List<AuthorityRule>> authorityRuleListParser = source -> JSON.parseObject(
            source,
            new TypeReference<List<AuthorityRule>>() {
            }
    );

    private Converter<String, List<ParamFlowRule>> paramFlowRuleListParser = source -> JSON.parseObject(
            source,
            new TypeReference<List<ParamFlowRule>>() {
            }
    );

    private void mkdirIfNotExits(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    private void createFileIfNotExits(String filePath) throws IOException {
        File file = new File(filePath);
        if (!file.exists()) {
            file.createNewFile();
        }
    }
    private <T> String encodeJson(T t) {
        return JSON.toJSONString(t);
    }
}

После этого мы перезапустили и обнаружили, что правила конфигурации все еще существуют, что указывает на то, что сохранение прошло успешно!