• Sentinel黑白名单授权规则解读


    目录

    基本介绍 

    代码实战

    架构说明

    RequestOriginParser的实现类  

    网关添加请求头 

    配置授权规则


    基本介绍 

    授权规则可以对请求方来源做判断和控制。

    很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

    授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

    • 白名单:来源(origin)在白名单内的调用者允许访问

    • 黑名单:来源(origin)在黑名单内的调用者不允许访问

    来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

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

    比如我们希望控制对资源 test 的访问设置白名单,只有来源为 appAappB 的请求才可通过,则可以配置如下白名单规则:

    1. AuthorityRule rule = new AuthorityRule();
    2. rule.setResource("test");
    3. rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
    4. rule.setLimitApp("appA,appB");
    5. AuthorityRuleManager.loadRules(Collections.singletonList(rule));

    Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。

    1. public interface RequestOriginParser {
    2. /**
    3. * 从请求request对象中获取origin,获取方式自定义
    4. */
    5. String parseOrigin(HttpServletRequest request);
    6. }

     这个方法的作用就是从request对象中,获取请求者的origin值并返回。

    默认情况下,sentinel不管请求者从哪里来,返回值永远是default,也就是说一切请求的来源都被认为是一样的值default。因此,我们需要自定义这个接口的实现,让不同的请求,返回不同的origin

    代码实战

    架构说明

     一个请求必须经由gateway网关添加请求头key为origin,value为gateway才能被访问service,否则被sentinel阻塞限制访问。

    RequestOriginParser的实现类  

    再service服务中,我们定义一个RequestOriginParser的实现类:

    1. @Component
    2. public class HeaderOriginParser implements RequestOriginParser {
    3. @Override
    4. public String parseOrigin(HttpServletRequest request) {
    5. // 1.获取请求头
    6. String origin = request.getHeader("origin");
    7. // 2.非空判断
    8. if (StringUtils.isEmpty(origin)) {
    9. origin = "blank";
    10. }
    11. return origin;
    12. }
    13. }

    我们会尝试从request-header中获取origin值。  

    网关添加请求头 

    既然获取请求origin的方式是从reques-header中获取origin值,我们必须让所有从gateway路由到微服务的请求都带上origin头

    利用一个GatewayFilter来实现,AddRequestHeaderGatewayFilter。修改gateway服务中的application.yml,添加一个defaultFilter:

    1. spring:
    2. cloud:
    3. gateway:
    4. default-filters:
    5. - AddRequestHeader=origin,gateway
    6. routes:
    7. # ...略

    这样,从gateway路由的所有请求都会带上origin头,值为gateway。而从其它地方到达微服务的请求则没有这个头。

    配置授权规则

    添加一个授权规则,放行origin值为gateway的请求。

    SentinelHystrixresilience4j
    隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
    熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
    实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
    动态规则配置支持多种数据源支持多种数据源有限支持
    扩展性多个扩展点插件的形式接口的形式
    基于注解的支持支持支持支持
    限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
    流量整形支持预热模式、匀速器模式、预热排队模式不支持简单的 Rate Limiter 模式
    系统自适应保护支持不支持不支持
    控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统
  • 相关阅读:
    前端代码上线前验证whistle
    mac开始第一个electron项目
    Redis-cluster集群详细部署配置--有手就行
    中高级试题」:MVCC 实现原理是什么?
    java运算操作符示例大全
    Camtasia2023屏幕录制和视频剪辑标杆软件,制作微课/游戏视频必备工具
    物联网应用技术综合实训室解决方案
    SPA项目开发之登陆注册
    深度剖析商业智能BI中的多维分析
    Elasticsearch7.10.0安装
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/134078116