Sentinel授权规则与规则持久化

🌳🌳🌳🌳🌳🌳🌳

学习授权规则前,先想想SpringCloud Gateway的黑白名单,请求过网关,gateway会去鉴权。但如果有人把微服务信息泄露出去了呢?此时微服务直接暴露在外,绕过网关直接访问微服务,又该如何解决?

文章目录

  • 1、授权规则
  • 2、授权规则的代码实现逻辑
  • 3、自定义异常结果
  • 4、规则持久化
  • 5、push方式的实现

1、授权规则

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

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

在这里插入图片描述
例如,我们限定只允许从网关来的请求访问order-service,那么流控应用中就填写网关的名称。

在这里插入图片描述

2、授权规则的代码实现逻辑

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

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

但默认情况下,该方法都返回default,即不能分辨是来自网关的请求还是直接调用的请求。在微服务order中重写下这个方法的逻辑:

@Component
public class HeaderOriginParser implements RequestOriginParser {@Override    public String parseOrigin(HttpServletRequest request) {String origin = request.getHeader("origin");        if(StringUtils.isEmpty(origin)){            return "blank";    //origin为空,则返回blank    }       return origin;    //否则返回origin}
}

现在从网关和直接访问的请求头中都不带origin,无法分辨,但如果我让网关过来的请求头中带上origin,就可以分辨了。想加请求头,当然是网关的AddRequestHeader过滤器。

在gateway服务中,利用网关的过滤器添加名为gateway的origin头:

spring:cloud:    gateway:      default-filters:        - AddRequestHeader=origin,gateway # 添加名为origin的请求头,值为gateway

重启order和gateway。在Sentinel配置授权规则:

在这里插入图片描述

此时我用8088端口直接访问order服务,绕过网关:

在这里插入图片描述

再通过网关访问:

在这里插入图片描述

总结:Sentinel授权规则就是对请求的来源做一个限制。实现逻辑是请求头,而请求头可以用SpringCloud Gateway的过滤器来添加。

3、自定义异常结果

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方,而直接抛出异常信息,对用户很不友好,因此需要自定义异常的返回结果。

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

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

而BlockException包含很多个子类,分别对应不同的场景:

在这里插入图片描述

接下来在调用方order-service中定义类,实现BlockExceptionHandler接口,并借助instanceof来

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

添加一个流控规则,看下异常是否是自定义的:

在这里插入图片描述

4、规则持久化

之前定义的限流规则,在服务重启后就被清空了,这是因为这些规则存于内存中。Sentinel的控制台规则管理有三种模式:

  • 原始模式
  • pull模式
  • push模式

原始模式: 控制台配置的规则直接推送到Sentinel客户端,也就是我们的应用服务。然后保存在内存中,微服务重启则规则丢失

在这里插入图片描述

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

在这里插入图片描述

很明显,这种方式有时效性问题,数据持久化到本地文件,当规则更新,定时轮询到新规则前,规则缓存里还是旧的。

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

在这里插入图片描述
简单说就是:

- 原始模式:保存在内存
- pull模式:保存在本地文件或数据库,定时去读取
- push模式:保存在nacos,监听变更实时更新

三种方式的对比:

在这里插入图片描述

5、push方式的实现

接下来实现修改OrderService,让其监听Nacos中的sentinel规则配置。

