• 微服务11-Sentinel中的授权规则以及Sentinel服务规则持久化


    授权规则

    根据来源名称对请求进行拦截 ——>我们需要解析来源名称(RequestOriginParser默认解析都为default),所以我们要自定义一个实现类(根据请求头解析,给运行访问的来源+一个请求头

    防止绕过,请求我们的服务,对请求来源进行授权
    在这里插入图片描述
    1.对于我们客户端请求过来的资源,服务需要进行判断是浏览器还是网关

    自定义实现RequestOriginParser请求解析器来获取请求的来源

    在这里插入图片描述
    2.尝试在request请求头中加一个origin请求头,给网关加一个

    从网关来的请求就有这个请求头,而从浏览器来的就没有——>以此做一个区分

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

    3.对请求头进行资源处理后,还需要对gateway网关添加origin请求头中参数值,然后我们要通过网关路由userservice服务时,就会带origin请求头,在资源处理器进行处理时就会放行;

     gateway:
          routes:
            - id: user-service # 路由标示,必须唯一
              uri: lb://userservice # 路由的目标地址
              predicates: # 路由断言,判断请求是否符合规则
                - Path=/user/** # 路径断言,判断路径是否以/user开头,如果是则符合,跳转路由
     
            - id: order-service
              uri: lb://orderservice
              predicates:
                - Path=/order/**
              filters: # 过滤器添加一个请求头
                - AddRequestHeader=Truth,Itcast is freaking aowsome!
          default-filters: # 对所有路由生效
            - AddRequestHeader=origin,gateway #添加origin请求头,值为gateway
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    此时我们localhost:8081/user/1还是能够访问的,还没有配置授权规则

    4.最后在Sentinel中配置授权规则只有网关过来才能访问
    在这里插入图片描述
    5.此时绕过网关访问,会发现被拦截

    在这里插入图片描述
    6.然后我们通过网关访问,因为在之前的配置类中加入了一个网关请求的过滤器
    认证我们的请求加上一个叫authorization且值为admin的参数,否则拦截

    过滤器代码

        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            ServerHttpRequest request = exchange.getRequest();
            //1.得到request中的所有参数
            MultiValueMap<String, String> params = request.getQueryParams();
     
            //2.获取里面含有authorization的参数
            String auth = params.getFirst("authorization");
     
            //3.判断参数是否符合:authorization==admin
            if("admin".equals(auth)){
                return chain.filter(exchange);
            }
     
            //4.进行拦截,并且设置响应状态码
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述
    总结:授权生效

    自定义异常结果

    在这里插入图片描述
    在这里插入图片描述
    自定义异常
    在这里插入图片描述
    在这里插入图片描述
    最重要的两个接口:

    RequestOriginParser——>用来解析请求资源的(一般用于授权规则里头)

    BlockExceptionHandler——>用来处理异常(根据是限流异常还是热点参数异常还是降级异常。。。设置状态信息)

    在这里插入图片描述

    规则持久化

    场景:当我们的服务重启时,Sentinel会进行重启,服务会丢失

    原因:Sentinel的默认模式会将默认的规则放到内存中,所以会丢失

    在这里插入图片描述
    对Sentinel推送规则进行监听,一旦发现变化,发送数据库(定时)

    缺点:时效性较差,因为它是定时将规则保存在数据库中,比如你数据刚保存,然后你立马调用,此时就不会数据保存了;
    在这里插入图片描述
    将配置规则先推送到配置中心nacos之类的,然后我们的Sentinel客户端监听nacos,配置变更就会完成本地配置更新;——>本质上是利用nacos的监听特质

    实现Push模式

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    装饰器模式详解
    2023年浙江省内MBA项目报考选择策略分析
    QT not in executable format:file truncated
    阿里云服务器退款规则_退款政策全解析
    【CSharp】无符号短整型数组ushort[]转化为IntPtr
    MySQL备份与恢复
    手把手教学!新一代 Kaldi: TTS Runtime ASR 实时本地语音识别 语音合成来啦
    RISCV学习笔记7.12(开源虚拟机篇)--AlmaLinux虚拟机安装Questasim软件
    开发调试工具:USB转IIC/I2C/SPI/UART适配器模块可编程开发板
    pycharm如何远程连接服务器上的docker容器
  • 原文地址:https://blog.csdn.net/weixin_67201964/article/details/133802084