• 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 模式
    系统自适应保护支持不支持不支持
    控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统
  • 相关阅读:
    Python实现IP代理批量采集, 并检测代理是否可用 保存一下<嫖一波免费代理>
    No module named ‘torchvision.models.feature_extraction‘
    odoo17 web.assets_web.min.js 赏析
    探索经典算法:贪心、分治、动态规划等
    CommandInvokationFailure: Gradle build failed.
    使用mindspore低阶API训练每过一个epoch内存占用都会上升
    wps 开发插件
    闭包的优缺点
    一文带你用 Mac M1 跑 RocketMQ
    台湾大学神经网络架构设计
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/134078116