Sentinel授权规则和规则持久化

news2024/12/20 17:50:45

大家好我是苏麟 , 今天说说Sentinel规则持久化.

授权规则

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

授权规则

基本规则

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

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

 授权规则:

  • 资源名:就是受保护的资源,例如/order/{orderId}
  • 流控应用:是来源者的名单
  1. 如果是勾选白名单,则名单中的来源被许可访问。
  2. 如果是勾选黑名单,则名单中的来源被禁止访问。

比如:

我们允许请求从gateway到order-service,不允许浏览器访问order-service,那么白名单中就要填写网关的来源名称(origin)。

如何获取origin

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

public interface RequestOriginParser {
    /**
     * 从请求request对象中获取origin,获取方式自定义
     */
    String parseOrigin(HttpServletRequest request);
}
这个方法的作用就是从request对象中,获取请求者的origin值并返回。

默认情况下,sentinel不管请求者从哪里来,返回值永远是default,也就是说一切请求的来源都被认为 是一样的值default。

因此,我们需要自定义这个接口的实现,让不同的请求,返回不同的origin

例如order-service服务中,我们定义一个RequestOriginParser的实现类:

package cn.itcast.order;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.servlet.http.HttpServletRequest;

@Component
public class HeaderOriginParser implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest request) {
        // 1.获取请求头
        String origin = request.getHeader("origin");
        // 2.非空判断
        if (StringUtils.isEmpty(origin)) {
            origin = "blank";
        }
        return origin;
    }
}

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

给网关添加请求头

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

这个需要利用之前学习的一个GatewayFilter来实现,AddRequestHeaderGatewayFilter。

修改gateway服务中的application.yml,添加一个defaultFilter:


spring:
  cloud:
    gateway:
      default-filters: 
        - AddRequestHeader=origin,gateway

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

配置授权规则

接下来,我们添加一个授权规则,放行origin值为gateway的请求。

现在,我们直接跳过网关,访问order-service服务:

通过网关访问:

自定义异常结果

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。异常结果都是flow limmiting(限流)。这样不够友好,无法得知是限流还是降级还是授权拦截。

异常类型

而如果要自定义异常时的返回结果,需要实现BlockExceptionHandler接口:

public interface BlockExceptionHandler {
    /**
     * 处理请求被限流、降级、授权拦截时抛出的异常:BlockException
     */
    void handle(HttpServletRequest request, HttpServletResponse response,
                BlockException e) throws Exception;
}

这个方法有三个参数:

  • HttpServletRequest request:request对象
  • HttpServletResponse response:response对象
  • BlockException e:被sentinel拦截时抛出的异常

这里的BlockException包含多个不同的子类:

自定义异常处理

下面,我们就在order-service定义一个自定义异常处理类:

package cn.itcast.order;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response,
                       BlockException e) throws Exception {
        String msg = "未知异常";
        int status = 429;
        if (e instanceof FlowException) {
            msg = "请求被限流了";
        } else if (e instanceof ParamFlowException) {
            msg = "请求被热点参数限流";
        } else if (e instanceof DegradeException) {
            msg = "请求被降级了";
        } else if (e instanceof AuthorityException) {
            msg = "没有权限访问";
            status = 401;
        }
        response.setContentType("application/json;charset=utf-8");
        response.setStatus(status);
        response.getWriter().println("{\"msg\": " + msg + ", \"status\": " +
                status + "}");
    }
}

重启测试,在不同场景下,会返回不同的异常消息.

限流:

授权拦截时:

规则持久化

现在,sentinel的所有规则都是内存存储,重启后所有规则都会丢失。在生产环境下,我们必须确保这 些规则的持久化,避免丢失。

规则管理模式

规则是否能持久化,取决于规则管理模式,sentinel支持三种规则管理模式:

  • 原始模式:Sentinel的默认模式,将规则保存在内存,重启服务会丢失。
  • pull模式
  • push模式
pull模式

pull模式:控制台将配置的规则推送到Sentinel客户端,而客户端会将配置规则保存在本地文件或数据库 中。以后会定时去本地文件或数据库中查询,更新本地规则

push模式

push模式:控制台将配置规则推送到远程配置中心,例如Nacos。Sentinel客户端监听Nacos,获取配 置变更的推送消息,完成本地配置更新。

实现push模式

sentinel规则持久化.pdf (gitee.com)

这期就到这里 , 下期见 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下Jenkins自动化部署SpringBoot应用

Linux下Jenkins自动化部署SpringBoot应用 1、 Jenkins介绍 官方网址:https://www.jenkins.io/ 2、安装Jenkins 2.1 centos下命令行安装 访问官方,点击文档: 点击 Installing Jenkins: 点击 Linux: 选择 Red Hat/…

H3C IMC dynamiccontent.properties.xhtm 远程命令执行

我举手向苍穹,并非一定要摘星取月,我只是需要这个向上的、永不臣服的姿态。 构造payload: /imc/javax.faces.resource/dynamiccontent.properties.xhtml pfdrtsc&lnprimefaces&pfdriduMKljPgnOTVxmOB%2BH6%2FQEPW9ghJMGL3PRdkfmbii…

智慧公厕设备选型攻略,打造智能化便利生活体验

智慧公厕设备的选型对于打造智能化便利生活体验起着至关重要的作用。在不断提升城市品质的背景下,智慧公厕已成为城市建设中的一项重要内容。在选购智慧公厕设备时,我们需要考虑到不同版本的功能要求,确保公厕设备的质量和性能。本文以智慧公…

