Правила точки доступа
Горячие точки — это данные, к которым часто обращаются. Во многих случаях мы хотим подсчитать данные Top K с наибольшей частотой доступа в определенных данных горячих точек и ограничить их доступ. Например:
Идентификатор товара — это параметр, который подсчитывает наиболее часто приобретаемые идентификаторы товаров в течение определенного периода времени и ограничивает его. Идентификатор пользователя — это
параметр
, который используется для ограничения идентификаторов пользователей, которые часто используются в течение определенного периода времени.
Текущее ограничение параметра точки доступа можно рассматривать как особый вид управления потоком, который вступает в силу только для вызовов ресурсов, содержащих параметры точки доступа.
Sentinel использует стратегию LRU для подсчета параметров точки доступа, к которым последний раз обращались, и сочетает алгоритм корзины маркеров для выполнения управления потоком на уровне параметров.
В настоящее время адаптер, поставляемый с Sentinel, имеет только параметры точки доступа для метода Dubbo. Другие модули адаптера (например, Web) по умолчанию не поддерживают правила точки доступа. Вы можете указать новое имя ресурса и передать нужные параметры, настроив метод встраивания.
Обратите внимание, что имя ресурса пользовательской встроенной точки не должно совпадать с именем ресурса, сгенерированным модулем адаптации, иначе это приведет к повторяющейся статистике.
Текущее ограничение параметра горячей точки вступает в силу через аннотацию @SentinelResource.
системные правила
Правила защиты системы контролируются входящим трафиком на уровне приложений, а данные приложений отслеживаются по четырем измерениям общей нагрузки, RT, входящего QPS и количества потоков на одном компьютере, так что система может работать на максимальная пропускная способность, насколько это возможно, при обеспечении общей целостности системы, стабильности.
Правила защиты системы применяют общее измерение, а не измерение ресурсов, и действуют только на входящий трафик. Входящий трафик относится к входящему в приложение трафику (EntryType.IN), например запросам, полученным веб-службами или серверами Dubbo, которые все являются входящим трафиком.
Системные правила поддерживают следующие типы порогов:
-
Нагрузка (действительно только для Linux/Unix-подобных машин): Защита системы сработает, когда загрузка системы1 превысит пороговое значение, а текущее количество одновременных потоков в системе превысит емкость системы. Емкость системы рассчитывается исходя из maxQps системы * minRt. Эталонное значение параметра обычно равно ядрам ЦП * 2,5. -
Загрузка ЦП (версия 1.5.0+): Когда загрузка ЦП системы превышает пороговое значение, срабатывает защита системы (диапазон значений 0,0–1,0). -
RT: Защита системы срабатывает, когда среднее значение RT всего входящего трафика на одном компьютере достигает порогового значения в миллисекундах. -
Количество потоков: когда количество одновременных потоков всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы. Ingress QPS: Когда количество запросов в секунду всего входящего трафика на одном компьютере достигает порогового значения, срабатывает защита системы.
Правила авторизации
Черный и белый список ограничивает передачу ресурса в соответствии с источником запроса ресурса.Если настроен белый список, может передаваться только источник запроса из белого списка, если настроен черный список, источник запроса в черный список не пройдет, а остальные запросы пройдут.
Информация о вызывающем абоненте передается через параметр origin в методе ContextUtil.enter(resourceName, origin).
Правила черного и белого списков (AuthorityRule) очень просты и в основном включают в себя следующие элементы конфигурации:
-
ресурс: имя ресурса, то есть объект текущего ограничивающего правила -
limitApp: соответствующий черный/белый список, разделенный , для разных источников, таких как appA, appB -
стратегия: режим ограничения, AUTHORITY_WHITE — режим белого списка, AUTHORITY_BLACK — режим черного списка, по умолчанию — режим белого списка.
Для входящего источника вы можете переписать метод получения источника, переписав интерфейс API, и можно использовать как параметры запроса, так и заголовки запроса.
Соответствующий код:
Класс реализации
import com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser;
import javax.servlet.http.HttpServletRequest;
/**
* @author issavior
*/
public class MyRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest httpServletRequest) {
// 请求头的key,根据key值获取value值,此value值会赋予origin,完成流控规则校验
return httpServletRequest.getParameter("service-name");
}
}
класс конфигурации
import com.alibaba.csp.sentinel.adapter.servlet.CommonFilter;
import com.alibaba.csp.sentinel.adapter.servlet.callback.WebCallbackManager;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.Filter;
/**
* @author issavior
*/
@Configuration
public class SentinelConfig {
@Bean
public FilterRegistrationBean<Filter> webCallbackFilter() {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new CommonFilter());
bean.addUrlPatterns("/*");
bean.addInitParameter(CommonFilter.WEB_CONTEXT_UNIFY, "false");
bean.setName("sentinelFilter");
bean.setOrder(1);
WebCallbackManager.setRequestOriginParser(new MyRequestOriginParser());
return bean;
}
}
Наконец, каждый раз, когда вы отправляете запрос, вы можете внести соответствующий ключ и соответствующее значение в параметры запроса или заголовок запроса~