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

文章目录

授权规则

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

防止绕过,请求我们的服务,对请求来源进行授权

1.对于我们客户端请求过来的资源,服务需要进行判断是浏览器还是网关

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


2.尝试在request请求头中加一个origin请求头,给网关加一个

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

java 复制代码
@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;
    }
}

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

yml 复制代码
 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

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

4.最后在Sentinel中配置授权规则只有网关过来才能访问

5.此时绕过网关访问,会发现被拦截


6.然后我们通过网关访问,因为在之前的配置类中加入了一个网关请求的过滤器

认证我们的请求加上一个叫authorization且值为admin的参数,否则拦截

过滤器代码

java 复制代码
    @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();
    }
}


总结:授权生效

自定义异常结果



自定义异常


最重要的两个接口:

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

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

规则持久化

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

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


对Sentinel推送规则进行监听,一旦发现变化,发送数据库(定时)

缺点:时效性较差 ,因为它是定时将规则保存在数据库中,比如你数据刚保存,然后你立马调用,此时就不会数据保存了;

将配置规则先推送到配置中心nacos之类的,然后我们的Sentinel客户端监听nacos,配置变更就会完成本地配置更新;------>本质上是利用nacos的监听特质

实现Push模式


相关推荐
沉下心来学鲁班3 小时前
初识DeepAgents搭建第一个智能体
人工智能·python·langchain
ctlover3 小时前
数据结构:树
数据结构·python
触底反弹4 小时前
🐍 Python 语法全景图:一个 print() 引发的深度探索
python
元Y亨H4 小时前
告别依赖地狱与打包崩溃:Python 项目环境治理与 PyInstaller 避坑实践
python
aramae5 小时前
Python 使用库:标准库与第三方库实战
服务器·开发语言·windows·python
IamZJT_5 小时前
Agent 系统工程 01|模型之外,Harness 到底该负责什么?
人工智能·python·程序员
沧海一笑-dj5 小时前
【Python】Python学习笔记-Python 核心基础
人工智能·python·ai·解释型语言
用户76855341255385 小时前
Python 并发怎么选?一篇讲清 threading、multiprocessing、asyncio 的边界
python
梦想不只是梦与想5 小时前
环境管理系统:Conda(一)
python·conda·环境隔离
计算机源码社5 小时前
基于K-Means聚类的新生儿败血症临床分型与可视化分析系统 基于数据挖掘的新生儿败血症生命体征时序走势与关联性可视化研究
大数据·hadoop·python·数据挖掘·数据分析·spark·毕业设计