[代码随想录]回溯、贪心算法篇

文章目录 1.回溯算法1.1 77-组合1.2 216-组合的综合III1.3 17-电话号码的字母组合1.4 39-组合总和1.5 40-组合总和II1.6 131-分割回文串1.7 93-复原IP地址1.8 78-子集1.9 90-子集II1.10 491-递增子序列1.11 46-全排列1.12 47-全排列II1.13* 51-N皇后 2. 贪心算法2.1 455-分发饼…

QCC 音频输入输出

QCC 音频输入输出 QCC蓝牙芯片(QCC3040 QCC3083 QCC3084 QCC5181 等等)支持DAC、I2S、SPDIF输出,AUX、I2S、SPDIF、A2DP 输入 蓝牙音频输入,模拟输出是最常见的方式。 也可以再此基础上动态切换输入方式。 输入方式切换参考 sta…

设计模式:命令模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介: 命令模式,它是一种行为型设计模式,它尝试将请求或操作封装成对象,从而降低系统的耦合度,增加系统的可扩展性,并支持撤销、重做、事务等功能。 在命令模式中,请求被封装为一个独立的对象…

postgresql14-模式的管理(三)

基本概念 postgresql成为数据库管理系统DBMS,在内存中以进程的形态运行起来成为一个实例,可管理多个database。 数据库databases:包含表、索引、视图、存储过程; 模式schema:多个对象组成一个模式,多个模…

09-React路由使用(React Router 6)

9-React Router 6的使用 1.概述 React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件、钩子。react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM …

期中考misc复现

第一题 flow analysis 1 服务器附带的后门文件名是什么?(包括文件后缀) webshell是网站的后门,也是一个命令解释器。不过是以http协议这样的方式通信。继承了web权限 我们过滤http和https http && http.response.code…

机器学习中常见的特征工程处理

一、特征工程 特征工程(Feature Engineering)对特征进行进一步分析,并对数据进行处理。 常见的特征工程包括:异常值处理、缺失值处理、数据分桶、特征处理、特征构造、特征筛选及降维等。 1、异常值处理 具体实现 from scipy.s…

ant javac任务的fork和executable属性

ant javac任务是用于编译源文件的。 它的fork属性表示是否用JDK编译器在外部执行javac,取值可以为"yes"、“no”,默认值为"no"。 当fork属性的取值为"yes"时,可以用executable属性指明javac可执行文件的完全…

clion本地调试nginx-1.22.1

1 概述 nginx是一个多进程模型的流量代理软件,在本地调试时需要将它设置为单进程模式。 2 下载nginx源码 mkdir -p /opt/third-party cd /opt/third-party wget http://nginx.org/download/nginx-1.22.1.tar.gz tar xf nginx-1.22.1.tar.gz ls /opt/third-party…

Linux系统自有服务

一、Linux中防火墙firewalld 1、什么是防火墙 防火墙:防范一些网络攻击。有软件防火墙、硬件防火墙之分。 防火墙选择让正常请求通过,从而保证网络安全性。 Windows防火墙: Windows防火墙的划分与开启、关闭操作: 2、防火墙的作…

程序员提高效率的工具和习惯分享

文档待完善.... 思维方式 X-Y Problem | 酷 壳 - CoolShell 程序员如何把控自己的职业 | 酷 壳 - CoolShell 笔记软件 语雀:多平台,云同步,md文档,在线协作; 一键启动必要的软件:bat脚本 电脑重启后可以…

canvas保存画笔的状态到栈里面

可以将画笔不同时刻的状态记录下来,然后保存到一个栈里面存储,后面可以在栈里面恢复画笔的状态,继续使用之前的状态绘制,效果如下:将红色,蓝色,黄色的状态都存储起来了,然后逐个恢复…

chatGPT结构及商业级相似模型应用调研

GPT前言 说明 ChatGPT这项技术的历史可以追溯到2018年,当时由Facebook实验室的团队开发出该技术,以开发聊天机器人为目的。随后,ChatGPT在2019年由来自谷歌的DeepMind团队在国际会议ICLR上发表了论文,其中提出了ChatGPT的技术框架…

怎么将PNG, JPEG, GIF,BMP等格式图片转化为ICO格式文件?

小ICO格式文件是一种包含一个或多个小尺寸图片的图片文件,主要应用在Windows系统中。 方法一:用软件进行格式转换 Quick Any2Ico 「【木头分享】Quick_Any2Ico.exe」:https://pan.quark.cn/s/ecda58bb2bd0 Quick Any2Ico是一款大小仅600K…

【逆向】Base64编码解码及逆向识别

示例代码 注意:该示例代码仅为Base64编码实现的其中一种,实际分析样本的Base64编码实现并不一定与此代码相同,读者应重点理解其原理部分,而忽略其实现形式的不同。 View Code 逆向识别 1、编码识别 2、解码识别 总结 1、识别代…

大模型与知识图谱如何相互助力

目前各行各业在数字化、智能化发展的大势所趋下,信息新技术不断涌现,也在加快深入融合到传统实体行业应用中,比如知识图谱、人工智能、数字孪生等等,特别是基于人工智能的大模型在去年底被chatgpt的带领下涌现出一波又一波的浪潮&…

阶段六-Day04-MyBatis2

一、别名 Alias 1. 为什么使用别名 一般映射文件中会包含大量<select>标签, 每个<select>中都需要配置resultType"com.bjsxt.pojo.People"&#xff0c;MyBatis提供了别名机制可以对某个类起别名或给某个包下所有类起别名&#xff0c;简化resultType取值…