SpringCloud Alibaba Sentinel реализует автоматический выключатель и ограничение тока
Официальный сайт:GitHub.com/Alibaba/Сен…
Китайский сайт:GitHub.com/alibaba/s ru…
Что такое Сентинел?
С ростом популярности микросервисов стабильность между сервисами и сервисами становится все более важной. Sentinel использует трафик в качестве точки входа для защиты стабильности сервисов от нескольких измерений, таких как управление трафиком, переход на более раннюю версию автоматического выключателя и защита системной нагрузки.Sentinel обладает следующими характеристиками:
- Разнообразные сценарии приложений: за последние 10 лет Sentinel реализовал основные сценарии Double Eleven от Alibaba, такие как всплески (т. управление кластерным трафиком, предохранители в режиме реального времени, нисходящие недоступные приложения и т. д.
- Полный мониторинг в реальном времени: Sentinel также предоставляет функции мониторинга в реальном времени. В консоли можно увидеть данные второго уровня отдельной машины, подключенной к приложению, и даже агрегированную работу кластера с масштабом менее 500.
- Обширная экосистема с открытым исходным кодом: Sentinel предоставляет готовые модули интеграции с другими платформами/библиотеками с открытым исходным кодом, такие как интеграция с Spring Cloud, Dubbo, gRPC. Вам нужно только ввести соответствующие зависимости и выполнить простую настройку для быстрого доступа к Sentinel.
- Полные точки расширения SPI: Sentinel предоставляет простые в использовании и полные интерфейсы расширения SPI. Вы можете быстро настроить логику, реализовав интерфейсы расширения. Например, управление пользовательскими правилами, адаптация источников динамических данных и т. д.
Основные возможности Sentinel:
Sentinel разделен на две части:
- Базовая библиотека (Java-клиент) не зависит ни от какой платформы/библиотеки, может работать во всех средах выполнения Java, а также имеет хорошую поддержку таких платформ, как Dubbo/Spring Cloud.
- Консоль (Dashboard) разработана на основе Spring Boot и может запускаться сразу после упаковки без дополнительных контейнеров приложений, таких как Tomcat.
Докер устанавливает Sentinel
#拉取sentinel镜像
docker pull bladex/sentinel-dashboard
#运行sentinel(docker里的sentinel是8858端口)
docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard
#把nacos和mysql也启动起来
доступ:http://120.92.164.250:8858/#/login
И учетная запись, и пароль защищены
демо
- Новый модуль cloudalibaba-sentinel-service8401
- pom
<dependencies>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud ailibaba sentinel-datasource-nacos 持久化需要用到-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!-- SpringCloud ailibaba sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
- yml
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinal-service
cloud:
nacos:
discovery:
#Nacos服务注册中心地址(改成自己的服务器ip地址,本地用localhost)
server-addr: 120.92.164.250:8848
sentinel:
transport:
#配置Sentin dashboard地址(改成自己的服务器ip地址,本地用localhost)
dashboard: 120.92.164.250:8858
# 默认8719端口,假如被占用了会自动从8719端口+1进行扫描,直到找到未被占用的 端口
port: 8719
management:
endpoints:
web:
exposure:
include: '*'
- стартовый класс
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401 {
public static void main(String[] args) {
SpringApplication.run(MainApp8401.class, args);
}
}
- Протестируйте, запустите 8401, а затем обновите фоновую страницу Sentinel (поскольку Sentinel использует стратегию отложенной загрузки, ему необходимо вызвать службу, прежде чем она будет отображаться в фоновом режиме).
Введите в браузере соответственно, а затем обновите фоновую страницу дозорного:
вид правила
Все правила Sentinel можно динамически запрашивать и изменять в памяти, и они вступают в силу сразу после изменения. В то же время Sentinel также предоставляет соответствующие API для настройки собственных правил и политик.
Sentinel поддерживает следующие типы правил: правила управления потоком, правила перехода на более раннюю версию автоматического выключателя, правила защиты системы, правила управления доступом к источнику и правила параметров точки доступа.
Правила управления потоком (FlowRule)
Один и тот же ресурс может иметь несколько текущих ограничивающих правил одновременно, и они будут последовательно проверяться при проверке правил.
Если количество запросов в секунду превышает 1, ток будет регулироваться.
Тип порога
Разница между QPS и количеством потоков
: QPS (количество запросов в секунду): когда количество запросов в секунду, вызывающих API, достигает порогового значения, выполняется текущее ограничение. : Количество потоков: когда количество потоков, вызывающих API, достигает порогового значения, выполняется текущее ограничение.
QPS напрямую блокируется снаружи, а количество потоков - это сколько потоков обрабатывается.После того, как он будет введен, запрос будет обработан, если какой-либо поток простаивает, и ток будет ограничен, если нет состояния простоя.
Управление потоком QPS
прямой : провал быстро
Ассоциация: когда связанный ресурс достигает порога, он ограничивает себя, а когда ресурс B, связанный с A, достигает порога, он ограничивает поток самого A.
Ссылка: Sentinel позволяет ограничить поток ресурсов только на основе статистики определенной записи.
-
Когда QPS превышает определенный порог, принимаются меры по управлению потоком. Эффекты управления потоком включают следующее: прямое отклонение, разогрев и равномерная организация очереди. Соответствует полю controlBehavior в FlowRule.
-
Примечание. Если используется эффект управления потоком, отличный от прямого запрета, стратегия реляционного регулирования вызовов игнорируется.
полный отказ
- Метод прямого отклонения (RuleConstant.CONTROL_BEHAVIOR_DEFAULT) является методом управления потоком по умолчанию. Когда количество запросов в секунду превышает пороговое значение любого правила, новый запрос будет немедленно отклонен путем создания исключения FlowException. Этот метод подходит, когда производительность системы точно известна, например, когда точный уровень воды в системе определяется путем измерения давления.
Warm Up
- Режим прогрева (RuleConstant.CONTROL_BEHAVIOR_WARM_UP), то есть режим прогрева/холодного запуска. Когда система находится на низком уровне воды в течение длительного времени, когда поток внезапно увеличивается, прямое подтягивание системы к высокому уровню воды может мгновенно привести к перегрузке системы. Благодаря «холодному запуску» проходящий поток медленно увеличивается и постепенно увеличивается до верхнего предела порога в течение определенного периода времени, давая холодной системе время прогрева, чтобы избежать перегрузки холодной системы.
расстановка
- Метод равномерной организации очереди (RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER) будет строго контролировать интервал времени прохождения запроса, то есть давать запросу проходить с равномерной скоростью, что соответствует алгоритму дырявого ведра
правила перехода на более раннюю версию
- RT : (среднее время ответа в секундах) Среднее время ответа превышает пороговое значение, а количество запросов, переданных в течение временного окна, составляет >=5, два условия выполняются одновременно, и запускается период окна перехода на более раннюю версию, чтобы закрыть автоматический выключатель
- Аномальная пропорция: (второй уровень) Когда QPS >=5 и ненормальная пропорция (статистика второго уровня) превышает пороговое значение, срабатывает даунгрейд; по истечении временного окна понижение отключается
- Количество исключений: (минутная статистика) При превышении порога срабатывает даунгрейд, по истечении временного окна даунгрейд отключается
системные правила
Правила защиты системы контролируются по входящему трафику на уровне приложения, а индикаторы приложений отслеживаются по нагрузке, использованию ЦП, среднему RT, входящему количеству запросов в секунду и количеству одновременных потоков одной машины, чтобы система могла работать со скоростью максимальная пропускная способность, насколько это возможно, при обеспечении общей стабильности системы
Правила защиты системы применяются к общему измерению, а не к измерению ресурсов, и действуют только на входящий трафик. Входящий трафик относится к входящему в приложение трафику, например запросам, полученным веб-службами или серверами Dubbo, которые все являются входящим трафиком.
Система поддерживает следующие режимы
- Адаптация нагрузки: нагрузка системы1 используется в качестве эвристического индикатора для точной настройки защиты системы. Защита системы сработает, когда загрузка системы1 превысит эвристическое значение, а текущее количество одновременно работающих систем превысит расчетную емкость системы.
- Загрузка ЦП: активировать защиту системы, когда загрузка ЦП системы превышает пороговое значение.
- Средняя RT: срабатывает, когда средняя RT всего входящего трафика на одном компьютере достигает порогового значения в миллисекундах.
- Количество одновременных потоков: когда количество одновременных потоков всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы.
- Ingress QPS: Когда количество запросов в секунду всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы.
Для системы:
Ограничение тока ключа точки доступа
Что такое точка доступа: точки доступа — это часто используемые данные. Много раз мы хотим подсчитать наиболее часто используемые данные Top Key в данных точки доступа и ограничить их доступ:
Например:
- Идентификатор продукта используется в качестве параметра для ограничения наиболее часто приобретаемых идентификаторов продуктов в течение определенного периода времени.
- Идентификатор продукта используется в качестве параметра для ограничения идентификаторов пользователей, к которым часто обращаются в течение определенного периода времени.
метод:
@GetMapping("/testB")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testB() {
return "----testB";
}
//兜底方法
public String deal_testHotKey(String p1, String p2, BlockException exception) {
// sentinel的默认提示都是: Blocked by Sentinel (flow limiting)
return "----deal_testHotKey, o(╥﹏╥)o";
}
Установить ограничение тока на 1 секунду
Понижение сервисного автоматического выключателя
- Помимо управления потоком, слияние и понижение версии нестабильных ресурсов в вызывающем канале также является одной из важных мер по обеспечению высокой доступности. Служба часто вызывает другие модули, которые могут быть другой удаленной службой, базой данных или сторонним API. Например, при совершении платежа может потребоваться удаленный вызов API, предоставляемого UnionPay, для запроса цены определенного товара может потребоваться запрос к базе данных. Однако стабильность этой зависимой службы не гарантируется. Если зависимая служба нестабильна и время ответа на запрос становится больше, время ответа метода, вызывающего службу, также становится больше, потоки будут накапливаться, и в конечном итоге пул потоков самого бизнеса может быть исчерпан, и служба сам тоже изменится. должен быть недоступен.
@SentineResource
- Регулирование по имени ресурса
@RestController
public class RateLimitController {
@GetMapping("/byResource")
@SentinelResource(value = "byResource",blockHandler = "handleException")
public CommonResult byResource() {
return new CommonResult(200,"按照资源名称限流测试",new Payment(2020L,"serial001"));
}
//兜底方法
public CommonResult handleException(BlockException exception) {
return new CommonResult(444,exception.getClass().getCanonicalName() + "\t 服务不可用");
}
}
- Ограничение трафика по URL-адресу
@GetMapping("/rateLimit/byUrl")
@SentinelResource(value = "byUrl",blockHandler = "handleException")
public CommonResult byUrl() {
return new CommonResult(200,"按照byUrl限流测试",new Payment(2020L,"serial002"));
}
- Пользовательский ограничитель тока
Добавить пользовательский класс
public class CustomerBlockHandler {
public static CommonResult handlerException(BlockException exception) {
return new CommonResult(444,"按照客户自定义限流测试,Glogal handlerException ---- 1");
}
public static CommonResult handlerException2(BlockException exception) {
return new CommonResult(444,"按照客户自定义限流测试,Glogal handlerException ---- 2");
}
}
новый интерфейс
//CustomerBlockHandler
@GetMapping("/rateLimit/customerBlockHandler")
@SentinelResource(value = "customerBlockHandler",
blockHandlerClass = CustomerBlockHandler.class, blockHandler = "handlerException2")
public CommonResult customerBlockHandler() {
return new CommonResult(200,"按照客户自定义限流测试",new Payment(2020L,"serial003"));
}
- Дополнительные способы аннотирования
постоянство правила
yml добавить в источник данных
datasource:
ds1:
nacos:
server-addr: 10.211.55.26:8848 #nacos
dataId: ${spring.application.name}
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
feign:
sentinel:
enabled: true #激活Sentinel 对Feign的支持
Реализует постоянство конфигурации Sentinel.
- личный блог:blog.yanxiaolong.cn/