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算法在…

HTTP传输协议请求报文响应报文

一个完整的HTTP请求&#xff1a; 1 建立连接 -- 三次挥手 2 前端发送请求 3 后端返回响应 4 断开连接 -- 四次握手 一个完整的请求报文&#xff1a; 1 请求行 请求方式 例如get、post 请求路径 &#xff08;请求url&#xff09; 传输协议 2 请求头 一些本次请…

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

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

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

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

力扣75——双指针

总结leetcode75中双指针的算法题解题思路。 上一篇&#xff1a;力扣75——数组与字符串 以下代码大部分为本人所写&#xff0c;少部分为官方示例代码。 力扣75——双指针 1 移动零2 判断子序列3 K 和数对的最大数目4 盛最多水的容器1-4 解题总结 1 移动零 题目&#xff1a; 给…

设计模式-享元模式在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 浪潮,…

69. x 的平方根

69. x 的平方根 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示…

线段树模板+例题

线段树是一种二叉搜索数&#xff0c;一般用来实现动态的区间询问&#xff0c;与树状数组有相似之处&#xff0c;但是能用树状数组实现的操作都能用线段树实现。 一般线段树用于以下几种操作&#xff1a; 建树&#xff0c;单点修改&#xff0c;区间查询&#xff0c;区间修改。…

VSCode 常用插件集合

目录 一、基础插件二、AI三、Rust插件 一、基础插件 Chinese (Simplified) (简体中文) 此中文&#xff08;简体&#xff09;语言包为 VS Code 提供本地化界面。 Native Debug 本地VSCode调试器。 CodeLLDB 一个由LLDB提供支持的本地调试器。调试c&#xff0c; Rust等编译语言…

【Android实现 资源路径/手机内存/网络文件 下的视频播放】

业务场景&#xff1a;安卓实现播放视频的功能&#xff0c;支持播放不同类型资源下的视频&#xff0c;下面在使用中封装了一个方法&#xff0c;可以根据需要修改调用 一、直接上封装方法 void videoReady(String videoPath ,String videoType){switch (videoType) {case "…

使用ffmpeg合并视频遇到的坑

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