  • 在order-service中引入sentinel监听nacos的依赖
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  • 在order-service中的application.yml文件配置nacos地址及监听的配置信息:
spring:cloud:sentinel:datasource:flow:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-flow-rulesgroupId: SENTINEL_GROUPrule-type: flow # 还可以是:degrade、authority、param-flow#如果还有其他类型的限流,下面继续和flow同级写degrade:nacos:server-addr: localhost:8848 # nacos地址dataId: orderservice-degrade-rulesgroupId: SENTINEL_GROUPrule-type: degrade

SentinelDashboard默认不支持nacos的持久化,需要修改源码。关于这个操作,跳另一篇【Sentinel规则持久化到nacos的实现(源码修改)】

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

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

相关文章

前端(八)——深入探索前端框架中的Diff算法:优化视图更新与性能提升

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;深入探索前端框架中的Diff算法&#xff1a;优化视图更新与性能提升 文章目录 前端框架中的Diff算法概述vue和react框架的diff算法React的diff算法&#xff1a;Vue的diff算法&#xff1a; Diff算法在…

基于深度学习的高精度课堂人脸检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度课堂人脸检测系统可用于日常生活中或野外来检测与定位课堂人脸目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的课堂人脸目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标…

C# 未提供必须形参对应的实参

这个问题是在写观察者模式中遇到的一个问题。 具体的代码可以到《设计模式&#xff08;十五&#xff09;之观察者模式》中下载&#xff0c;下边只是部分代码。 我在抽象类中定义了构造函数&#xff0c;代码如下&#xff1a; using System; using System.Collections.Generic;…

设计模式-享元模式在Java中的使用示例-围棋软件

场景 享元模式 简介 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。 例如在一个文本字符串中存在很多重复的字符&#xff0c;如果每一个字符都用一个单独的对象来表示&#xff0c;将会占用 较多的内存空间…

【案例教程】基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…

Vue中值的传递(父传子,子传父,子父同步)

1.父组件->子组件传递数据 ①父组件通过 v-bind: 属性绑定的形式&#xff0c;把数据传递给子组件 如果不需要动态绑定&#xff0c;则可以直接写number“张三” ②子组件中&#xff0c;通过props接收父组件传递过来的数据 2.子组件->父组件传递数据 1.在子组件中&#xf…

实现外部缓存-Redis

目录 实现 RedisTemplate RedisTemplate的序列化 RedisSerializer 创建Redis缓存配置类 测试使用 创建配置类 创建注解测试实体 创建配置文件 创建单元测试类进行测试 实现 RedisTemplate XXXTemplate 是 Spring 的一大设计特色&#xff0c;其中&#xff0c;RedisTe…

【基础算法】——双指针算法

文章目录 一、算法原理二、算法实战1. 力扣283 移动零2. 力扣1089 复写零3. 力扣15 三数之和4. 力扣18 四数之和 三、总结 一、算法原理 双指针算法是指在遍历对象的过程中不是普通的使用单个指针进行访问&#xff0c;而是使用两个相同方向(快慢指针)或者相反方向&#xff08;…

Tomcat服务器下载安装及配置教程(IDEA中使用Tomcat)

目录 友情提醒第一章、Tomcat下载与安装1.1&#xff09;Tomcat介绍1.2&#xff09;官网下载 第二章、Tomcat配置环境变量2.1&#xff09;windows环境变量配置2.2&#xff09;验证Tomcat配置是否成功2.3&#xff09;报错解决 第三章、IDEA整合Tomcat3.1&#xff09;打开IDEA开发…

【深度学习笔记】随机梯度下降法

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

springboot项目创建整个完成过程和注意事项

1&#xff1a;application.yml文件配置 server:port: 8088servlet:context-path: /test spring:datasource:name: text #????url: jdbc:mysql://localhost:3306/dsdd?serverTimezoneGMT&useUnicodetrue&characterEncodingutf-8&useSSLtrueusername: root #…

Rust 数据类型 之 结构体(Struct)

目录 结构体&#xff08;Struct&#xff09; 定义与声明 结构体定义 结构体实例 结构体分类 单元结构体&#xff08;Unit Struct&#xff09; 元组结构体&#xff08;Tuple Struct&#xff09; 具名结构体&#xff08;Named Struct&#xff09; 结构体嵌套 结构体方法…

【后端面经】前言汇总(0)

文章目录 一、机会是留给有准备的人二、课程设计第一部分:微服务架构第二部分:数据库与 MySQL第三部分:消息队列第四部分:缓存所谓缓存用得好,性能没烦恼。第五部分:NoSQL三、总结一、机会是留给有准备的人 近两年互联网行业增速放缓,ChatGPT 又引发了一波新的 AI 浪潮,…

使用ffmpeg合并视频遇到的坑

下面以Linux环境介绍为主 1.ffmpeg可执行命令不同的环境是不同的&#xff0c;Linux在执行命令前还需要授权。 2.合并视频命令&#xff1a; 主要命令: {} -f concat -auto_convert 0 -safe 0 -i {} -y -c:v copy 坑一&#xff1a;其中第一个花括号替换的是可执行命令所在的…

【GitOps系列】使用Kustomize和Helm定义应用配置

文章目录 使用 Kustomize 定义应用改造示例应用1.创建基准和多环境目录2.环境差异分析3.为 Base 目录创建通用 Manifest4.为开发环境目录创建差异 Manifest5.为预发布环境创建差异 Manifest6.为生产环境创建差异 Manifest 部署 Kustomize 应用部署到开发环境部署到生产环境 使用…

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客&#xff1a;OpenCV实现将任意形状ROI区域置黑&#xff08;多边形区域置黑&#xff09; 比较常用的是使用 Rect 矩形实现该功能&#xff0c;代码如下&…

打造i-SMART智能网联平台,亚马逊云科技助力上汽快速出海

当前在各大外资车企不断加码在华投资之际&#xff0c;越来越多的中国汽车品牌纷纷开始走出国门&#xff0c;加速推进全球化业务&#xff0c;将赛道转至更为广阔的海外市场。 上汽海外出行科技有限公司&#xff08;简称“上汽海外出行”&#xff09;成立于2018年&#xff0c;承…

linux高并发web服务器开发(web服务器)18_函数解析http请求, 正则表达式,sscanf使用,http中数据特殊字符编码解码

pdf详情版 01 学习目标 编写函数解析http请求 ○ GET /hello.html HTTP/1.1\r\n ○ 将上述字符串分为三部分解析出来编写函数根据文件后缀&#xff0c;返回对应的文件类型sscanf - 读取格式化的字符串中的数据 ○ 使用正则表达式拆分 ○ [^ ]的用法通过浏览器请求目录数据 ○…

【unity之IMGUI实践】单例模式管理数据存储【二】

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

每日一题——迷宫问题(I)

迷宫问题——I 题目链接 思路 创建二维数组&#xff0c;并实现输入 首先输入二维数组的行和列&#xff1a; int n, m; scanf("%d%d", &n, &m);然后动态开辟二维数组&#xff1a; 注&#xff1a;对动态开辟还不太了解的同学可以看看&#x1f449;C语言—…