Spring Cloud Alibaba Actual Combat (3) Sentinel

Java Spring Cloud
Spring Cloud Alibaba Actual Combat (3) Sentinel

Учебная комната Cabbage Java охватывает основные знания

Spring Cloud Alibaba Actual Combat (1) Подготовка
Spring Cloud Alibaba Actual Combat (2) Nacos
Spring Cloud Alibaba Actual Combat (3) Sentinel
Весеннее облако Alibaba бой (4) Oauth2
Spring Cloud Alibaba Actual Combat (5) Zuul
Реальные бои Spring Cloud Alibaba (6) Статьи RocketMQ
Spring Cloud Alibaba Actual Combat (7) Seata
Spring Cloud Alibaba Actual Combat (8) SkyWalking

Адрес проекта на GitHub:GitHub.com/D2C-CAI/Хайер…

Sentinel Instruction

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

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

  • Богатые сценарии приложений: Sentinel за последние 10 лет реализовал основные сценарии Double Eleven от Alibaba, такие как всплески (т. , предохранитель в реальном времени ниже по течению Недоступные приложения и т. д.
  • Полный мониторинг в режиме реального времени: Sentinel также предоставляет функции мониторинга в реальном времени. В консоли можно увидеть данные второго уровня отдельной машины, подключенной к приложению, и даже агрегированную работу кластера с масштабом менее 500.
  • Обширная экосистема с открытым исходным кодом: Sentinel предоставляет готовые модули интеграции с другими платформами/библиотеками с открытым исходным кодом, такие как интеграция с Spring Cloud, Dubbo, gRPC. Вам нужно только ввести соответствующие зависимости и выполнить простую настройку для быстрого доступа к Sentinel.
  • Полная точка расширения SPI: Sentinel предоставляет простой в использовании и полный интерфейс расширения SPI. Вы можете быстро настроить логику, реализовав интерфейсы расширения. Например, управление пользовательскими правилами, адаптация источников динамических данных и т. д.

2. Быстро соберите Sentinel 1.8 с помощью Docker

  1. Сначала загрузите файл sentinel-dashboard-1.8.0.jar с github.;

Официальный адрес загрузки:GitHub.com/alibaba/s ru…

  1. Выберите и создайте каталог на сервере Linux;
mkdir sentinel-docker
  1. Перейдите в каталог sentinel-docker и поместите загруженный sentinel-dashboard-1.8.0.jar в этот каталог.;
cd sentinel-docker

  1. Создайте новый Dockerfile со следующим содержимым:
FROM openjdk:8

ENV SENTINEL_HOME /opt/sentinel-dashboard

RUN mkdir -p ${SENTINEL_HOME}

COPY sentinel-dashboard-1.8.0.jar ${SENTINEL_HOME}

RUN chmod -R +x ${SENTINEL_HOME}/*jar

WORKDIR ${SENTINEL_HOME}

EXPOSE 8858

EXPOSE 8719

CMD java ${JAVA_OPS} -jar sentinel-dashboard-1.8.0.jar
  1. Создайте новый файл sentinel-dashboard.yaml со следующим содержимым.:
version: '2'

services:
  sentinel-dashboard:
    image: sentinel-dashboard:1.8.0
    container_name: sentinel-dashboard
    restart: on-failure
    build:
      context: .
      dockerfile: Dockerfile
    ports:
    - "8858:8858"
    - "8719:8719"
    environment:
      - JAVA_OPS=-Dserver.port=8858
  1. Выполните сценарий sentinel-dashboard.yaml, чтобы запустить контейнер.:
docker-compose -f sentinel-dashboard.yaml up
  1. Войдите в консоль Sentinel, имя пользователя по умолчанию — sentinel, а пароль — sentinel.:
http://(安装Sentinel机器的IP):8858

В консоли Sentinel на данный момент ничего нет, как ей пользоваться? Здесь мы не торопимся, давайте сначала настроим клиент проекта Spring Boot.

3. Представьте клиент Sentinel в проекте Spring

  1. Добавить зависимости файла pom:
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
  1. Добавьте конфигурацию в application.yml:
server:
  port: 10801
  servlet:
    context-path: /api/member
    
spring:
  application:
    name: member-service
    
  cloud:
    sentinel:
      eager: true
      transport:
        port: 8719
        dashboard: (安装Sentinel机器的IP):8858
  1. Создайте новый класс Service и добавьте метод, добавьте аннотацию @SentinelResource:
@Service
public class MemberService {

    @SentinelResource(value = "sayHello", fallback = "sayHelloFail")
    public String sayHello() {
        return "Hello, Member! ";
    }

    public String sayHelloFail() {
        return "I am sorry, Member! ";
    }

}
  1. Создайте новый класс контроллера для вызова методов этой службы.:
@RestController
@RequestMapping
public class HelloController {

    @Resource
    private MemberService memberService;

    @RequestMapping("/service")
    public String service() {
        return memberService.sayHello();
    }

}
  1. Запустите проект Spring, затем перейдите в консоль, и вы обнаружите, что список проектов появился, а данных для мониторинга в реальном времени нет.:
http://(安装Sentinel机器的IP):8858

Уведомление: Внимательные студенты обнаружили, что порт здесь не 8719, потому что на моей машине открыто несколько других служб, в конфигурации тоже порт 8719, Sentinel автоматически определит конфликт, и последует за(номер порта + 1)Правила автоматически назначают порты.

  1. Посетите запрос в /api/member/service и посмотрите результат:
#### 请求测试
GET http://localhost:10801/api/member/service
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

Hello, Member! 
  1. Несколько раз обращались к запросу /api/member/service и обнаружили, что на панели мониторинга в реальном времени появляются данные:

4. Консоль Sentinel взаимодействует с реальным проектом

4.1. Попытка ограничить пути доступа

  1. Открыть "ссылка на точку кластераменю, попробуйте ограничить путь доступа:

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

Тип порога

  • QPS (запросов в секунду): количество запросов в секунду, то есть сколько запросов обрабатывается сервером за одну секунду.
  • Потоки: когда количество потоков, вызывающих API, достигает порогового значения, ограничьте ток.

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

  • непосредственный: Когда API достигает состояния ограничения тока, ток напрямую ограничивается.
  • ассоциация: Ограничьте себя, когда связанный ресурс достигнет порога. Интерфейс A связан с интерфейсом B. Когда интерфейс B достигает порогового значения, текущее ограничение интерфейса A используется для защиты интерфейса B. Например, интерфейс оплаты и интерфейс заказа, когда интерфейс оплаты достигает порога, интерфейс заказа будет ограничивать ток, что играет роль в защите интерфейса оплаты.
  • связь: Записывать только трафик по указанной ссылке (трафик, поступающий из указанного ресурса записи ресурса, если он достигает порогового значения, трафик будет ограничен).

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

  • провалиться быстро: метод управления потоком по умолчанию. Когда количество запросов в секунду превышает пороговое значение любого правила, новый запрос будет немедленно отклонен путем создания исключения FlowException. Этот метод подходит, когда производительность системы точно известна, например, когда точный уровень воды в системе определяется путем измерения давления.
  • Warm up: Режим предварительного прогрева/холодного пуска. Когда система находится на низком уровне воды в течение длительного времени, когда поток внезапно увеличивается, прямое подтягивание системы к высокому уровню воды может мгновенно привести к перегрузке системы. Благодаря «холодному запуску» проходящий поток медленно увеличивается и постепенно увеличивается до верхнего предела порога в течение определенного периода времени, давая холодной системе время прогрева, чтобы избежать перегрузки холодной системы.
  • Жди в очереди: Будет строго контролировать интервал времени прохождения запроса, то есть пусть запрос проходит с равномерной скоростью, что соответствует алгоритму дырявого ведра.
  1. я установилЗначение QPS равно 1, прямой API, быстрый отказ,такСделайте несколько запросов к /api/member/service в течение 1 секунды:
#### 请求测试
GET http://localhost:10801/api/member/service
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

Blocked by Sentinel (flow limiting)

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

4.2. Попытка ограничить поток служебных ресурсов

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

  1. Открыть "ссылка на точку кластераменю, попробуйте ограничить ток сервисных ресурсов:

QPS (запросов в секунду): количество запросов в секунду, то есть сколько запросов обрабатывается сервером за одну секунду.

  1. Значение QPS, которое я установил, равно 1, прямой API, быстрый сбой, поэтому вызывайте memberService.sayHello() несколько раз в течение 1 секунды.:
#### 请求测试
GET http://localhost:10801/api/member/service
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

I am sorry, Member!

Почему нет ошибки в результате? Может нормально вернуться? Внимательные одноклассники обнаружат, что это все из-за того, что я установил метод понижения версии sayHelloFail().:

    @SentinelResource(value = "sayHello", fallback = "sayHelloFail")
    public String sayHello() {
        return "Hello, Member! ";
    }

    public String sayHelloFail() {
        return "I am sorry, Member! ";
    }

4.3. Попытка слить нештатную службу

  1. Открыть "ссылка на точку кластераменю, попробуйте перепрошить нештатную службу:

стратегия автоматического выключателя

  • медленное соотношение коллов: Выберите коэффициент медленных вызовов в качестве порога. Вам необходимо установить разрешенный медленный вызов RT (то есть максимальное время ответа). Если время ответа запроса больше этого значения, он будет считаться медленным вызовом . Когда количество запросов в единичной статистической продолжительности (statIntervalMs) превышает установленное минимальное количество запросов, а доля медленных вызовов превышает пороговое значение, запросы будут автоматически сброшены в течение следующего периода регулирования. По истечении времени действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние). Если время ответа на следующий запрос меньше установленного медленного вызова RT, предохранитель прекращает работу. Если оно больше, чем установите медленный вызов RT, он снова будет взорван.
  • ненормальная пропорция: когда количество запросов на единицу статистической длительности (statIntervalMs) превышает установленное минимальное количество запросов, а доля исключений превышает пороговое значение, запросы будут автоматически сброшены в течение следующего сброшенного периода. По истечении срока действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние). Пороговый диапазон для отношения аномалий составляет [0,0, 1,0], что соответствует 0–100 %.
  • Количество исключений: Когда количество исключений во время статистики устройства превышает пороговое значение, оно автоматически сливается. По истечении срока действия предохранителя предохранитель переходит в состояние восстановления обнаружения (полуоткрытое состояние).

  1. Делаем небольшую модификацию кода и перезапускаем проект:
    @RequestMapping("/service")
    public String service(String name) throws InterruptedException {
        TimeUnit.MILLISECONDS.sleep(400);
        return memberService.sayHello(name);
    }
  1. я установилМаксимально допустимое время отклика — 200 мс, отношение — 50 %, код принудительно задерживает 400 мс, то есть 100 % тайм-аут, и установлено, что 50 % из 5 запросов в единицу времени будут разорваны.,такБолее 5 запросов к /api/member/service за 1 секунду:
#### 请求测试
GET http://localhost:10801/api/member/service
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

Blocked by Sentinel (flow limiting)

Получается, что Sentinel ограничил доступ, а аварийный сервис сгорел.

  1. я установилВремя плавления 2 секунды,2 запроса к /api/member/service через 2 секунды:
#### 请求测试
GET http://localhost:10801/api/member/service
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

Hello, Member!
Blocked by Sentinel (flow limiting)

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

Sentinel перейдет в состояние восстановления обнаружения (состояние HALF-OPEN) после того, как пройдёт длительность фьюза.Если время ответа на следующий запрос меньше установленного медленного вызова RT, фьюз закончится, а если больше установленного медленно звоните RT, он снова будет взорван.

  1. похожийГлава 4.2В случае, если я форсирую задержку в 400 мс в коде для записи в службу ресурса:
    @SentinelResource(value = "sayHello", fallback = "sayHelloFail")
    public String sayHello(String name) throws InterruptedException {
        TimeUnit.MILLISECONDS.sleep(400);
        return "Hello, Member! " + name;
    }

    public String sayHelloFail(String name) {
        return "I am sorry, Member! " + name;
    }

Те же настройки, тот же запрос, более 5 запросов к /api/member/service за 1 секунду:

#### 请求测试
GET http://localhost:10801/api/member/service
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

I am sorry, Member!

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

4.4. Попытка ограничить текущие параметры хотспота

  • Горячие точки — это данные, к которым часто обращаются;
  • Например, количество запросов в секунду интерфейса продукта ограничено 100, а в один прекрасный день количество запросов в секунду запроса с идентификатором продукта второго уничтожения ограничено до 50, так что 50 запросов в секунду все еще можно использовать для доступа к другим продуктам. ;
  1. Сначала немного изменим код, добавимЗапросить имя параметра** и перезапустить проект**:
@Service
public class MemberService {

    @SentinelResource(value = "sayHello", fallback = "sayHelloFail")
    public String sayHello(String name) {
        return "Hello, Member! " + name;
    }

    public String sayHelloFail(String name) {
        return "I am sorry, Member! " + name;
    }

}
@RestController
@RequestMapping
public class HelloController {

    @Resource
    private MemberService memberService;

    @RequestMapping("/service")
    public String service(String name) {
        return memberService.sayHello(name);
    }

}
  1. открыл"Правила точки доступа», добавьте правило точки доступа с именем ресурса «sayHello».:

  • индекс параметраУстановите в 0, что означает первый параметр запроса
  • Автономный порогнабор 10,Длительность окна статистикинабор 1
  • значение параметраустановить струну байкай,Порог ограничения токанабор 1

В общем, это тот же запрос /api/member/service?name=xxx, когда параметр передается в baicai, контроль исключений QPS равен 1, а любое значение, переданное в параметре, контроль QPS равен 10.

  1. Попробуйте выполнить несколько запросов к /api/member/service?name=baicai в течение 1 секунды.:
#### 请求测试
GET http://localhost:10801/api/member/service?name=baicai
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

I am sorry, Member! baicai
  1. Попробуйте сделать несколько запросов к /api/member/service?name=luobo в течение 1 секунды.:
#### 请求测试
GET http://localhost:10801/api/member/service?name=luobo
Accept: */*
Cache-Control: no-cache

Запрос получает результат:

Hello, Member! luobo

Получается, что при параметре baicai доступ ограничивается при QPS больше 1, ноДаже если установлен метод понижения sayHelloFail(), результат все равно может быть возвращен в обычном режиме..

4.5 Попробуйте управление черным и белым списками

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

Результаты теста аналогичны приведенным выше, поэтому я не буду подробно останавливаться на этом. Увидев это, покорили ли вас мощность и простота использования Sentinel?

Spring Cloud Alibaba Actual Combat (1) Подготовка
Spring Cloud Alibaba Actual Combat (2) Nacos
Spring Cloud Alibaba Actual Combat (3) Sentinel
Весеннее облако Alibaba бой (4) Oauth2
Spring Cloud Alibaba Actual Combat (5) Zuul
Реальные бои Spring Cloud Alibaba (6) Статьи RocketMQ
Spring Cloud Alibaba Actual Combat (7) Seata
Spring Cloud Alibaba Actual Combat (8) SkyWalking

Адрес проекта на GitHub:GitHub.com/D2C-CAI/Хайер…