• 【微服务|Sentinel】热点规则|授权规则|集群流控|机器列表


    热点规则

    热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

    商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
    用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
    热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

    Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。

    在这里插入图片描述

    目前 Sentinel 自带的 adapter 仅 Dubbo 方法埋点带了热点参数,其它适配模块(如 Web)默认不支持热点规则,可通过自定义埋点方式指定新的资源名并传入希望的参数。

    注意自定义埋点的资源名不要和适配模块生成的资源名重复,否则会导致重复统计。

    通过@SentinelResource注解使得热点参数限流生效。

    在这里插入图片描述

    系统规则

    在这里插入图片描述
    系统保护规则是从应用级别的入口流量进行控制,从单台机器的总体 Load、RT、入口 QPS 和线程数四个维度监控应用数据,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

    系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

    系统规则支持以下的阈值类型:

    • Load(仅对 Linux/Unix-like 机器生效):当系统 load1 超过阈值,且系统当前的并发线程数超过系统容量时才会触发系统保护。系统容量由系统的 maxQps * minRt 计算得出。设定参考值一般是 CPU cores * 2.5。
    • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0)。
    • RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
    • 线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
      入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

    授权规则

    黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

    调用方信息通过 ContextUtil.enter(resourceName, origin) 方法中的 origin 参数传入。

    黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:

    • resource:资源名,即限流规则的作用对象
    • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
    • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。
      在这里插入图片描述

    origin的传入,可通过重写API接口重写origin的获取方式,请求参数和请求头皆可。

    相关代码:

    实现类

    
    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");
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    配置类

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    最后在每次发送请求的时候,在请求参数或者请求头上带上对应key和对应value就可以了~

  • 相关阅读:
    Vue--》简易资金管理系统后台项目实战(前端)
    【Spring AOP】暴力打通两个切面之间的通信
    Java数据结构—优先级队列(堆)
    宝贝快出生的这三个表现,孕妈尽快去医院待产
    基于VUE + Echarts 实现可视化数据大屏销售大数据
    AWD思路
    用《斗破苍穹》的视角打开C#委托2 委托链 / 泛型委托 / GetInvocationList
    Qt MV架构-委托类
    Java 17的新特性
    Windows 虚拟地址 到底是如何映射到 物理地址 的?
  • 原文地址:https://blog.csdn.net/CSDN_SAVIOR/article/details/125478386